コンテンツにスキップ

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やゴーストのデータには渡しません。
  1. 右クリックの「機能」→「音声」→「リアルタイム音声会話…」を開きます。
  2. 「会話を開始」を押します。この時点でマイクを使い始めます。
  3. 会話画面で接続状態とマイク入力を確認し、話しかけます。

設定画面を開くだけで、いきなり会話が始まることはありません。

接続先の実装を確認する人向けの説明です。普段の利用では、この節の設定を追加する必要はありません。

接続開始時に、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を送ります。

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、組織ポリシー、利用量の上限、料金、音声の保存条件は、接続先サービスの設定に従います。
  • 自動テストでは接続要求の生成などを確認しています。マイクや外部サービスへの実接続は、利用する環境で別途確認が必要です。