LLMキャラチャットのTTS応答速度を上げる方法をちょっと考えていた。
フィラーを自動挿入する方法はありがちなんだけど、フィラーを含めての台詞生成だろ、と思うのでそれは避けたい。
そこで、「生成された台詞の最初の句読点までをフィラーと見做して、先に音声合成する」という案(実は以前から考えてた)を実装した。
「はい、よろこんで、やらせていただきます。」
という台詞がLLMで生成されたなら、
「はい、」の音声をまず生成し、「よろこんで、やらせていただきます。」を音声生成キューに入れる感じ。
これはまあまあイイ感じだ。ストリーム生成される台詞をストリームのままTTSに送る仕組みに今はなってないんで、これでは若干の遅延はあるけど、それでも台詞生成が律速だから十分効果ある。採用。
この場合だと「はい、」という音声データを生成したらキャッシュして次回からキャッシュを利用することで、応答速度を更に上げることも考えられるけど、TTS側が決定論的に音声を生成するならまだしも、AI生成なら毎回違う音声データが得られるんだし、キャッシュしない方が良いと思う。
このキャラチャットシステムは、kv cacheを使っていてChatGPT並に応答が早いので、せっかくだから、音声応答も早くしたかったというのがあった。だいぶ早くなって満足。あとストリーム生成もさくっと実装したいところ。ちょっと作り的にめんどさがあって、滞ってるが。
AIキャラチャットで一番大切なのは、応答速度ではない、という結論に至りつつある。チャットをターン制バトルじゃなくて、アクティブタイムバトルにするのが、たぶん一番大事だ。
チャットをターン制としてpull的、同期的に処理しようとするから、応答速度が気になってしまうんだろう。でも、会話って必ずしも「応答」するもんじゃないし、即座の「応答」があると会話っぽいかというと、そんなことも無い。応答速度を気にするあまり、フィラーを機械的に挿入して、いかにも機械との会話っぽくなってしまって本末転倒状態まである。
任意のタイミングで、こちらの話がそれなりの時間内に相手に伝わり、任意のタイミングで相手の話がこちらに伝われば、会話は成立するんだ。我々は普通にそれくらいの遅延があるボイスチャットを人間同士でもやってるわけで。
これ、できた。LLMがストリーム生成した台詞が、適度な長さ(フィラーに限り、最初の句読点まで)になったらその時点で即、TTSの生成キューに入れて、音声合成できたものから即再生。
今のところ理論上、音声応答速度は最速になったはず。良き。