VR人形遊びとChatGPTとボイスロイド
#AI
#ChatGPT
まぁよくあるやつ
VR人形遊びで作った物を下敷きに、ChatGPTで会話するBotを作る
スマホアプリ(orVR orWeb)で
可能であれば感情表現やキャラクタ付けを行う
要件
3Dモデルとおしゃべり
かわいい
聞き取り待機、処理中、発話中が分かる
リップシンク
自動音声認識(ボタン押して喋るとか、ウェイクアップワードとかを持たない)
VR、Android、Webにできれば対応する。メインはAndroid
先行事例
https://zenn.dev/umyomyomyon/articles/5f07abe67a289b
耳:Whisper API 声:VoiceVox
https://qiita.com/ayaha401/items/0c7f0511d9e8e6f76bfc
耳:UnityEngine.Windows.Speech.DictationRecognizer 声:VoiceVox 口:OVRLipsync
https://www.creationline.com/lab/60736
耳:TextInput 声:VoiceVox 口:Unity uLipSync
感情表現あり
https://qiita.com/gyokuro338/items/50ff6f19b6e98cfabf32
耳:Whisper API 声:VoiceVox 口:OVRLipsync
技術調査
音声認識系
Whisper API
WebAPI。一旦マイク音声をファイルに変換しないといけないのがモヤる
UnityEngine.Windows.Speech.DictationRecognizer
Unity標準のディクテーション。Windowsでしか動かないのがネック
Unityで音声認識する技術って今どんな感じ202107
UniJulius
辞書突合せに特化した仕様に見える
★UnityでMicrosoft Cognitive Speech Servicesによる音声認識をAndroidスマホで実装する
Unityアセットが存在する
Webに対応していない
使い方
Google Speech-to-Text
Unityアセットが存在する(有料)
が、これはRESTしか対応していない
RESTよりリアルタイムなgRPC版がある
RESTはファイルを送る形式
https://twitter.com/amivoice_tech?t=vX2ibSflkkz_o4SWtV85YQ&s=09
業者向け?
ChatGPT連携系
https://platform.openai.com/docs/api-reference/chat
https://qiita.com/PND/items/c9e9d449539a460515a4
発話系
★https://qiita.com/A_T_B/items/1531d78944d8b796b9fa
自前でサーバを立てる方式
GCPでVOICEVOXを動かす
これと同じ・・・docker名入れたら勝手にコンテナ立ち上げてくれるサービスってAWSには無いのだろうか
リップシンク
https://zenn.dev/mochineko/articles/d14278b45240da
VoiceVoxが出力するAudioQueryを使ってリップシンクするアプローチ
OVRLipSync
使ったことあるしこれかな
感情表現系
https://dev.classmethod.jp/articles/chatgpt-unity-methoko/
ーーー
作り始めた
DONE
技術調査
Microsoft Speech
VOICEVOX
VOICEVOXサーバ作成
ChatGPT
アセット用意
背景
テキストウィンドウ
キャラクター
待機モーション(Tポーズを避ける)
表情アニメ
View作成
デバッグダンプ作成
ステートマシン作成
音声認識モジュールの作成
音声認識可否ランプの作成
ChatGPTクライアント作成
VOICEVOXクライアント作成
ステートマシンとの繋ぎ込み
現在ステートをモーションから判断できるようにする
ChatGPTのプロンプト最適化
表情変化
エラー応答からの復帰
タイトル画面
ウェルカムワードの発言
トークン超過対策(スレッド配列のトリミング)
gpt-3.5-turbo-0613は上限4096トークンらしい
1回40トークン(発話/応答)として100回は無理って感じ→60スレまで保存するか
フォントアセットが不十分
自動スリープさせない
https://nobushiueshi.com/unityiosやandroidの端末を自動スリープさせないための方法/
スプラッシュ画面にローディングとロゴが欲しい
TODO
音声合成が遅い
https://cloud.google.com/anthos/run/docs/configuring/compute-power-gpu?hl=ja
GPU スペック表
https://qiita.com/yukoba/items/10d0ba3fb1d19a6ab6a5
https://cloud.google.com/compute/docs/gpus?hl=ja#general_comparison_chart
どうにかこうにかGPU付きインスタンスを借りようとしたら、月額4万らしくて挫折してる
https://gyazo.com/5fda85de8b14eee047598c35109f6747
素材
https://www.ac-illust.com/main/detail.php?id=22565437&word=%E3%83%9D%E3%83%83%E3%83%97%E3%81%A7%E3%82%AB%E3%83%A9%E3%83%95%E3%83%AB%E3%81%AA%E8%83%8C%E6%99%AF
https://owarinu.booth.pm/items/1520082
https://kaerimichi.booth.pm/items/3754944
https://digitalmotion.booth.pm/items/4054947
https://maou.audio/bgm_acoustic42/
アセット
FinalIK
LilToon
Microsoft SpeechSDK
UniVRM
Androidビルドしたらエラーでビルドに失敗するので削除
TextMeshPro
参考資料
ChatGPT
APIリファレンス
FunctionCallingについて
https://qiita.com/PND/items/c9e9d449539a460515a4#function-calling
https://chatgpt-lab.com/n/nb2020dbf
Microsoft Speech SDK
https://github.com/Azure-Samples/cognitive-services-speech-sdk/blob/master/quickstart/csharp/unity/from-microphone/README.md
VOICEVOX
https://wikiwiki.jp/voicevox/よくある質問(Q%EF%BC%86A)
似た事をやってるM5スタックチャンのソースコード
https://github.com/robo8080/AI_StackChan2/tree/main
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(
"https://voicevox-engine-v55zinbdpq-an.a.run.app/synthesis?speaker=1",
"POST"
)){
byte[] bodyRaw = Encoding.UTF8.GetBytes(audio_query);
request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
request.downloadHandler = (DownloadHandler) new DownloadHandlerAudioClip (
"https://voicevox-engine-v55zinbdpq-an.a.run.app/synthesis?speaker=1",
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はキー無しにする事が出来た
シリアライズ時に、null項目はキーごと消したい
表情系のAnimationClipには、全ての値を予め書き込んでおく
WriteDefaultによる意図しないデフォルト値の置き換えを防ぐため、WriteDefaultはOffにする
こうすると、AtoBした際、B側で定義していない値はAの値を引き継ぐ。
閉じ目→標準 としたとき、目が閉じっぱなし
表情アニメは2Fあったほうが良い?
VOICEVOXサーバーの速度がCPUとGPUで違い過ぎる
基本的にCPUで開発してたが、GPUにしたら速すぎてモーションが壊れた
A+Bモーションを取り止めて、Mecanimをシンプルにする
ロード中への遷移中に発話中ステータスになったら割り込みを受け付けるよう変更・・・うーん
https://tech.pjin.jp/blog/2021/08/31/unity-transition_3/
---
ステータスをモーションで表現するのは、むしろターン性を意識させてしまって体験が悪いかもしれない
考え中モーションに眼球を動かす演技をさせると、インジケータランプ感があって良いかもしれない
---
送信メッセージや受信メッセージにたいして、モデレーションAPIで安全性を確認できるらしい
https://platform.openai.com/docs/guides/moderation/quickstart
---
ふりかえり(YWT)
やったこと
ChatGPTを使ったアプリ開発
ChatGPTのFunctionCallにトライ
音声認識周り、音声合成周りの技術調査
VR人形遊びの資産を流用した開発
画面映えを意識したレイアウト
生き生きとした挙動
現在ステータスが自然と分かるUI/UX
わかったこと
キャプチャーモーション(デジモさんの素材)をループ素材として取り込む方法
プロンプトエンジニアリングの雰囲気。再現性が低くて不毛な感じが精神を苛んでいく
FunctionCallでJSONを返すよう依頼してるが、想定したJSONが帰ってこない。
Microsoft Speechの使い方
VOICEVOXの使い方
GoogleCloudRunの使い方
UnityでWavファイルをダウンロードする方法
インジケータとしてのモーション
体を動かすモーションよりも、目で演技させた方がそれらしくなる
モーションの取り込み
プロンプトエンジニアリングについての詳細と感想。しんどさ。
インジケータは目で演技させるのが良い
つぎやること
モーションのA+Bの作り方の模索
安いGPUサーバー
FunctionCallが動作不安定
音声認識ミスした後の認識開始マージン中、明後日の方向を見るなど、こっちの話を聞いて無い感を出すべきだった
月額課金形式ならサービスとしてリリース出来る・・・のか・・・?
VR化もしたい
生物シミュと本格的に掛け合わせて考察したい
発言ログの自他をうまくいじれば、二人会話も可能では
話題の選択ゲーム
AWS テキスト感情検出
https://docs.aws.amazon.com/comprehend/latest/dg/how-sentiment.html