-
Notifications
You must be signed in to change notification settings - Fork 198
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
音声合成をキャンセル可能にする #64
Comments
実行中の音声合成を停止する方法は2つありそうです。 1つ目はeach_cpp_forwarder.dllの中身を変えて停止可能にする方法ですが、これは実装がlibtorchに依存しており、libtorchは計算の停止機能が(おそらく)無く、実装に工夫が必要であまり現実的ではありません。。 2つ目は、APIが実行されるたびにプロセスが立ち上がるようFastAPI(かuvicorn)の設定を変更し、キャンセルされたらプロセスごとkillする方法です。(無理矢理ですが・・・。) 他にもアイデアがあればぜひ! |
私なりに下調べした参考情報を、羅列してみます。実際に使えるかどうか、VOICEVOXとしての適合性に関してはひとまずおいておいて、ただ並べただけです。ご検討の参考として見てください。 以下の手法を使えば、アプリケーションの実装としてプロセス監視をする必要なく、ただ単に自死(sys.exit())すればrespawnしてサービス全体としては継続できるはずです。 FastAPI+Uvicorn+Gunicornという構成でマルチプロセスとプロセス監視(自動respawn)できるRunning with Gunicorn エンドポイントでRequestオブジェクトを受け取って、「Streamの途中でクライアント側からの切断」を検知するFastAPI:Using the Request Directly この場合クライアント側では、FetchAPI(ex. OpenAPI Generator / typescript-fetch)ですと、 |
@isnot なるほど、すごく合理的な方法だと思います! |
https://github.com/Hiroshiba/voicevox/issues/254 の続きです。
恐らくそうなりますね、失礼しました。 上で挙げられていた方法について調査してみました。 FastAPI+Uvicorn+GunicornこれはGunicornがwindowsでは動かないようなので難しそうです。
こちらのページでプロセスマネージャーがいくつか書いてあったので調査しました。 circushttps://github.com/circus-tent/circus その他、計算部分を別スレッド(や別プロセス)で動かしてそれを無理やり止める、という方法でも実装可能かもしれません(無理やりですが)。 Requestオブジェクトの受け取り
|
移動ありがとうございます。 なるほど、Gunicornはwindows非対応なんですね。残念です。 circusは・・・よくわからないですね・・・
こちらも良い方法に感じました!
ちょっとググってみたのですが、Requestが来る前段で頑張ればできるかも・・・? |
https://github.com/encode/uvicorn/blob/c67ffad08c555e1cfb9f8d7f6b88be46688fd730/uvicorn/main.py#L432
websocketでは使えそうですが、普通のhttpの接続では方法が見つかりませんでした。 |
なるほどーーー uvicornをコマンドライン経由で起動して
普通のhttp接続で使える方法ではないんですね、失礼しました。 |
そういえばこちらですが、ちょっとtime.sleepして |
実装するなら以下の感じでしょうか。
https://docs.python.org/ja/3/library/multiprocessing.html
ということなので、接続監視は別プロセスではなく別スレッドの方が良いでしょう。 ただ、少し気になる点があります。
|
処理の流れ、良さそうに感じました!! torch.multiprocessingは使わなくても可能だと思います(処理はDLL内にあり、pythonと完全に分離されていると思うので) よくよく考えてみると、process killしてコアを再起動しようとすると、initializeし直す必要がありそうな気がしてきました。 |
とりあえず自分なりに実装してみました。 別スレッドで通信の切断を監視するのはうまくいきませんでした...
この方法でも再度エンジンを作成する必要がありました。 |
おー!!!良い実装だと感じました!! ちょっとマイナーですがPythonにもFutureがあって、プロセスが稼働中かと計算結果の取得を1つのインスタンスで行なえます。 |
内容
フロント側では効率的な波形生成のため、ユーザの操作待機中に音声合成を始めており、ユーザがキャンセルしてもバックグラウンドで合成が続行されます。
それを避けるため、ユーザの操作に合わせてAPIで音声合成をキャンセルできるようにしたい。
参考: https://github.com/Hiroshiba/voicevox/issues/190
The text was updated successfully, but these errors were encountered: