こんにちは、エンジニアリングマネージャーの渡辺(@mochi_neko_7)です。
つい先日の2023/03/01、OpenAIがChatGPTとWhisperの新しいAPIを公開して話題になりましたね。
利用料金も1/10程度になり、気軽に利用しやすくなりました。
これらはWeb APIとして公開されているものなので、Unity/C#からも適切にHTTP通信をすれば利用することができます。
そこで実際に、UnityからChatGPT APIとWhisper APIを利用するためのライブラリを趣味で開発しました。
API自体の解説をしている方は既にいらっしゃいますのであまり詳しくは触れませんが、自分がドキュメントを全て英語で書いているのもあり、記事で簡単に紹介ができればと思います。
OpenAI API Keyの発行に関して
本記事で紹介するChatGPT API、Whisper APIはどちらも利用料が発生するもので、事前にアカウント登録や支払情報の登録、API Keyの発行が必要になります。
詳しい手順等は調べれば出てくると思いますのでここでは省略します。
本記事で紹介する内容を自分で触ってみたい方は、事前にAPI Keyを発行してください。
念の為注意事項として、API Keyは他人や外部に漏れると勝手に使用されてしまい課金が発生する恐れがあるため、GitHub等に載らないよう .gitignore
で指定したり、環境変数を利用したり、自前のサーバーを介すなど適切に取り扱ってください。
ChatGPT API
ChatGPT APIは、ChatGPTの gpt-3.5-turbo
(最新版) or gpt-3.5-turbo-0301
(2023/03/01時点で固定されたモデル) のモデルを使用してChat Completion(会話の補完、対話)ができるAPIです。
概要はこちらにまとられています。
これをUnityで利用できるようにしているのがこちらのRepositoryです。
これを利用したい方は、このソースコードを配置する必要はなく、UPM(Unity Package Manager)によるパッケージのインポート機能だけで利用することが可能です。
セットアップ手順
利用したいUnityのプロジェクトの /Packages/manifest.json
を開いて、"dependencies":
の配列に次の2行を追加してください。
{ "dependencies": { "com.mochineko.chatgpt-api": "https://github.com/mochi-neko/ChatGPT-API-unity.git?path=/Assets/Mochineko/ChatGPT_API#0.1.1", "com.unity.nuget.newtonsoft-json": "3.0.2", ... } }
#0.1.1
の部分はTagのバージョンなので適宜最新版を利用するなどしてください。
もし既にNewtonsoft.Jsonを利用されている場合は、2行目の依存関係は不要です。
これだけでライブラリの準備は完了です。
仕様
公式のガイド記事はこちらです。
WebAPIの使用はこちらに記載されています。
大まかな仕様としては、3つのRole
- system:状況設定(いわゆるPrompt)
- user:ユーザーの会話の入力
- assistant:ChatGPTの会話の出力
のメッセージのリストを渡して、その後に続く適切なassistantメッセージを返す(Chat Completion)といったものです。
ただしメッセージの長さ(厳密にはToken数)は生成後のメッセージと合わせて4096までという制約があることに注意が必要です。
実装側としては過去のメッセージのやり取りを保存しておき、新しいRequestを投げる際に一緒にパラメータに含める形になります。
メッセージのリストは記憶や文脈に相当する情報で、現在は最も簡易な形でしか実装していませんが、LangChainのMemoryのように渡し方を工夫してあげるともっと面白いことになると思います。
Unityでの使用方法
サンプルのComponent実装を用意しているので、最低限の設定項目や使用方法はこちらを参考にしてみてください。
Requestのパラメータを詳細に設定できるインターフェースも用意してあるため、使いたいシチュエーションに合わせて設定をしてください。
ちなみにメッセージのリストを自分で管理したい場合は都度Connectionのインスタンスを作って使用してもらって大丈夫です。
HttpClientのインスタンスは内部でSingletonにしてあるのでそこまでオーバーヘッドはないはずです。
Whisper API
Whisper APIは、Whisperの whisper-1
というモデルを使用してTranscription(音声をテキストに変換、文字起こし)とTranslation(音声の内容を英語に翻訳してテキストに変換)ができるAPIです。
概要はこちらにまとられています。
これをUnityで利用できるようにしているのがこちらのRepositoryです。
これを利用したい方はChatGPT APIと同様、このソースコードを配置する必要はなく、UPM(Unity Package Manager)によるパッケージのインポート機能だけで利用することが可能です。
セットアップ手順
利用したいUnityのプロジェクトの /Packages/manifest.json
を開いて、"dependencies":
の配列に次の2行を追加してください。
{ "dependencies": { "com.mochineko.whisper-api": "https://github.com/mochi-neko/Whisper-API-unity.git?path=/Assets/Mochineko/Whisper_API#0.1.0", "com.unity.nuget.newtonsoft-json": "3.0.2", ... } }
#0.1.0
の部分はTagのバージョンなので適宜最新版を利用するなどしてください。
もし既にNewtonsoft.Jsonを利用されている場合は、2行目の依存関係は不要です。
これだけでライブラリの準備は完了です。
仕様
公式のガイド記事はこちらです。
WebAPIの使用はこちらに記載されています。
Whisperの仕様はシンプルで、音声データをRequestのパラメータと一緒に渡すとテキストが返ってくるというものです。
Responseのテキストの形式はデフォルトではJSONですが、パラメータで変更が可能なため、適宜stringを変換して利用します。
言語やPromptを指定すると精度が上がるようです。
Unityでの使用方法
サンプルのComponent実装を用意しているので、最低限の設定項目や使用方法はこちらを参考にしてみてください。
Requestのパラメータを詳細に設定できるインターフェースも用意してあるため、使いたいシチュエーションに合わせて設定をしてください。
都度Requestのパラメータを調整したい場合はその都度インスタンスを生成して使用してください。
実装する上で注意したこと
実装自体はソースコードを見ていただければ分かる通りそれほど難しくありません。
HTTP通信でのWebAPIの叩き方やJSONの取り扱いがあればご自身でも実装できると思います。
ちょっとハードルが高いとという方はUPMで利用してみてください。
API Referenceには記述が見当たらなかったのですが、エラーのResponseはこのようなJSONで共通のようです。
どうでも良い個人的なこだわりとしては、意図的にUnity標準のUnityWebRequestとJsonUtilityを使用せず、それぞれHttpClientとNewtonsoft.Jsonで代替しています。
自分が使い慣れているというのもありますが、これらを除外できるとUnityのコードに全く依存しなくなるため(実際にAssemblyDefinitionを見ていただくと No Endine Reference = true
になっているのがわかると思います)、Unityのバージョンの影響をほとんど受けなかったり(ただ nullable を使ってしまっているのでC#のバージョンの制約がありますが)、やらないと思いますがPure C#に切り出せるというメリットもあります。
あとはModelの指定をenumでできるようにしているのも扱いやすさの観点での個人的嗜好です。
今後の使い道など
ChatGPTとWhisperを組み合わせると、
音声入力 -> 文字起こし -> ChatGPTと会話
をすることができます。
既に実装されている方がいるように、更に音声合成を組み合わせると
音声入力 -> 文字起こし -> ChatGPTと会話 -> テキストから音声合成
と音声での会話の一連の流れが成立します。
なので次はVOICEVOXによる音声合成ができるようAPI部分のライブラリを作成してみたり、ChatGPT APIの会話の記憶部分をより高度にするためにLangChainのJavaScript版をNode.jsでAPIサーバーとして立ててみたりしようかなと考えています。
おわりに
ChatGPTもWhisperも使い道はさまざまで可能性は無限大なAIですが、Unityで利用できると3DCGやXRとの組み合わせが簡単にできるようになります。
自分のUnity製アプリに組み込んでみたいという方はUPMでサクッと導入できますのでぜひ触ってみてください。
Pull Request、fork、ライセンスの範囲内での改変等も歓迎ですので、もしフィードバックなどありましたらGitHubやTwitterでご連絡いただけますと幸いです。