見出し画像

ChatGPTのAPIの返答を、Unityでもリアルタイムで一文字ずつ表示できるようにした

ChatGPTってChatGPTのサイトだと、以下のように返答が逐次的に表示されるじゃないですか。

でもChatGPTのAPIを使用すると一気にぱっと表示されてしまう。
ストリーミングで送られてこないから時間がかかって、あんまり会話している感じがしない。
UnityでもChatGPTのUIのようにリアルタイムで会話したい!

ということで、Unity上でも同じようにリアルタイムに会話できるようになったのが以下の動画です。

逐次的に表示されているから、めちゃくちゃ返答が早いし会話しているように話せる!
今回の記事はこの逐次的な表示をどう作ったか、という説明と、この機能を自分のアプリにアップデートしたよ! という報告です。

上の動画で映っているアプリは今週自分がGoogle Playに公開した以下のアプリです。
どんな感じか試してみたい方は無料でインストールできるので、是非使ってみてください。

使い方の紹介記事:見た目や話し方を自由に設定して、AIキャラと音声で話せるアプリを公開した!
公開場所:Google Store MakeYourFriend ~AIキャラ作成・体験ツール~

参考記事

【Python】ChatGPT APIでウェブサイト版のように返答を逐次受け取る方法

作り方

実はChatGPTのAPIのドキュメントをよく読んでみると、APIのパラメータにstreamについての記述が存在しています。
こういうものです。

stream boolean Optional Defaults to false
設定されている場合、ChatGPTのように部分的なメッセージのデルタが送信されます。
トークンは、データのみのサーバー送信イベントとして、利用可能になると送信され、ストリームはデータによって終了します。
[DONE]メッセージでストリームを終了します。
サンプルコードについては、OpenAI Cookbookを参照してください。

で、サンプルコードがここに書いています。

これをC#に変換して送ればいいのです。
具体的には、以下のようにJsonを作って、

string jsonBody = JsonConvert.SerializeObject(new
{
    model = "gpt-3.5-turbo",
    messages = new[]
    {
        new {role = "user", content = "こんにちは"}
    },
    stream = true
});

それをUnityWebRequestとかで送るだけでできます。

UnityWebRequest request = new UnityWebRequest(apiUrl, "POST");
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonBody);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Authorization", $"Bearer {apiKey}");
request.SetRequestHeader("Content-Type", "application/json");

request.SendWebRequest();

めちゃくちゃ簡単。
あとはstreamingで送られてくる情報を適当に受け取って、画面に表示すればそれだけで逐次的に表示ができるようになります。

感想

やっぱりリアルタイムで逐次的に表示できると、しゃべっている感じが出ていいですね。
待つ時間がないから表示も素早くなるし、だいぶ話しやすくなった。
ただそうなると今度は音声認識の部分のタイムラグが気になってくる。
次は録音の逐次的処理、をしてみたいけど、音声を録音しながらぶつ切りで送ると音声認識の精度が圧倒的に下がることが簡単に予想できるので、何かいい方法がないかな、と思ったり。
音声認識の専門家に質問したい……

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