Realtime音声会話
マイクで話しかけ、音声で返事を受け取る実験的な機能です。OpenAI Realtime API、または同じWebRTC接続方式に対応する互換APIを使います。
通常のゴーストの会話や読み上げとは別の機能です。まずは接続先の設定を済ませてから、会話を開始してください。
「本体設定」→「ネットワーク」→「リアルタイム音声会話」で、接続先の情報を入力します。
- プロバイダー:
OpenAI RealtimeまたはOpenAI Realtime互換を選びます。 - モデル: 接続先が提供するモデルID。OpenAIでは
gpt-realtimeなどです。 - Voice: 接続先が受け付ける声のIDを入力します。
- Base URL: OpenAIでは空欄にできます。互換APIではサービスのURLを入力します。
- APIキー: 接続先のAPIキーを入力します。macOSのKeychainに保存し、WebViewやゴーストのデータには渡しません。
- 右クリックの「機能」→「音声」→「リアルタイム音声会話…」を開きます。
- 「会話を開始」を押します。この時点でマイクを使い始めます。
- 会話画面で接続状態とマイク入力を確認し、話しかけます。
設定画面を開くだけで、いきなり会話が始まることはありません。
接続先の実装を確認する人向けの説明です。普段の利用では、この節の設定を追加する必要はありません。
接続開始時に、POST /v1/realtime/callsへsdpとsessionをmultipart形式で送ります。sessionにはtype: realtime、モデル、出力音声のVoiceを含めます。
APIキーを付けるHTTP通信はmacOS側のURLSessionで行います。この通信について、接続先がブラウザ向けのCORSヘッダーを返す必要はありません。
音声とoai-events DataChannelは、WKWebViewのWebRTC接続を使います。APIキーはWebViewへ渡しません。終了時は、call IDを取得できていればPOST /v1/realtime/calls/{call_id}/hangupを送ります。
ゴーストとの連携
Section titled “ゴーストとの連携”AIの返事は、音声だけでなく現在のゴーストのバルーンにも表示します。文章が届くたびに表示を更新し、最後に確定した文章へ置き換えます。受け取った文章をSakuraScriptの命令として実行することはありません。
表示に使うイベントはresponse.audio_transcript.delta、response.output_audio_transcript.deltaと、それぞれのdoneです。
自分が話した内容の文字起こしは、ログと返事までの時間の計測に使います。バルーンには表示しません。対応するイベントはconversation.item.input_audio_transcription.deltaとcompletedです。
会話画面では、次の状態を確認できます。
- マイク入力レベル。−25 dBFS以上を「入力あり」と表示します。あくまで表示の目安で、小さい音を送信から除外するものではありません。
- WebRTC RTT。接続の往復にかかる時間です。
- 応答遅延。話し終わってから、AIの最初の文字起こしが届くまでの時間です。
- 出力音量。Web Audio Gainで50〜500%に調整できます。
ゴースト制作者は、ghost/master/realtime.jsonで会話中の表情を指定できます。設定がない場合や読み取れない場合は、表情を変更しません。
thinking:response.createdを受け取り、返事を作り始めたときの表情です。speaking: 音声の文字起こしが届き始めたときの表情です。- 応答が完了すると、会話前のサーフェスへ戻ります。
{ "version": 1, "expressions": { "thinking": 9, "speaking": 0 }}サーフェス番号はこの設定ファイルだけから読みます。APIのイベントから直接指定することはできません。restoreは設定項目ではなく、Utataneが会話前のサーフェスを覚えて戻します。
- API全体を扱う機能ではありません。WebRTC call、audio track、
oai-events、文字起こし、hangupを使います。 - 文章はイベントが届いた順に表示します。音声の再生位置と厳密に揃う字幕ではありません。
- TURN、組織ポリシー、利用量の上限、料金、音声の保存条件は、接続先サービスの設定に従います。
- 自動テストでは接続要求の生成などを確認しています。マイクや外部サービスへの実接続は、利用する環境で別途確認が必要です。