メインコンテンツへスキップ

リアルタイム

WSS wss://test.kailin.com.cn/v1/realtime

WebSocket ベースのリアルタイム双方向音声会話(OpenAI Realtime プロトコル)— 音声アシスタント、ライブ翻訳などの低レイテンシが求められる用途向けです。

接続​

モデル名はクエリ文字列で指定します。認証は HTTP エンドポイントと同じです:

wss://test.kailin.com.cn/v1/realtime?model=gpt-4o-realtime-preview
const ws = new WebSocket(
'wss://test.kailin.com.cn/v1/realtime?model=gpt-4o-realtime-preview',
{
headers: {
Authorization: 'Bearer sk-your-token',
'OpenAI-Beta': 'realtime=v1',
},
}
);
備考

ブラウザーの new WebSocket はカスタムヘッダーを設定できません。サブプロトコルパラメーターでトークンを渡すか、WebSocket を自分のバックエンド経由でプロキシしてください(推奨 — トークンをフロントエンドに置かずに済みます)。

メッセージ形式​

すべてのメッセージは type フィールドを持つ JSON テキストフレームです。

セッションのセットアップ​

接続後、サーバーは session.created を送信します。クライアントは通常、最初に session.update を送って音声とターン検出を設定します:

{
"type": "session.update",
"session": {
"instructions": "You are a voice assistant. Keep answers short.",
"voice": "alloy",
"input_audio_format": "pcm16",
"output_audio_format": "pcm16",
"input_audio_transcription": { "model": "whisper-1" },
"turn_detection": { "type": "server_vad" }
}
}

ユーザー音声の送信​

音声は、Base64 エンコードした PCM16(24kHz モノラル)のチャンクとして送信します:

{ "type": "input_audio_buffer.append", "audio": "<base64 pcm16>" }
{ "type": "input_audio_buffer.commit" }

server_vad を有効にすると、サーバーが発話の終わりを検出して自動的に commit します — 手動の commit は不要です。

レスポンスのトリガー​

{
"type": "response.create",
"response": { "modalities": ["text", "audio"], "instructions": "Be enthusiastic." }
}

サーバーイベント​

イベント説明
session.created / session.updatedセッション作成 / 設定適用
input_audio_buffer.speech_started / _stoppedVAD が発話の開始 / 終了を検出
input_audio_buffer.committed音声バッファが commit された
conversation.item.created会話アイテムが作成された
response.audio_transcript.delta / _done応答の文字起こしの差分 / 完了
response.audio.delta / _done応答音声の差分(Base64 PCM16)
response.text.delta / _doneテキストのみの応答の差分
response.done現在のレスポンスが完了
errorエラーイベント

フロー全体の例​

const ws = new WebSocket(url);

ws.onopen = () => {
ws.send(JSON.stringify({
type: 'session.update',
session: { voice: 'alloy', turn_detection: { type: 'server_vad' } },
}));
// send an audio chunk…
ws.send(JSON.stringify({
type: 'input_audio_buffer.append',
audio: btoa(String.fromCharCode(...pcmChunk)),
}));
};

ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
switch (msg.type) {
case 'response.audio.delta':
playPcmChunk(atob(msg.delta));
break;
case 'response.audio_transcript.delta':
appendSubtitle(msg.delta);
break;
case 'response.done':
console.log('turn finished', msg.response.usage);
break;
}
};
注意

Realtime エンドポイントは音声の長さに応じて課金され、テキストより大幅に高コストです。テスト中はセッションの長さに注意してください。利用可否はチャネルに設定されたモデルに依存します。