![見出し画像](https://assets.st-note.com/production/uploads/images/110763089/rectangle_large_type_2_87657db6bbdf45d547ed9c94842ca9e1.png?width=1200)
UnityとPythonでAIキャラと会話①
経緯
WebGLでAIキャラとの会話アプリを作成したい!
WebGLの開発はUnityでやる。(3Dでなんかできたら良いよね)
AIの会話はPythonで(理由は後述)
文字起こし(Speech2Text, Whisper系を使用)
AIで会話文生成(Text2Text, prompted ChatGPT, finetuned rinnaを使用)
AIで音声生成(Text2Speech, Finetuned VITSを使用)
Unity側でPythonから受け取った音声を元にアバターのLip Sync(口パク)をする。
python(Django)とUnityの通信をする。
つらいポイント
通信関連を何も知らない状態からやる。
普通にやるとレスポンスがクソ遅いのでStreamingを活用する。
非同期処理やらも初学者にはキツイ
2.1
faster-whisper-large-v2を使用。
2.2
チャットモデルには ChatGPT を採用した。
ChatGPTだけであるならPythonを使用する必要はあんまりない。
今回は、将来他のローカルで動かせるモデルを使用することを想定してPythonで実装した。
2.3で音声を生成するときに、pythonを使用するためそれも勘案した。
2.3
音声を生成する手法
VITSを使用した。
CVAE (Conditional Variational Autoencoder)
Diffusion Modelsでも使われてる。
RVC (Retrieval-based-Voice-Conversionの元)とメソッドは同じ
今回のタスクはText2Speechであるため、Retrieveする必要がない。
3
Pythonサーバーから取得した音声を解析して母音を判定する。
hecomi/uLipSyncという素晴らしいプラグインがあったのでこれを採用。
4
現在
まずChatGPTからのレスポンスをストリーミングでサーバーが受け取る。
それを句読点ごとにパックして音声にした後にUnityにストリーミングで送るようにした。
Unity側ではUnityWebRequestを使用したが、データを受け取り次第逐次、処理を実行したかったのでDownloadHandlerを自前で用意して無駄に頑張って実装した。
改善案
現状、音声ファイルしか送れない。
バイナリで送っていて、Parserを適当に挟めば会話文やサンプリングレートなんかのメタデータも入れられそう。
最近調べて思ったけど、UDP通信にするといいかも?
この記事が気に入ったらサポートをしてみませんか?