Live2DアバターとChatGPTで音声対話型のAIエージェントをつくる
https://gyazo.com/962db86ece34dbb6fe3f2a128a91a705
はじめに
ChatGPTとWhisperをつかうと手軽に音声対話型のAIエージェントをがつくれることは、これまでに下記で示しています。
MycobotをChatGPTで操作
Whisper + ChatGPT + ECHONET Lite で家電操作する音声アシスタント
このページではAIエージェントとLive2Dで作成した身体を紐づけ、キャラクター型のデスクトップエージェントを構築するためのメモを示します。詳細を希望する方はヤマザキまで。加筆します。
0. ゴール
マイク録音 → Pythonサーバー(/process)に送信 → STT→ChatGPT→TTS → Unityで再生
TTSのAudioSourceに合わせて 口パク(ParamMouthOpenY)
口パク強度(TalkActivity)で 手パタパタ/肩ボブ/眉・笑顔/首ふり など可愛い相槌
code:大まかな流れ
ユーザー音声入力
↓
SST: Speach-To-Text
マイク入力(録音)
↓
Whisper(音声認識 Speach-To-Text: SST)
↓
テキスト(発話内容)
↓
対話AI(ChatGPT)
↓
テキスト(応答)
↓
TTS: Text To Speach
音声合成(Text-to-Speech: TTS)
↓
音声再生
↓
Live2Dキャラクターの口パク・表情変化連動
code:プロジェクトの構成
live2d_chat_agent/
├── unity/ # Unityプロジェクト
│ ├── Assets/
│ │ ├── Live2DModels/ # Live2Dモデル(.model3.json)
│ │ ├── Scripts/ # Unity C#スクリプト
│ │ │ ├── MicRecorder.cs
│ │ │ ├── WavUtility.cs
│ │ │ ├── WhisperClient.cs
│ │ │ ├── ChatController.cs
│ │ │ ├── Live2DMouthSync.cs
│ │ │ └── CuteTalkGestures.cs
│ │ └── Scenes/
│ │ └── Main.unity
│ └── Packages/
│
├── server/ # Pythonサーバー(Whisper+ChatGPT+TTS)
│ ├── whisper_server.py(萌家電のときはココを入れ替える。whisper_server_EL.pyに)
│ └── requirements.txt (同内容のpipも下の手順に記載)
│
└── README.md
table:機能対応表
ファイル名 機能
MicRecorder.cs 音声録音
WavUtility.cs WAV変換
WhisperClient.cs Whisperサーバー(python)へ送信
whisper_server.py Whisper(SST)→Txt送信→ChatGPT→Txt返信→音声合成(TTS)
ChatController.cs 録音ボタン → 送信 → 返答テキスト表示 → 音声ダウンロード&再生 までを制御
Live2DMouthSync.cs 口パク同期
CuteTalkGestures.cs 手をパタパタ、ゆらぎ、かわいい相槌
requirements.txt pythonの依存環境を記載(同内容のpipも下の手順に記載)
1. Python サーバー(Flask + OpenAI + pydub) whisper_server.py
役割:音声受信→STT(gpt-4o-mini-transcribe)→応答生成→TTS(gpt-4o-mini-tts)→MP3→WAV変換
主要エンドポイント
POST /process:フォームキーfileにwavを付ける → JSON {recognized, reply, audio_url} を返す
GET /tts/<filename>:生成WAVを返す(audio/wav)
依存:
code:pip
pip install flask flask-cors openai pydub
Windows環境では ffmpeg.exe を用意(PATH 通すか pydub にパス設定)
参考:WindowsにFFmpegをインストールして利用できるようにパスを通す
ログ:
UPLOAD / STT / CHAT / TTS を出力。エラー時は stage: stt/chat/tts をJSONで返す
使い方:
whisper_server.py 内の Open API KEY("YOUR-OPENAI-API-KEY")を自分の環境に合わせて書き換え
環境変数として設定してもよい。その場合は該当の行を削除。
whisper_server.py を実行するれば、Chatサーバーが起動
よくあるエラー
TypeError: create() got an unexpected keyword argument 'format'
→ TTSのformat=非対応バージョン。MP3で出してからWAVへ変換で回避(本構成はこの方式)
UnityでFMOD Unsupported format
→ WAVで配信すれば安定(本構成の /tts/*.wav)
2. 必要最低限のUnity クライアント
WhisperClient.cs WhisperClient.cs
SendAudio(byte[] wavData, Action<WhisperResponse>):/process にPOST
DownloadAudioClip(url, cb):AudioType.WAV で取得→AudioSourceにセット
WhisperResponse { string recognized, reply, audio_url }
MicRecorder.cs MicRecorder.cs
StartRecording() / StopRecordingAndGetWav(): byte[]
※ WavUtility.FromAudioClip などで 16bit PCM WAV を作る(ヘッダ先頭 RIFF)
WavUtility.cs WavUtility.cs
ChatController.cs ChatController.cs
録音ボタン→数秒録音→ WhisperClient.SendAudio → テキスト反映 & audio_url ダウンロード→ ttsAudio.Play()
3. かわいい追加機能①:口パク(Live2D)
Live2DMouthSyncCubism.cs Live2DMouthSync.cs
口パク用パラメータ:
mouthOpenId = ParamMouthOpenY(開閉・本命)
mouthFormId = ParamMouthForm(形・任意)
mouthSizeId = PARAM_MOUTH_SIZE(拡縮・任意)
ベース値(デフォルト):baseForm=1 / baseOpen=0 / baseSize=0
音量→開き:RMS(またはFFT版に差し替え可)、ガンマ補正・ゲイン・スムージングあり
Cubism更新順の問題対策:
ICubismUpdatable 実装 + CubismUpdateController への登録
登録できない場合は MonoBehaviour LateUpdate にフォールバック
Script Execution Order で最下位に置くとさらに堅い
公開プロパティ:TalkActivity(0..1)
→ 他のアニメ(手パタなど)が参照して連動
FFT版(オプション)
useSpectrum=true、帯域 300–3000Hz で人声帯域だけ反応
BGMや低音ノイズで口が動く問題を軽減
4. かわいい追加機能②:手をパタパタ・相槌(手・肩・眉・笑顔・首)
CuteTalkGesturesLinked.cs CuteTalkGestures.cs
参照:mouthSync.TalkActivity(フォールバックで ParamMouthOpenY も可)
挙動:
手パタ:左右で位相差、活動量で振れ幅増
肩/腕ボブ:上下のゆらぎ
表情:眉上下&片目スマイルを軽く
首ふり:ParamAngleX/Y/Z をふわっと。発話時に振れ幅UP
調整の主なツマミ:
反応量:activityGain / attackSmooth / releaseSmooth
手:handAmount / handSpeed / handPhaseOffset
肩:armAmount / armSpeed
表情:smileAmount / browAmount
首:neckAngleX/Y/Z / neckSpeed / neckIdleScale
落ち着き:idleWobble / idleSpeed / smooth / noiseGate
5. モデルのパラメータID(ヤマザコちゃんの仕様)
※この項目はLive2Dモデルにヤマザコちゃんを使うとき用です
口関連
ParamMouthOpenY(開閉・本命)
ParamMouthForm(形)
PARAM_MOUTH_SIZE(拡縮)
手腕・眉・目
ParamArmL / ParamArmR / ParamHandR
ParamBrowLY / ParamBrowRY
PARAM_EYE_L_SMILE
首・頭
ParamAngleX / ParamAngleY / ParamAngleZ
※ Live2Dのパラメータウィンドウで手動操作して効くか必ず確認。IDは完全一致で。
6. セットアップ手順チェックリスト
Python:pip install flask flask-cors openai pydub、ffmpeg 準備
whisper_server.py 起動 → GET /health でOK
Unity:WhisperClient / MicRecorder / ChatController の3点で録音→TTS再生
ttsAudio(AudioSource)を Live2DMouthSyncCubism.audioSource に割り当て
口パク:mouthOpenId=ParamMouthOpenY、ベース値 Form=1 / Open=0 / Size=0
連携:CuteTalkGesturesLinked.mouthSync に Live2DMouthSyncCubism をドラッグ
手・眉・首のIDを設定して動作確認
6.1 Unityの設定方法の詳細
①Live2D モデルの配置
Live2D Cubism SDK を導入し、.model3.json をシーンにドラッグ。
生成されたモデルのルートに CubismModel が付いていることを確認。
②空の GameObject を作成(例:ChatAgent)
AudioSource を追加(TTS再生用)。Play On Awake は OFF 推奨。
③GameObjectにスクリプトをアタッチ:
MicRecorder
WhisperClient
ChatController
④UI( Button(録音ボタン))を用意
④-1 Unityのメニューバーから
GameObject > UI >Legacy> Button
を選択。
→ 新しく Canvas と Button がシーンに作成されます。
④-2 Hierarchyでできた Button を選択。
「Button (Script)」コンポーネントのInspectorで
On Click () の一番下にある + ボタンを押す。
④-3 On Clickの新規スロットに、録音を制御しているゲームオブジェクト(例:ChatAgent や ChatControllerがアタッチされているオブジェクト)をドラッグ&ドロップ。
④-4 ドロップしたスロットの横のプルダウンから、
ChatController > OnRecButton()
を選択し、ボタンの OnClick に ChatController.OnRecButton をアサイン。
※後日:Text(認識結果、応答)をつくって吹き出しをつくる。
ChatController のrecognizedText / replyText に紐付け。
⑥GameObject(ChatAgent)の参照の割り当て
ChatController.mic に ChatAgent の MicRecorder をドラッグ。
ChatController.client に ChatAgent の WhisperClient をドラッグ。
ChatController.ttsAudio に ChatAgent の AudioSource をドラッグ。
口パク同期の設定
⑦Live2Dモデル(Yamazako-chan)にスクリプトをアタッチ
Live2DMouthSync
CuteTalkGestures
⑧Live2Dモデル(Yamazako-chan)の参照割り当て
Live2DMouthSyncのaudioSource に ChatAgent の AudioSource をドラッグ。
Live2DMouthSyncのlive2DModel にモデルの CubismModel をドラッグ。
CuteTalkGesturesのmodel に CubismModelを割り当て
CuteTalkGesturesのaudioSource に TTS を再生している AudioSourceを割り当て
⑩gain や smooth は再生してから微調整(例:gain=2.0, smooth=0.15)。
7. トラブルシュート早見表
Unityで音が鳴らない/Clip null
→ audio_url にブラウザでアクセス→WAVが落ちるか。Content-Type: audio/wav / サイズ>0 を確認
FMOD Unsupported
→ サーバーはWAVで返す(MP3→WAV 変換済み構成)
口が動かない
強制モード debugForceSine=ON で動くか(MouthSync)
ParamMouthOpenY のID完全一致/他コンポーネントの上書き(一時Disable)
spatialBlend=0(2D)、noiseGate/sensitivity の調整
手/眉/首が効かない
→ そのパラメータIDがモデルに存在するか。方向逆なら base01 や振幅を調整
8. そのうちやるかも(未実装)
キャラっぽい応答:system プロンプトで口調・口癖・絵文字
無音区間カット(VAD):pydub.silence 等で短縮→レスポンス改善
キー管理:OpenAI APIキーは環境変数に戻す(直書きは後で撤去)
UIにText(認識結果、応答)をつくって吹き出しをつくる。
ChatController のrecognizedText / replyText に紐付け。
おわりに(実装済み)
このページの内容と、Whisper + ChatGPT + ECHONET Lite で家電操作する音声アシスタントを組み合わせると、AI萌家電がつくれます。具体的にはwhisper_server.pyの中にChatELAssistant.pyのEL家電の情報を入れてあげるだけです。詳細はヤマザキまで。
ところで、知ってるます?「萌家電のうた」って水瀬いのりさん(15)が歌ってたんだよ。やっぱしすごいですね 。SONYは。
コード一覧
whisper_server.py(Flask /process, /tts)
WhisperClient.cs(POST & WAVダウンロード)
MicRecorder.cs(Start/Stop & WAV化)
WavUtility.cs
ChatController.cs(ボタン→録音→サーバー→再生)
Live2DMouthSync.cs(口パク+TalkActivity公開)
CuteTalkGestures.cs(TalkActivity連動の手/肩/眉/首)
参考
Live2の設定
Cubism Editor 5 SDK for Unity
Cubism 4 SDK for Unity お試しガイド(1/4)
https://gyazo.com/71c7de59f100448c29cdb7f29fbd171b
[Communication Robotics Lab. http://yamalab.com/