VR人形遊びとChatGPTとボイスロイド
まぁよくあるやつ
VR人形遊びで作った物を下敷きに、ChatGPTで会話するBotを作る スマホアプリ(orVR orWeb)で
可能であれば感情表現やキャラクタ付けを行う
要件
3Dモデルとおしゃべり
かわいい
聞き取り待機、処理中、発話中が分かる
リップシンク
自動音声認識(ボタン押して喋るとか、ウェイクアップワードとかを持たない)
VR、Android、Webにできれば対応する。メインはAndroid
先行事例
耳:Whisper API 声:VoiceVox
耳:UnityEngine.Windows.Speech.DictationRecognizer 声:VoiceVox 口:OVRLipsync
耳:TextInput 声:VoiceVox 口:Unity uLipSync
感情表現あり
耳:Whisper API 声:VoiceVox 口:OVRLipsync
技術調査
音声認識系
Whisper API
WebAPI。一旦マイク音声をファイルに変換しないといけないのがモヤる
UnityEngine.Windows.Speech.DictationRecognizer
Unity標準のディクテーション。Windowsでしか動かないのがネック
UniJulius
辞書突合せに特化した仕様に見える
Unityアセットが存在する
Webに対応していない
が、これはRESTしか対応していない
RESTよりリアルタイムなgRPC版がある
RESTはファイルを送る形式
業者向け?
ChatGPT連携系
発話系
自前でサーバを立てる方式
これと同じ・・・docker名入れたら勝手にコンテナ立ち上げてくれるサービスってAWSには無いのだろうか
リップシンク
VoiceVoxが出力するAudioQueryを使ってリップシンクするアプローチ
使ったことあるしこれかな
感情表現系
ーーー
作り始めた
DONE
技術調査
Microsoft Speech
VOICEVOX
VOICEVOXサーバ作成
ChatGPT
アセット用意
背景
テキストウィンドウ
キャラクター
待機モーション(Tポーズを避ける)
表情アニメ
View作成
デバッグダンプ作成
ステートマシン作成
音声認識モジュールの作成
音声認識可否ランプの作成
ChatGPTクライアント作成
VOICEVOXクライアント作成
ステートマシンとの繋ぎ込み
現在ステートをモーションから判断できるようにする
ChatGPTのプロンプト最適化
表情変化
エラー応答からの復帰
タイトル画面
ウェルカムワードの発言
トークン超過対策(スレッド配列のトリミング)
gpt-3.5-turbo-0613は上限4096トークンらしい
1回40トークン(発話/応答)として100回は無理って感じ→60スレまで保存するか
フォントアセットが不十分
自動スリープさせない
スプラッシュ画面にローディングとロゴが欲しい
TODO
音声合成が遅い
GPU スペック表
どうにかこうにかGPU付きインスタンスを借りようとしたら、月額4万らしくて挫折してる
https://gyazo.com/5fda85de8b14eee047598c35109f6747
素材
アセット
FinalIK
LilToon
Microsoft SpeechSDK
UniVRM
Androidビルドしたらエラーでビルドに失敗するので削除
TextMeshPro
参考資料
ChatGPT
FunctionCallingについて
Microsoft Speech SDK
VOICEVOX
似た事をやってるM5スタックチャンのソースコード
GPTへのプロンプトはどうしてる?
音声認識周りはどうしてる?
学び
GCPのCloudRunが雑にdocker hubを利用できて楽
こんな機能があったなんて!
大変助かる!
この方向で色々試したい
クラスの初期化色々
code:cs
code:初期化いろいろ
class Sample {
public string item1;
public string item2;
};
var object = new Sample(){
item1 = "hoge",
item2 = "fuga"
};
var array = new string[]{"hoge", "fuga"};
var object_array = new Sample[]{
new Sample(){item1="hoge", item2="fuga"},
new Sample(){item1="piyo", item3="poyo"}
};
var dictionary = new Dictionary<string, Sample>(){
{"key", new Sample(){item1="hoge", item2="fuga"}}
};
UnityでWavファイルをダウンロードして、AudioClipにする
code:cs
using(var request = new UnityWebRequest(
"POST"
)){
byte[] bodyRaw = Encoding.UTF8.GetBytes(audio_query);
request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
request.downloadHandler = (DownloadHandler) new DownloadHandlerAudioClip (
AudioType.WAV
);
request.SetRequestHeader("Content-Type", "application/json");
Debug.Log("Request Synthesis");
yield return request.SendWebRequest();
if(request.result != UnityWebRequest.Result.Success){
Debug.Log("Request Error!");
Debug.Log(request.error);
yield break;
}
var a = ((DownloadHandlerAudioClip)request.downloadHandler).audioClip;
onCallBack.Invoke(a);
}
ダウンロードハンドラにDownloadHandlerAudioClipを使う。引数に癖があるけどそれはそれ
Newtonsoft.Jsonでシリアライズした際に、nullはキー無しにする事が出来た
表情系のAnimationClipには、全ての値を予め書き込んでおく
WriteDefaultによる意図しないデフォルト値の置き換えを防ぐため、WriteDefaultはOffにする
こうすると、AtoBした際、B側で定義していない値はAの値を引き継ぐ。
閉じ目→標準 としたとき、目が閉じっぱなし
表情アニメは2Fあったほうが良い?
VOICEVOXサーバーの速度がCPUとGPUで違い過ぎる
基本的にCPUで開発してたが、GPUにしたら速すぎてモーションが壊れた
A+Bモーションを取り止めて、Mecanimをシンプルにする
ロード中への遷移中に発話中ステータスになったら割り込みを受け付けるよう変更・・・うーん
---
ステータスをモーションで表現するのは、むしろターン性を意識させてしまって体験が悪いかもしれない
考え中モーションに眼球を動かす演技をさせると、インジケータランプ感があって良いかもしれない
---
送信メッセージや受信メッセージにたいして、モデレーションAPIで安全性を確認できるらしい
---
やったこと
ChatGPTを使ったアプリ開発
ChatGPTのFunctionCallにトライ
音声認識周り、音声合成周りの技術調査
画面映えを意識したレイアウト
生き生きとした挙動
現在ステータスが自然と分かるUI/UX
わかったこと
キャプチャーモーション(デジモさんの素材)をループ素材として取り込む方法
プロンプトエンジニアリングの雰囲気。再現性が低くて不毛な感じが精神を苛んでいく
FunctionCallでJSONを返すよう依頼してるが、想定したJSONが帰ってこない。
Microsoft Speechの使い方
VOICEVOXの使い方
GoogleCloudRunの使い方
UnityでWavファイルをダウンロードする方法
インジケータとしてのモーション
体を動かすモーションよりも、目で演技させた方がそれらしくなる
モーションの取り込み
プロンプトエンジニアリングについての詳細と感想。しんどさ。
インジケータは目で演技させるのが良い
つぎやること
モーションのA+Bの作り方の模索
安いGPUサーバー
FunctionCallが動作不安定
音声認識ミスした後の認識開始マージン中、明後日の方向を見るなど、こっちの話を聞いて無い感を出すべきだった
月額課金形式ならサービスとしてリリース出来る・・・のか・・・?
VR化もしたい
発言ログの自他をうまくいじれば、二人会話も可能では
話題の選択ゲーム
AWS テキスト感情検出