概要
テキスト応答だけのチャットではなく、「返事の内容にふさわしい動きと声で応答するキャラクター」を 目指して作ったシステムです。会話の応答を生成する LLM、そこに紐づく身体動作を出すモーション生成、 そして音声を作る TTS を組み合わせ、ブラウザ上の three.js アバターに同時に反映します。
LLM はクラウド API とローカルモデルを切り替えられる構成にしており、TTS もローカルの ボイスクローンサーバーを常駐させているため、ネットワークに繋がっていない状態でも一連の会話が成立します。
構成上の工夫
- 重い処理を直列にしない:モーション生成と音声合成は依存関係がないため並行して走らせ、応答文が出た時点でアバター側の待ち時間を最小にする
- 音声合成は非同期:ボイスクローンは生成に時間がかかるため、先にモーションと字幕を出し、音声が届いた時点で合流させる
- サーバーを役割で分離:会話・描画を担うアプリ側と、音声合成の常駐サーバーを別プロセスにして、片方の再起動が全体を止めないようにする
- 感情ラベルを橋渡しに使う:LLM の応答に感情ラベルを付けさせ、それをモーション生成側の条件入力として渡すことで、言葉と動きのトーンを揃える
研究とのつながり
アバターの動きには、研究で開発しているモーション生成モデルを 組み込んでいます。研究側で「キャラクターらしさ」と「感情」を分離して生成できるようにしているため、 同じ発話でもキャラクターごとに違う身振りをさせられる、という形で応用が効きます。
振り返り
研究成果を「動くアプリ」に落とし込むと、推論速度・プロセス管理・失敗時のフォールバックといった 研究コードでは表に出ない課題がまとめて現れます。それらを一つずつ潰した経験は、 モデルを作る力と、それを製品の形にする力の両方が必要だという実感につながりました。