見出し画像

UnityとPythonでAIキャラと会話①

経緯

WebGLでAIキャラとの会話アプリを作成したい!

  1. WebGLの開発はUnityでやる。(3Dでなんかできたら良いよね)

  2. AIの会話はPythonで(理由は後述)

    1. 文字起こし(Speech2Text, Whisper系を使用)

    2. AIで会話文生成(Text2Text, prompted ChatGPT, finetuned rinnaを使用)

    3. AIで音声生成(Text2Speech, Finetuned VITSを使用)

  3. Unity側でPythonから受け取った音声を元にアバターのLip Sync(口パク)をする。

  4. python(Django)とUnityの通信をする。

つらいポイント

  • 通信関連を何も知らない状態からやる。

  • 普通にやるとレスポンスがクソ遅いのでStreamingを活用する。

  • 非同期処理やらも初学者にはキツイ

2.1

  • faster-whisper-large-v2を使用。

2.2

  • チャットモデルには ChatGPT を採用した。

  • ChatGPTだけであるならPythonを使用する必要はあんまりない。

  • 今回は、将来他のローカルで動かせるモデルを使用することを想定してPythonで実装した。

  • 2.3で音声を生成するときに、pythonを使用するためそれも勘案した。

2.3

  • 音声を生成する手法

  • VITSを使用した。

    • github repo

    • 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通信にするといいかも?


この記事が気に入ったらサポートをしてみませんか?