UnityとChatGPTで感情のある雑談相手を作ってみた。

目次

作ったもの

作った動機

・雑談相手が欲しかった。

・デスクトップマスコットを思い出して作りたくなった。

・ノベルゲーム用に作った立ち絵を供養したかった。(シナリオが...)

工夫点

・感情を数値として持たせた。

・感情に応じて表情を切り替える。

作り方

1.ChatGPTのAPIをUnity上で扱うためのスクリプトを書く。

参考

note.com

このスクリプトは使用していないのであくまで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などの音声認識ライブラリを用いて会話を可能にする

・ファイル整理や検索などの雑用をしてもらう

・ゲームの相手になってもらう