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

連続再生中にバックグラウンドで音声を合成する #1774

Merged
merged 5 commits into from
Feb 20, 2024

Conversation

cm-ayf
Copy link
Contributor

@cm-ayf cm-ayf commented Jan 28, 2024

内容

連続再生中に,バックグラウンドで音声を合成します.これにより,合成速度が再生速度を上回る場合,連続再生は途切れなく再生されるようになります.

EventTargetを継承した管理クラスのインスタンスにより,「合成が完了したら,次の合成を発火して,さらに再生中の音声がなければ今できたものを再生する」といったような処理の集合として実装しています.かなり複雑になりましたが,うまく動いてくれるようになりました.

補遺

  • 最初のロードや,短い文の後に長い文が来て事前に合成が終わっていない場合など,どうしても待ち時間は存在します.ここではローディングのダイアログが出ます.

  • 停止ボタンは,再生中は押すことができます.しかし,バックグラウンドで合成しているものがあれば,それが合成し終わるまで操作できません.なお,合成が終わったら他に再生されることなく,操作が可能になります.

  • フローを表す図を置いておきます.
    image

    Mermaidのソース
    flowchart TD
      開始
      生成中/待機中
      生成中/再生中
      終了/再生中
      終了/終了
      次が生成済{次が生成済?}
      最後の生成{最後の生成?}
      最後の再生{最後の再生?}
    
      開始 --> 生成中/待機中
      
      生成中/待機中 -->|生成完了| 最後の生成
    
      生成中/再生中 -->|生成完了| 最後の生成
      生成中/再生中 -->|再生完了| 次が生成済
    
      終了/再生中 -->|再生完了| 最後の再生
    
      次が生成済 -->|true| 生成中/再生中
      次が生成済 -->|false| 生成中/待機中
    
      最後の生成 -->|true| 終了/再生中
      最後の生成 -->|false| 生成中/再生中
    
      最後の再生 -->|true| 終了/終了
      最後の再生 -->|false| 終了/再生中
    

関連 Issue

ref: #1773 (このPRの後にmergeする必要があります)
closes: #254

スクリーンショット・動画など

(録画方法の都合で,音と画が若干ずれています)

video1038941970.mp4

その他

@cm-ayf cm-ayf requested a review from a team as a code owner January 28, 2024 10:01
@cm-ayf cm-ayf requested review from Hiroshiba and removed request for a team January 28, 2024 10:01
@cm-ayf cm-ayf changed the title Play continuous background generate 連続再生中にバックグラウンドで音声を合成する Jan 28, 2024
@cm-ayf cm-ayf force-pushed the play-continuous-background-generate branch from 13ec568 to b0e6ef1 Compare January 28, 2024 23:22
@cm-ayf
Copy link
Contributor Author

cm-ayf commented Jan 28, 2024

コンフリクトなかったのでforce-pushしました

@cm-ayf cm-ayf force-pushed the play-continuous-background-generate branch from b0e6ef1 to 9450beb Compare January 31, 2024 12:53
@cm-ayf cm-ayf force-pushed the play-continuous-background-generate branch from 9450beb to b4993b3 Compare February 12, 2024 13:40
@cm-ayf
Copy link
Contributor Author

cm-ayf commented Feb 12, 2024

#1773 がmergeされたのでrebaseしました.

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

generate系とplay系を分けて直列じゃなくしつつ、eventドリブンにする感じですよね!!
なるほどです!!

audioContinuousPlayer.tsの設計について提案(相談?)が!!

現状のコードだと、Player側がどの状態からどの状態への遷移を担っていて、どの変更を外部に依存するのかちょっと見えづらいかもと思いました。
(おそらくgenerateStart→EndとplayStart→Endの遷移がPlayer外の処理依存)

いっそFETCH_AUDIOとPLAY_AUDIO_BLOBをDI可能にし、全状態遷移をPlayer内で可能にするとかどうでしょう?
こうすればaudio.ts側はただlistenして表示変えれば良いだけにできそうだな~と。
(DIする関数の型はそのままだとちょっと密結合になりそうな気もしますが・・・。)

その場合もはやPlayerじゃないのですが、まあ・・・!

@cm-ayf cm-ayf force-pushed the play-continuous-background-generate branch from ef59ee6 to 8760370 Compare February 14, 2024 22:15
Copy link
Contributor Author

@cm-ayf cm-ayf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こんな感じでしょうか.commitdispatchのうち必要なものだけがあればいいように型を決めてあります(これが正しいのかはよくわからないのですが……)

@Hiroshiba
Copy link
Member

Hiroshiba commented Feb 18, 2024

@cm-ayf
あ! 音声の取得と再生に関わる部分だけのDIをイメージしてました!
なのでFETCH_AUDIOPLAY_AUDIO_BLOBだけDIする感じとか・・・!

切り出しがきれいなので、密結合の回避もできるのではと期待している感じです!

@cm-ayf cm-ayf force-pushed the play-continuous-background-generate branch from 8760370 to 7243a5e Compare February 19, 2024 02:35
@cm-ayf
Copy link
Contributor Author

cm-ayf commented Feb 19, 2024

そのようにしました.
// EventTarget(やnode:events)は同じイベントを複数の関数で聴けるので,そこの分離をしやすいなぁと思っています.

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!

とてもきれいなクラス切り出しだったと思います、ありがとうございます!!!
もしよかったら別タスクにも挑戦してみて頂ければ嬉しいです!!!

まだまだ少ないのですが、リファクタリング関連のタスクをこちらにまとめてみています。

Vueに触れてみる感じだとSettingDialog.vueでコピペされてる部分をv-forにするとか。
(もしwebフレームワークに触れたことない感じでしたら、VueやReactはだいぶ面白いと思います!!)

Vue関係ないところだと、かなり大変だと思うけどこちらとか・・・!

もしよかったらぜひ!! 🙇

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こういう形にもできるかな?と少し変えさせていただいたので、pushさせて頂いてマージしたいと思います 🙇
変更点は主に2つです!

  • audioContinuousPlayer.tsから他のstoreへの依存をなくす
  • 必要な関数2つをDIする形へ

src/store/audioContinuousPlayer.ts Outdated Show resolved Hide resolved
src/store/audioContinuousPlayer.ts Outdated Show resolved Hide resolved
@Hiroshiba
Copy link
Member

問題なさそうだったらマージします!

@cm-ayf
Copy link
Contributor Author

cm-ayf commented Feb 20, 2024

ありがとうございます,これで大丈夫です!
色々提案くださってありがとうございました.

@Hiroshiba
Copy link
Member

こちらこそありがとうございました!! もしよかったらまたぜひ!!!

@Hiroshiba Hiroshiba merged commit 8bb3f42 into VOICEVOX:main Feb 20, 2024
9 checks passed
@cm-ayf cm-ayf deleted the play-continuous-background-generate branch February 20, 2024 04:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

連続再生中に、再生する前に音声を生成する
2 participants