WORKS 一覧へ
AI / LLM × Motion × Voice

AvatarChat

話しかけると、アバターが表情と身体の動き、そして声で返してくる対話システム。 LLM・モーション生成・音声合成という 3 つの重い処理を 1 本のパイプラインにまとめ、 クラウド API を使わないフルオフライン構成でも動作するように設計しました。

PythonLLMthree.js FastAPITTS / ボイスクローンモーション生成
ROLE
個人開発(設計 / 実装すべて)
STACK
Python, FastAPI, three.js, PyTorch
COMPONENTS
LLM + モーション生成 + ローカル TTS
MODE
クラウド / フルオフライン 切替可
ユーザー入力 TEXT / VOICE LLM 応答文 + 感情ラベル MOTION GEN 感情に応じた身体動作 LOCAL TTS ボイスクローン音声 AVATAR three.js / ブラウザ描画
モーション生成と音声合成を並行させ、届いた順に再生してアバターへ反映する

概要

テキスト応答だけのチャットではなく、「返事の内容にふさわしい動きと声で応答するキャラクター」を 目指して作ったシステムです。会話の応答を生成する LLM、そこに紐づく身体動作を出すモーション生成、 そして音声を作る TTS を組み合わせ、ブラウザ上の three.js アバターに同時に反映します。

LLM はクラウド API とローカルモデルを切り替えられる構成にしており、TTS もローカルの ボイスクローンサーバーを常駐させているため、ネットワークに繋がっていない状態でも一連の会話が成立します

構成上の工夫

  • 重い処理を直列にしない:モーション生成と音声合成は依存関係がないため並行して走らせ、応答文が出た時点でアバター側の待ち時間を最小にする
  • 音声合成は非同期:ボイスクローンは生成に時間がかかるため、先にモーションと字幕を出し、音声が届いた時点で合流させる
  • サーバーを役割で分離:会話・描画を担うアプリ側と、音声合成の常駐サーバーを別プロセスにして、片方の再起動が全体を止めないようにする
  • 感情ラベルを橋渡しに使う:LLM の応答に感情ラベルを付けさせ、それをモーション生成側の条件入力として渡すことで、言葉と動きのトーンを揃える

研究とのつながり

アバターの動きには、研究で開発しているモーション生成モデルを 組み込んでいます。研究側で「キャラクターらしさ」と「感情」を分離して生成できるようにしているため、 同じ発話でもキャラクターごとに違う身振りをさせられる、という形で応用が効きます。

作りながら分かったこと:生成モデルの品質そのものより、 「応答が返ってくるまでの体感待ち時間」が対話の自然さを大きく左右しました。 モデルを軽くする以外に、出せるものから順に出す設計が効くという発見が、以降の実装方針になっています。

振り返り

研究成果を「動くアプリ」に落とし込むと、推論速度・プロセス管理・失敗時のフォールバックといった 研究コードでは表に出ない課題がまとめて現れます。それらを一つずつ潰した経験は、 モデルを作る力と、それを製品の形にする力の両方が必要だという実感につながりました。