x.com/tegnike/status/186916629
realtime APIめっちゃ速くていいな。マルチモーダルモデルには応答速度ではどうやったって勝てん。

音声合成AIは「はい、今日もいい天気ですね」というプロンプトで、「はい、今日もいい天気ですね」という音声を出力出来るのに対して、マルチモーダルLLMだと、「おはようございます」というプロンプトで、「はい、今日もいい天気ですね」という音声を出力するわけだから、まあチートだよな。

でも羨ましいから、可能な限り努力はするんや。
以前考えた、投機的音声合成法をもっと投機的にやりたい。

音声認識をもっと細切れにやる。
「おはよう、元気かい?」みたいな入力の場合、「おはよう、」でもう音声認識をかけてしまい、後続のユーザーの台詞までLLMで適当に補完し、AIの台詞の冒頭部分をそれに続く形で推論し、音声合成までやってしまう。

ユーザーの発声が終了したら、即、生成済みのAIの音声を再生しつつ、ユーザーの声を音声認識し、ユーザーの台詞完全版をプロンプトとして得る。

既に生成済みのAIの台詞の冒頭部分をpredicted outputとして、AI台詞をLLMで推論する。

predictが当たってたらラッキー、生成済みのAI音声に続く音声を合成して、再生中の音声に続けて再生する。

predictがはずれたら、再生中の音声をフェードアウトして、AI台詞全体を合成しなおし、再生する。

投機的というか、言い直しを許容する感じ。まあそれも人間ぽくて逆にいいかも。

音声入力じゃなくて文字入力の場合は、入力中のテキストボックスの文字列を、裏で勝手に補完して、同じことをやる。なに、ローカルなので遠慮は要らない。

predicted outputをllama.cppで実現する方法がよく分からないので、今は実装できないけどね。

他の方法としては、predicted outputではなく、確定outputとしてしまう。つまり、ユーザー台詞を補完したものに対するAIの返答の冒頭部分を、正解としてそのままプロンプトに載せ、後続を推論する方式。この方式だと回答が不自然になる可能性も出てくるけど、キャラチャットなんて、それくらいの不自然さを許容しても別に構わんと思う。

この手法だとAIの応答速度は、まるでリアルタイムに会話してるレベルまでいくんじゃないかな。会話精度はともかく。

逆に(逆に?)ユーザーの発言を最後まで聞かずに、勝手にユーザーの言うことを想像して、それに対する返答を、ユーザーがまだ喋ってるのに被せてくるキャラとか、萌え要素ですらあるかもしれない。

AIチャットはターン制バトルじゃなくてアクティブタイムバトルだ、というのが持論だけど、いうてアクティブタイムバトルも行動が同時に発生することはない以上、疑似リアルタイムでしかない。

しかし音声会話ならば、自分と相手が同時に喋る状況も当然あるので、アクティブタイムバトル的処理では不十分、キャラが同時にリアルタイムに動く、アクションゲーム的な処理が必要になると思う。

リアルタイムで並列的に行われる音声会話を、シーケンシャルな推論を行うLLMでエミュレートするのは、結構な困難を伴うと思う。

自分が話したこと(output)が単調増加するだけじゃなく、相手が話したこと(prompt)もリアルタイムに変動するという状況になるので、推論効率や精度が落ちる。そこをいかに落とさずに行うかがポイントになるだろうな。

フォロー

真にリアルタイム性を有した音声会話の実装は、さすがにv-next案件だな。まずはチャットと、疑似リアルタイムの音声チャットが精度よくできることを優先。

ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。