Skip to content
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

連続再生中に、再生する前に音声を生成する #254

Closed
Hiroshiba opened this issue Sep 21, 2021 · 7 comments · Fixed by #1774
Closed

連続再生中に、再生する前に音声を生成する #254

Hiroshiba opened this issue Sep 21, 2021 · 7 comments · Fixed by #1774

Comments

@Hiroshiba
Copy link
Member

内容

いま連続再生すると、音声生成→再生→音声生成→再生が順次実行されます。
音声を再生している間に次の音声を生成すればスムーズに連続再生され、性能の良いPCだと待ち時間が0になると思います。

Pros 良くなる点

待ち時間が減る

実現方法

音声の取得関数と合成関数を分け、取得関数は合成が終わるまで待機するようにする・・・?

@takana-v
Copy link
Member

とりあえずengine側を思いつきで書いてみました。(なのでコード汚いです)
takana-v/voicevox_engine@a568575
一応mockでは動きました(voicevox_dirのパースでエラーが出たので本番の環境では未テスト)

今回はasyncioで書いてみましたがthreadingとか別の実装もできそうですね。
asyncioはblockingとか色々面倒なので、別の実装が好ましいと個人的には思います。

@Hiroshiba
Copy link
Member Author

VOICEVOX ENGINEは音声合成エンジンなので、合成した音声をキャッシュする機構は別にもたせたほうが良さそうに感じました。この機能をソフトウェア側に持たせるというのはどうでしょう・・・? @takana-v

@y-chan
Copy link
Member

y-chan commented Sep 22, 2021

音声を再生している間に次の音声を生成すれば

音声の取得関数と合成関数を分け、取得関数は合成が終わるまで待機するようにする・・・?

個人的にはAudioQueryが更新されたタイミングで、裏で生成してもっておくとかでも良さそうかなぁと思いました。
思いつきなので実装できるかは不明ですし、@takana-v さんが既に別のアプローチをされているところではありますが、ちょっと試してみようかと思います。

@Hiroshiba
Copy link
Member Author

@y-chan 面白い発想だと思います!!
文章を入力したあとにアクセントを良い感じにする過程で、AudioQueryが5回くらい生成されると思います。(アクセントフレーズのmerge/splitやアクセント変更など)
1回の音声合成に10秒かかるPCだと、数十秒待つ必要があるのでUX的に厳しいかもしれません。
この場合キャンセルができると良いかも・・・? https://github.com/Hiroshiba/voicevox_engine/issues/64

@takana-v
Copy link
Member

確かにキャッシュするのはエンジンではなくソフトウェア側で良さそうですね。
連続再生はここら辺だと思うのですが自分の技術力ではちょっと実装は難しそうですかね...
https://github.com/Hiroshiba/voicevox/blob/bb073b91de05ec47d1f03f12ccefc747c421d11b/src/store/audio.ts#L838-L855
@y-chan のAudioQueryが更新されたタイミングで...という実装で良いかと思います。

キャンセルに関して、https://github.com/Hiroshiba/voicevox_engine/issues/64 ではsys.exit()の例が挙げられていますが、これはあまり良くない実装に感じました。
一部の動画編集ソフトは直接apiを叩いており、キャンセルで全接続が切れてしまうのは好ましくないと思います。
ちなみに今回使ったfutureオブジェクトにもキャンセル機能があるので、一応実装可能です。
ただ、エンジンでキャッシュする形になってしまいますが...
(これ以上はhttps://github.com/Hiroshiba/voicevox_engine/issues/64 で話した方がいいかもしれません)

@Hiroshiba
Copy link
Member Author

そちらですね!あとはキャッシュがこの辺りです。
https://github.com/Hiroshiba/voicevox/blob/bb073b91de05ec47d1f03f12ccefc747c421d11b/src/store/audio.ts#L337

exit()はおそらくエンジン全体ではなく、マルチプロセスのうちの1つがexitするんだと思います!

@cm-ayf
Copy link
Contributor

cm-ayf commented Jan 28, 2024

こちら,現在試みています.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants