7月6日、Michal Sutterが「OpenAI Releases GPT-Realtime-2.1 and GPT-Realtime-2.1-mini for Low-Latency Voice Agents in the API」と題した記事を公開した。OpenAIがリアルタイム音声APIに推論機能を統合した新モデル2種を発表し、p95レイテンシを25%以上削減したことについて詳しく紹介されている。
ミニモデルに推論が来た——これが今回の肝
OpenAIがRealtime APIにgpt-realtime-2.1とgpt-realtime-2.1-miniの2モデルを追加した。公式のRealtime APIドキュメントはOpenAI Platform Docsで参照できる。
注目すべきはgpt-realtime-2.1-miniだ。従来のgpt-realtime-miniと同じ料金体系を維持しながら、推論(reasoning)機能を追加した。推論機能とは、モデルが発話する前に内部で思考するステップを持つことを指す。これがリアルタイム音声にどう効くかは後述する。
さらに全Realtimeボイスモデルでp95レイテンシを少なくとも25%削減した。p95レイテンシとは応答時間の95パーセンタイル値、すなわちユーザーが「遅い」と感じる遅延の上限を示す指標だ。この削減はキャッシュ機構の改善によるものとされている。
なぜ音声エージェントに推論が必要なのか
音声エージェントの典型的な問題がある。モデルがツール(外部関数)を呼び出している間、無音状態になる。ユーザーは通話が切れたと思い、割り込む。結果として会話状態が壊れる。
推論機能があれば、モデルは処理中に「確認しています」と発話しながら動作できる。ツール呼び出しと発話を並行させることで、多段階の音声タスクを会話として成立させられる。
推論の強度はminimal、low、medium、high、xhighの5段階で設定可能だ。デフォルトはlowで、本番の音声エージェントはまずlowから始めることをOpenAIは推奨している。強度を上げると、レイテンシと出力トークン数の両方が増加する。
Realtime APIのアーキテクチャ
Realtime APIは単一モデルで音声の入出力を完結させる設計だ。音声認識(STT)と音声合成(TTS)を別々のシステムに繋ぐ構成と比べ、レイテンシが下がり、声のニュアンスも保ちやすい。
ブラウザからの接続はWebRTC経由で行う。APIキーはサーバー側に保持し、短命なクライアントシークレットをブラウザに渡す構成だ。以下はそのコード例だ。
サーバー側:クライアントシークレットの発行
// Server: mint a short-lived client secret (API key stays server-side)
const r = await fetch("https://api.openai.com/v1/realtime/client_secrets", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
session: {
type: "realtime",
model: "gpt-realtime-2.1-mini",
instructions: "You are a support agent. Reply in one or two short sentences.",
reasoning: { effort: "low" },
tools: [
{
type: "function",
name: "lookup_account",
description: "Look up a customer account by email.",
parameters: {
type: "object",
properties: { email: { type: "string" } },
required: ["email"]
}
}
],
tool_choice: "auto"
}
})
});
const { value: EPHEMERAL_KEY } = await r.json();
ブラウザ側:WebRTC接続
// Browser: connect to the Realtime API over WebRTC
const pc = new RTCPeerConnection();
const audioEl = document.createElement("audio");
audioEl.autoplay = true;
pc.ontrack = (e) => { audioEl.srcObject = e.streams[0]; };
const mic = await navigator.mediaDevices.getUserMedia({ audio: true });
pc.addTrack(mic.getTracks()[0]);
const events = pc.createDataChannel("oai-events");
events.addEventListener("message", (e) => console.log(JSON.parse(e.data)));
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const sdp = await fetch("https://api.openai.com/v1/realtime/calls", {
method: "POST",
body: offer.sdp,
headers: {
Authorization: `Bearer ${EPHEMERAL_KEY}`,
"Content-Type": "application/sdp"
}
});
await pc.setRemoteDescription({ type: "answer", sdp: await sdp.text() });
サーバーメディアパイプラインはWebSocket、電話系統はSIPでの接続もサポートする。
料金体系
以下が公開されている料金だ(1Mトークンあたり)。
| 項目 | gpt-realtime-2.1 | gpt-realtime-2.1-mini | gpt-realtime-mini(旧) |
|---|---|---|---|
| 推論 | あり(強度設定可) | あり(ミニ推論) | なし |
| ツール呼び出し | あり | あり | あり |
| テキスト入力 | $4.00 | $0.60 | $0.60 |
| テキストキャッシュ入力 | $0.40 | $0.06 | $0.06 |
| テキスト出力 | $24.00 | $2.40 | $2.40 |
| 音声入力 | $32.00 | $10.00 | $10.00 |
| 音声キャッシュ入力 | $0.40 | $0.30 | $0.30 |
| 音声出力 | $64.00 | $20.00 | $20.00 |
| 画像入力 | $5.00 | $0.80 | $0.80 |
※画像入力については、元記事ではRealtime APIの料金表にそのまま記載されているが、現時点でのRealtime APIがどの範囲でマルチモーダル入力(画像)に対応しているかは元記事では詳述されていない。利用前に公式ドキュメントで最新の対応状況を確認することを推奨する。
音声出力のコストはgpt-realtime-2.1-mini($20.00)とgpt-realtime-2.1($64.00)で約3倍の差がある。
キャッシュの効果が大きい点も押さえておきたい。音声のキャッシュ入力は$0.30/1Mだが、非キャッシュは$10.00/1Mだ。最初のターン以降、システムプロンプトはキャッシュされるため、セッションが長いほどコストメリットが出る。
2モデルの使い分け
- **
gpt-realtime-2.1**:高精度な推論、ツール利用、指示追従、音声エージェント性能を重視する場合。英数字認識の改善や、無音・ノイズ処理、割り込み対応も強化されている。 - **
gpt-realtime-2.1-mini**:速度とコスト効率を優先する場合。旧miniと同価格で推論機能が使える。
留意点
- 音声トークン料金をコール単位のコストに換算しにくい
- 推論強度を上げると、レイテンシと出力トークン数が増加する
- セッションが長くなると、コンテキストの再送によって入力コストが増大する。定期的なコンテキスト刈り込みが必要になる
詳細はOpenAI Releases GPT-Realtime-2.1 and GPT-Realtime-2.1-mini for Low-Latency Voice Agents in the APIを参照していただきたい。