-
Notifications
You must be signed in to change notification settings - Fork 200
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
windowsでエンジンの多重起動を可能にする(openjtalkによるエラーを出なくする) #1347
Comments
@takana-v @sabonerune ちょっとメンションすみません!! |
FastAPIにteardown的なフックってないんですかね?それで消すとかどうでしょう。(AIVoiceVoxだとctrl-cのフックで後処理をしていてちゃんと動いているので、多分FastAPIのteardownも呼ばれるはず) |
https://fastapi.tiangolo.com/advanced/events/#lifespan voicevox_engine/voicevox_engine/app/application.py Lines 54 to 57 in 81a9360
lifespanで終了時のクリーンアップができます( しかしエディタは 起動時にコンパイル済みの辞書を書き込むディレクトリを空にするという手もあると思います。 #620 (comment)
|
@sevenc-nanashi それプラスtmpディレクトリに保存する形であればまあ残っちゃっても良いかって感じなんですが、次は環境によってはtmpディレクトリへのファイルmvができずatomic操作ができないという問題が・・・・・・・・ あれ、もしかしてatomic操作いらなくなった????
自分もこれ考えたんですが、わざと2つ起動する人とかもいる気がするんですよね〜・・・。 |
今のとこまとめると、こう? 今のmainの実装 OSErrorを握りつぶす場合 コンパイル済み辞書の名前をN個用意し、1つずつ使えるか試していく コンパイル済み辞書の名前をランダムにし、teardownで消す コンパイル済み辞書の名前をランダムにし、エンジン起動時に全ファイル消す コンパイル済み辞書の名前をランダムにし、tmpディレクトリに保存して、teardownで消す |
Linuxの場合開いているファイルを削除しても問題ないのではと思います。 |
@sabonerune まあ大丈夫かもなのですが、あんまりOSやライブラリやファイルシステムの(隠れ)仕様に頼った実装にしない方が良いかなぁと。 とはいえエディタ側にsignal実装もちょっと大変そうではあるんですよねぇ。。 うーーーーーーーーーん。ラウンドロビンもどきとかぁ・・・? |
これ本当です?AIVoiceVoxのteardown(ctrl-cハンドル)はちゃんと動いてるので動くと思いますが
tree-killってシグナル指定できませんでしたっけ?一回SIGINT送って10秒後にSIGKILLみたいなことできそうな気が。 |
@sevenc-nanashi とりあえずコード追っかけてみました。 エディタ側では なのでwindowsなら即強制終了・・・という理解で合ってるはずなんですが、まだ未知ななにかがあるかもですねぇ。 |
なるほどー。 となるとこれを再Openしてもいいかも? |
@sevenc-nanashi VOICEVOX/voicevox#1540 は・・・うーん、1つのWebAPIとしては強力すぎると思うんですよね・・・。 |
とりあえず候補が決まってない状況なのが一番もったいない気がしました! まず現状、エディタはどうやらSIGTERMをエンジンに送っているっぽいことがわかっているためです。 あとこの方法であれば、最悪問題がほぼ無いと思います。 設計としてはこうでしょうか?
|
#1248 (comment) POSIXの方はTreeKillのシグナルを |
@sabonerune ここでSIGINTもTERMもBREAKも同じ用に
実際linux環境でSIGTERM(たぶんあたい何もなくkillすればよいだけ)してuvicornがgraceful shutdownしてそうか確かめると良さそう? |
@Hiroshiba ただ、 |
以前の話だとなぜか呼ばれたという感じだった記憶がありますが、まあ、呼ばれない前提で考えるのが良さそう。 そうなると #1347 (comment) の方法ではtmpに辞書が残り続けてしまう前提で良さそう。流石にそれは微妙そうに感じます。 とりあえずこのissueの解決策としては、ワークアラウンドですが↓の方法が良さそうかなと思いました。
候補のファイルを5つくらい持っておいて、順に開いていって開けなかったら次のを試す、という感じをイメージしています。 別件で、正常終了させる方法はほんとに難しいですね。。。 |
内容
windows環境で、エンジンを2つ起動するとopenjtalk周りでエラーが出ます。
pyopenjtalk.set_user_dict`したものはopenjtalk側でずっとファイルハンドラが必要で、同じファイルに書き込めないためです。
voicevox_engine/voicevox_engine/user_dict/user_dict.py
Line 159 in 1269fab
この辺りを、ユーザーにバグだと思われることなく解決したいです。
Pros 良くなる点
エディタ側でエンジンがなぜか消えずに残っていることが結構あり、エディターを起動した時にエンジンがエラーになるのを防げる。
あと開発段階でエンジンを複数起動できるようになる。
Cons 悪くなる点
完璧な実装方法が思いついてない
実現方法
コンパイルしたユーザー辞書を
set_user_dict
してるので、そのコンパイル済みの辞書のパスをランダムにすれば一応問題は解決されるはず。ただそうすると辞書を更新するたびに、あるいはエンジンが起動するたびに新しいファイルが生まれて残り続けてしまいます。
迂回作としては、ちょっと雑なアイデアだけど、
compiled-0.dic
~compiled-4.dic
まで空いてるパスを探すとか・・・?その他
#1332 (comment) で整理したメモをこちらにも転機します:
update_dict
、つまり保存した辞書などをopenjtalkに読み込ませる部分で、多重起動している場合にエラーになるpyopenjtalk.set_user_dict
したものはopenjtalk側でずっとファイルハンドラが必要で、同じファイルに書き込めないからThe text was updated successfully, but these errors were encountered: