14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-18

概要

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を参照してください。

ここでいうストリーミングとは、「インターネット上の動画や音声などのデータをダウンロードしながら同時に再生すること」
今回の場合だと、ChatGPTからのレスポンスがすべて生成されてから一度に来るのではなく、一文字ずつ生成される順に情報が送られてくるような処理になるってことですね。

で、サンプルコードがここに書いています。
これを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で送られてくる情報を適当に受け取って、表示したい形式、速度で画面に表示すればそれだけで逐次的に表示ができるようになります。

感想

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

14
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?