UnityとChatGPTで感情のある雑談相手を作ってみた。
目次
作ったもの
【おしゃべりAI】
— レミコン (@remikon031Unity) 2023年4月4日
現状こんな感じです。
感情を数値化して持たせて表情を変えてる。
今後の課題はキャラの追加と音声入力の追加。
(Whisperでできそう)#Unity #stablediffusion #ChatGPT pic.twitter.com/F4609roq0v
作った動機
・雑談相手が欲しかった。
・デスクトップマスコットを思い出して作りたくなった。
・ノベルゲーム用に作った立ち絵を供養したかった。(シナリオが...)
工夫点
・感情を数値として持たせた。
・感情に応じて表情を切り替える。
作り方
1.ChatGPTのAPIをUnity上で扱うためのスクリプトを書く。
参考
このスクリプトは使用していないのであくまでAPIの使い方の参考です。
2.VoiceVoxのAPIをUnity上で扱うためのスクリプトを書く。
参考 qiita.com
こちらはほぼそのまま使わせてもらいました。
3.ChatGPTに感情を持たせるための指示を出す。
List<OpenAIChatAPI.Message> context = new List<OpenAIChatAPI.Message>() { new OpenAIChatAPI.Message(){ role = "system", content = "以後の会話では、あなたは下記の4つの感情パラメーターを持ち振る舞います。 各感情パラメーターは会話を通じて変動します。 現在の感情パラメーターの値を反映し、あなたの返答は変化します。 以後の会話ではまず現在の感情パラメータを出力し、その後に会話を出力してください。 出力形式は以下のフォーマットとします。 このフォーマット以外で会話しないでください。 感情:{""喜"":0~5,""楽"":0~5,""怒"":0~5,""哀"":0~5} ""会話の文章"" " };
感情の読み込みなど
IEnumerator ChatRequest() { var request = chatAPI.CreateRequest(new OpenAIChatAPI.RequestData() { messages = context }); yield return request.Send(); if (request.IsError) throw new System.Exception(request.Error); var message = request.Response.choices[0].message; for(int i = 0; i<6;i++) { if (message.content.Contains("\"喜\":"+ i.ToString())) { joy = i; } //以下略 } AppendMessage(message); //感情の数値に応じて画像切り替え ChangeFace(); //感情を発言させないため1行目をスキップ string[] lines = message.content.Split('\n'); string result = string.Join("\n", lines.Skip(1)); //VoiceVox呼び出し VoiceVoxTest.StartCoroutine(VoiceVoxTest.SpeakTest(result)); yield return null; }
4.立ち絵などを設定する。
・立ち絵を描いたり作ったりする(AIでの作り方は要望があれば記事にするかも)
今後の展望
・Whisperなどの音声認識ライブラリを用いて会話を可能にする
・ファイル整理や検索などの雑用をしてもらう
・ゲームの相手になってもらう