概要
Realtimeモデルは長時間維持されるWebSocket接続上で動作します。音声をストリーミングで入力し、音声をストリーミングで出力し、モデルは発話の途中でも割り込まれることがあります。「録音、アップロード、待機、再生」というサイクルは必要ありません。ASR + テキストモデル + TTSをつなぎ合わせる場合との違いは、これがエンドツーエンドであることです。モデルは声のトーン、間、感情を直接聞き取り、直接発話します。レイテンシーはサブ秒の範囲に収まります。 APIYIでは現在、2つのプロトコルにまたがる4モデルを提供しており、1つのエンドポイントと1つのキーを共有します。gpt-realtime-2.1/gpt-realtime-2.1-mini— OpenAI Realtime GAプロトコルqwen3.5-omni-plus-realtime/qwen3.5-omni-flash-realtime— Alibaba Cloud Model Studioプロトコル
server_vadおよびsemantic_vadによるターン検出、結果の注入を含む完全なファンクションコールのラウンドトリップ、画像入力、そしてモダリティごとに分離されたusage。上記すべては4モデルで検証済みです(初回検証:2026-08-24、再検証:2026-09-14、UTC+8)。modelパラメータだけを変更しても動作しません。これは、統合時に最もよく発生する失敗です。違いは6つのフィールドと3つのイベント名に集約されており、すべて以下の「プロトコル比較」に一覧されています。WeComサポート
APIマニュアル
キーとグループ
呼び出しログ
AIエージェントに統合作業を任せる
.md を付けてください)。その後、あなたのスタック向けのコードを書きます。2つのフィールドファミリー、サンプルレートの厳格な下限、キャンセルの挙動、アイドル切断はすべて要件に組み込まれています。コーディングエージェントに Realtime 音声の統合またはトラブルシューティングをさせてください。Codex、Claude Code、Cursor などのツールにコピー&ペーストしてください。
このプロンプトで回避できること
このプロンプトで回避できること
リアルタイム音声に APIYI を選ぶ理由
1つのキー、4つのモデル
wss エンドポイント、同じ認証です。モデルの切り替えは model パラメータと対応するフィールドテンプレートを変更するだけで、2つ目のベンダーアカウントを管理する必要はありません。直接アクセス、海外でのセットアップ不要
api.apiyi.com にアクセスできます。上流ベンダーのアカウント、本人確認、事前入金は必要ありません。プロトコルの違いをあらかじめ整理済み
テキストによる無料のセルフテスト
実測レイテンシーと同時実行数
エンジニアによる直接サポート
コア機能
双方向ストリーミング、割り込み可能
response.cancelをいつでも送信できます。セッションは維持され、コンテキストは保持されます。4つのモデルすべてで検証済みです。2つのターン検出モード
server_vadは無音時間で分割し、semantic_vadは意図で分割します(「uh-huh」のようなフィラーワードを無視するのがより得意です)。どちらも4つのモデルすべてで検証済みです。完全な関数呼び出しループ
function_call_outputが結果を注入し、モデルは会話を続けます。4つのモデルすべてでエンドツーエンドに検証済みです。画像入力、モダリティごとの使用量
usageは text / audio / image tokens を個別に返すため、コストを割り当てられます。4つのモデルすべてで検証済みです。対応モデル
料金
gpt-realtime-2.1 では、音声入力は $32、テキスト入力は $4、音声出力は $64、テキスト出力は $24)。統合時はテキストのみで実行し、チェーンの検証後に音声へ切り替えてください。以下の「テキストから開始」を参照してください。Realtime GA プロトコル
Model Studio プロトコル
課金ディメンションが異なります。画像入力はテキスト階層に含まれ、出力は「テキストのみ」と「テキスト + 音声」に分かれます(後者のレートで課金されるのは音声部分のみです)。response.cancel)は実際に生成された分のみが課金され、空のセッションは課金されません。キャッシュ済み入力はまだ割引されません: キャッシュヒットは usage.cached_tokens に正確に報告されますが、APIYI では現在、対応するテキスト入力レートで課金しています。課金経路が修正され次第、公式キャッシュレートが自動的に適用され、変更履歴でお知らせします。料金はベンダーのポリシーおよび供給状況により変更される場合があります。この機能は、供給を確保し顧客にサービスを提供するために提供しており、利益目的の掲載ではありません。アクセスグループ
技術仕様
測定済みのレイテンシーと同時実行数
2026-09-14(UTC+8)に、公開api.apiyi.com パス上で、gpt-realtime-2.1 と -mini をそれぞれ20および40同時セッションで測定しました。1ターンのテキストのみのやり取りです。
エンドポイント
model クエリパラメータで接続先のモデルを選択します。
⚠️ プロトコル比較(モデルを切り替える前にお読みください)
この2つのファミリーは、endpoint、auth scheme、そして全体のイベントフローを共有しています。違いはsession.update フィールド構造と、いくつかのサーバーイベント名に集中しています。
リクエストフィールドの比較
サーバーイベントの比較
session.created, session.updated, conversation.item.create, input_audio_buffer.append, input_audio_buffer.commit, response.create, response.cancel, response.done — は、両方で同一の名前です。
session.update ペイロードの最小例を2つ
同じ内容を2回書いたものです。そのままコピーしてください。Model Studioプロトコル:テキストから始める: テキストチャネルの役割と3段階のセルフテスト
オーディオパイプラインには、マイクの取り込み、リサンプリング、チャンク分割、ターン検出が含まれます。どこか1か所でも壊れると、「何も起きない」として現れ、原因特定が難しくなります。ですので、マイクから始めないでください。テキストは制御プレーンであり、フォールバック入力ではありません
リアルタイム音声モデルにおいて、テキストは「入力を送る別の方法」ではなく、音声ストリーム以外の、制御チャネルのすべてです。3段階のセルフテスト
ステップ1: テキストのみ、マイクなし
output_modalitiesをテキストのみに設定し、ターン検出を無効化して、input_textを1回送信します。これだけで、ハンドシェイク、キーとグループ、正しいフィールドテンプレートを選んだかどうか、session.updateが反映されたかどうか、ツールが正しく注入されるかどうか、複数ターンのコンテキストが保持されるかどうか、そして同時実行数の挙動を確認できます。音声tokenはまったく生成されません。ステップ2: ローカルのwavファイルを再生する
input_audio_buffer.appendに流し込みます。これにより、オーディオパイプライン(フォーマット、サンプルレート、チャンク分割、commit、VADトリガー)を業務ロジックから切り離せて、再現可能になります — 同じファイルなら2回とも同じ結果になるはずです。ステップ3: ライブマイクを接続する
実行可能なテキストのスモークテスト
websockets(pip install websockets)だけに依存します。1つの変数を切り替えるだけでプロトコルを変更できます:
セッション機能: ボイス、ターン検出、tools、画像
ボイス
ターン検出: server_vad と semantic_vad
server_vad— 無音の継続時間で分割し、パラメータはシンプルです(threshold、silence_duration_ms、prefix_padding_ms)。semantic_vad— 会話の意図で分割し、フィラー語や意味のない背景ノイズを無視します。複数話者環境でより堅牢です。- ターン検出(
nullまたはnone)を無効化して、手動モードで実行することもできます。input_audio_buffer.commitを自分で送信し、その後response.createを送ります。これは、UI がターンを制御するプッシュトゥトークのインターフェースに適しています。
関数呼び出し
イベント順序: モデルはresponse.output_item.done を function_call 型で出力し(call_id と arguments を含む)→ クライアントがそれを実行 → 結果が注入される → 別の response.create によりモデルが続行します。
画像入力
Realtime GA プロトコル:input_image をメッセージに直接入れてください。値にはデータ URI を指定できます。
Error append image before append audio. になります。テストでは、input_image_buffer.append を input_audio_buffer.append ストリームに 1 秒あたり約 1 フレームの割合で交互に挿入する方法が機能しました。
既知の制限事項
以下の各項目は測定済みであり、すべてクライアントコードに影響します。統合する前にお読みください。ベストプラクティス
まずプロトコルファミリーごとにフィールドテンプレートを選ぶ
session.update ペイロードは、if 分岐を散らすのではなく、モデル名で選択する2つの設定定数として記述してください。これは、6か月後の保守時に最も壊れやすい部分です。最初のフレームでセッションパラメータを固定する
output_modalities、voice、speed、turn_detection、transcription を、最初の session.update で必ず設定してください。音声は特に重要です。いったんオーディオが生成されたら手遅れです。オーディオを追加する前にテキストのスモークテストを通す
サンプルレートとチャネルはクライアント側で変換する
タイムアウト付きで output_item.done で完了処理する
response.done だけを待たないでください。この方法は両方のファミリーで正しく、ユーザーが中断したときにターンがハングするのを防げます。長いセッションには keepalive と再接続を追加する
expires_at に注意してください。再接続後は、session.update と必要なコンテキストを再送してください。そうしないと、新しいセッションはデフォルト設定で動作します。本番環境ではバックエンドリレーを使う
エラーとリトライ
event_idとセッションのsession.idを記録し、問題を報告する際に含めてください。診断時間を大幅に短縮できます。また、Realtime GAのエラーオブジェクトにはcodeとparamが含まれます(正確なフィールドと、そのフィールドで受け付けられる値が示されます)。一方、Model Studioのエラーメッセージはより大まかな内容です。デバッグ時は、まず前者でフィールド構文を検証してください。よくある質問
このページにインタラクティブなプレイグラウンドがないのはなぜですか?
このページにインタラクティブなプレイグラウンドがないのはなぜですか?
モデル名だけを変更して、4 つのモデルを切り替えられますか?
モデル名だけを変更して、4 つのモデルを切り替えられますか?
modalities ↔ output_modalities、voice ↔ audio.output.voice、input_audio_format ↔ audio.input.format、turn_detection ↔ audio.input.turn_detection、input_audio_transcription ↔ audio.input.transcription、さらにイベント名の response.text.delta ↔ response.output_text.delta と response.audio.delta ↔ response.output_audio.delta です。完全な対応関係については、プロトコル比較セクションを参照してください。ハンドシェイクが完全に失敗します。どのようにデバッグすればよいですか?
ハンドシェイクが完全に失敗します。どのようにデバッグすればよいですか?
wss:// であり、https:// ではないこと。2. エンドポイントに ?model=<model-name> が含まれていること。3. Authorization: Bearer <key> ヘッダーが存在すること。4. キーのグループにモデルが含まれていること(4 つすべてデフォルトグループに含まれます。不一致の場合は「利用可能なチャネルがありません」というメッセージとともに 503 が返されます)。5. 中間のリバースプロキシが Upgrade ヘッダーを削除していないこと。これは独自のゲートウェイ経由でリレーする場合によくある問題です。ブラウザから接続できますか?キーが漏洩することはありませんか?
ブラウザから接続できますか?キーが漏洩することはありませんか?
Sec-WebSocket-Protocol サブプロトコル経由の認証を受け付けるため、ブラウザ WebSocket から直接接続できます。ただし、キーをブラウザに渡すことになります。その場合、すべての訪問者がネットワークパネルからキーを読み取れるため、ローカルでの検証にのみ適しています。本番環境ではバックエンドリレーを作成してください。バックエンドがキーを保持して APIYI への接続を開き、フロントエンドは独自のサービスとのみ通信する構成にします。gpt-realtime-2.1 に 16 kHz の音声を送信すると失敗します。なぜですか?
gpt-realtime-2.1 に 16 kHz の音声を送信すると失敗します。なぜですか?
integer_below_min_value が返されます。正しい形式は "audio": {"input": {"format": {"type": "audio/pcm", "rate": 24000}}} です。2 つの Model Studio モデルでは 16 kHz が必要であり、この 2 つは互換性がありません。マイクがない、または音声のテストが難しい場合はどうすればよいですか?
マイクがない、または音声のテストが難しい場合はどうすればよいですか?
say と afconvert を使って 1 行で生成できます。コマンドはそのセクションに記載されています。response.cancel を送信した後、response.done をまったく受信しません。
response.cancel を送信した後、response.done をまったく受信しません。
response.text.done、response.content_part.done、response.output_item.done を受信しますが、response.done は配信されません。ターン終了シグナルとして response.output_item.done を使用し、バックストップとしてタイムアウトを追加してください。 セッション自体には影響がなく、会話は通常どおり続行されます。2 つの Realtime GA モデルでは、この動作は正常です。接続が約 5 分後に切断されます。
接続が約 5 分後に切断されます。
session.update)を定期的に送信するか、切断を受け入れて自動的に再接続してください。再接続後は、session.update と必要なコンテキストを再送することを忘れないでください。1 つのセッションをどのくらい長く開いたままにできますか?
1 つのセッションをどのくらい長く開いたままにできますか?
session.created イベントに expires_at が含まれます。接続からおよそ 30 分後にこの値に達し、その後は再接続が必要です。Model Studio プロトコルで主に確認された制約は、300 秒間のアイドル切断です。長い会話はセッションが期限切れになる前提で設計し、セッション間でコンテキストを引き継ぐ方法を計画してください。音声をどのように設定すればよいですか?また、変更すると cannot_update_voice が返されるのはなぜですか?
音声をどのように設定すればよいですか?また、変更すると cannot_update_voice が返されるのはなぜですか?
session.update で設定します。Model Studio ではトップレベルの voice、Realtime GA では audio.output.voice です。セッションで音声出力が生成された後は、音声を変更できません。これは両方のプロトコルに適用され、cannot_update_voice が返されます。最初のフレームで音声を固定し、切り替える場合は新しいセッションを開始してください。また、Model Studio では音声に空文字列を送信しないでください。400 が返されます。手動コミットモードで入力文字起こしが取得できません。
手動コミットモードで入力文字起こしが取得できません。
flash モデルは、手動 commit モードで文字起こし完了イベントを配信しません(複数回の実行で一貫して再現)。plus モデルでは配信され、どちらのモデルも VAD モードでは動作します。server_vad または semantic_vad に切り替えてください。 テストでは、この場合、文字起こしテキストが delta イベントの未文書化フィールドに格納されることが確認されています。ただし、そのフィールドはいつでも変更される可能性があり、依存すべきではありません。これは UI にユーザーの発話内容を表示する場合にのみ影響します。会話には影響せず、モデルは音声を正しく理解して回答します。画像入力はサポートされていますか?Error append image before append audio. が表示されるのはなぜですか?
画像入力はサポートされていますか?Error append image before append audio. が表示されるのはなぜですか?
input_image をメッセージ内に直接配置します。Model Studio では画像をビデオフレームとして扱うため、画像より前に音声を追加する必要があり、それがこのエラーの原因です。テストで動作した方法は、音声ストリームに画像フレームを 1 秒あたりおよそ 1 フレームの割合でインターリーブすることです。プロンプトキャッシュはありますか?キャッシュヒットをどのように確認できますか?
プロンプトキャッシュはありますか?キャッシュヒットをどのように確認できますか?
usage.input_token_details.cached_tokens に値が入りました(少なくとも 1024 token のプレフィックス、128 token 単位)。現在、APIYI はキャッシュされた token をテキスト入力の通常料金で課金していることに注意してください。割引が提供開始され次第、変更履歴で告知されます。2 つの Model Studio モデルではキャッシュヒットは確認されませんでした。WebRTC、SIP、またはエフェメラルキー(client_secrets)はサポートされていますか?
WebRTC、SIP、またはエフェメラルキー(client_secrets)はサポートされていますか?
POST /v1/realtime/client_secrets と POST /v1/realtime/calls はどちらも APIYI で 404 を返し、SIP も利用できません。単一の wss://api.apiyi.com/v1/realtime WebSocket エンドポイントのみがエントリーポイントです。ブラウザまたはモバイルクライアントでは、バックエンドリレーを作成してください。バックエンドがキーを保持して WebSocket を開き、フロントエンドは独自のサービスとのみ通信する構成にします。reasoning.effort や noise_reduction などの GA セッションフィールドは、gpt-realtime-2.1 で機能しますか?
reasoning.effort や noise_reduction などの GA セッションフィールドは、gpt-realtime-2.1 で機能しますか?
session.updated にエコーバックされました:reasoning.effort(minimal / low / medium / high / xhigh、両方のモデルで受け付けられます)、audio.input.noise_reduction、audio.input.turn_detection.idle_timeout_ms、audio.input.transcription.model(gpt-realtime-whisper を含む)、truncation、tracing、max_output_tokens、parallel_tool_calls です。フィールドのセマンティクスは OpenAI のリファレンスに従い、ゲートウェイによる書き換えはありません。コストをどのように見積もればよいですか?テキストと音声は別々に課金されますか?
コストをどのように見積もればよいですか?テキストと音声は別々に課金されますか?
response.done 上の usage オブジェクトは、モダリティごとの token(テキスト / 音声 / 画像を入力と出力で個別に集計)を報告するため、コストを割り当てられます。通話ログの詳細ビューにも、完了した response.done ごとに 1 レコードとして、同じモダリティ別の usage が表示されます。音声の料金階層はテキストより大幅に高いため、統合時にはテキストのみの利用を推奨します。実際の請求額については、通話ログを参照してください。