コンテンツにスキップ

OpenAI リアルタイム対話インターフェース

OpenAI リアルタイム対話インターフェース

Section titled “OpenAI リアルタイム対話インターフェース”

このページの概要

公式ドキュメント

  • OpenAI Realtime WebRTC
  • OpenAI Realtime WebSocket

OpenAI Realtime API は、2つの接続方式を提供します。

  • WebRTC - ブラウザやモバイルクライアントでのリアルタイム音声・映像のやり取りに適しています
  • WebSocket - サーバー間のアプリケーション統合に適しています
  • リアルタイム音声対話
  • 音声・映像会議
  • リアルタイム翻訳
  • 音声文字起こし
  • リアルタイムコード生成
  • サーバー側のリアルタイム統合
  • 双方向音声ストリーム転送
  • テキストと音声を組み合わせた対話
  • 関数呼び出し対応
  • 自動音声検出(VAD)
  • 音声文字起こし機能
  • WebSocket を使ったサーバー側統合
  • 標準 API キー(サーバー側のみで使用)
  • 一時トークン(クライアント側で使用)
  • 有効期限: 1分
  • 使用制限: 1接続につき1つ
  • 取得方法: サーバー側 API で作成
POST https://4All API地址/v1/realtime/sessions
Content-Type: application/json
Authorization: Bearer $4All API_API_KEY
{
"model": "gpt-4o-realtime-preview-2024-12-17",
"voice": "verse"
}
  • 標準 API キーをクライアントに絶対に公開しない
  • 通信には HTTPS/WSS を使用する
  • 適切なアクセス制御を実装する
  • 不審なアクティビティを監視する
  • URL: https://4All API地址/v1/realtime
  • クエリパラメータ: model
  • リクエストヘッダー:
  • Authorization: Bearer EPHEMERAL_KEY
  • Content-Type: application/sdp
  • URL: wss://4All API地址/v1/realtime
  • クエリパラメータ: model
  • リクエストヘッダー:
  • Authorization: Bearer YOUR_API_KEY
  • OpenAI-Beta: realtime=v1
  • 名前: oai-events
  • 用途: イベント転送
  • 形式: JSON
  • 入力: addTrack()
  • 出力: ontrack イベント
  • テキストのみの対話
  • 音声対話
  • テキストと音声の混在対話
  • 会話の作成
  • 会話の更新
  • 会話の終了
  • 会話設定
  • テキストイベント
  • 音声イベント
  • 関数呼び出し
  • 状態更新
  • エラーイベント
  • 入力形式
  • pcm16
  • g711_ulaw
  • g711_alaw
  • 出力形式
  • pcm16
  • g711_ulaw
  • g711_alaw
  • 音声タイプ
  • alloy
  • echo
  • shimmer
  • 温度
  • 最大出力長
  • システムプロンプト
  • ツール設定
  • 閾値
  • 無音継続時間
  • プレフィックスパディング

クライアント実装 (ブラウザ)✅

Section titled “クライアント実装 (ブラウザ)✅”
async function init() {
// サーバーから一時キーを取得 - 下記のサーバーコードを参照
const tokenResponse = await fetch("/session");
const data = await tokenResponse.json();
const EPHEMERAL_KEY = data.client_secret.value;
// ピア接続を作成
const pc = new RTCPeerConnection();
// モデルが返すリモート音声の再生を設定
const audioEl = document.createElement("audio");
audioEl.autoplay = true;
pc.ontrack = e => audioEl.srcObject = e.streams[0];
// ブラウザのマイク入力からローカル音声トラックを追加
const ms = await navigator.mediaDevices.getUserMedia({
audio: true
});
pc.addTrack(ms.getTracks()[0]);
// イベント送受信用のデータチャネルを設定
const dc = pc.createDataChannel("oai-events");
dc.addEventListener("message", (e) => {
// ここでリアルタイムサーバーイベントを受信します!
console.log(e);
});
// セッション記述プロトコル(SDP)を使ってセッションを開始
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const baseUrl = "https://4All API地址/v1/realtime";
const model = "gpt-4o-realtime-preview-2024-12-17";
const sdpResponse = await fetch(`${baseUrl}?model=${model}`, {
method: "POST",
body: offer.sdp,
headers: {
Authorization: `Bearer ${EPHEMERAL_KEY}`,
"Content-Type": "application/sdp"
},
});
const answer = {
type: "answer",
sdp: await sdpResponse.text(),
};
await pc.setRemoteDescription(answer);
}
init();
import express from "express";
const app = express();
// 一時トークンを生成するためのエンドポイントを作成
// このエンドポイントは上記のクライアントコードと連携して使用します
app.get("/session", async (req, res) => {
const r = await fetch("https://4All API地址/v1/realtime/sessions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.4All API_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4o-realtime-preview-2024-12-17",
voice: "verse",
}),
});
const data = await r.json();
// OpenAI REST API から受け取った JSON をクライアントに返す
res.send(data);
});
app.listen(3000);
// ピア接続からデータチャネルを作成
const dc = pc.createDataChannel("oai-events");
// データチャネル上でサーバーイベントを監視
// イベントデータは JSON 文字列からパースする必要があります
dc.addEventListener("message", (e) => {
const realtimeEvent = JSON.parse(e.data);
console.log(realtimeEvent);
});
// クライアントイベントを送信: 有効なクライアントイベントを
// JSON にシリアライズし、データチャネル経由で送信
const responseCreate = {
type: "response.create",
response: {
modalities: ["text"],
instructions: "Write a haiku about code",
},
};
dc.send(JSON.stringify(responseCreate));
import WebSocket from "ws";
const url = "wss://4All API地址/v1/realtime?model=gpt-4o-realtime-preview-2024-12-17";
const ws = new WebSocket(url, {
headers: {
"Authorization": "Bearer " + process.env.4All API_API_KEY,
"OpenAI-Beta": "realtime=v1",
},
});
ws.on("open", function open() {
console.log("Connected to server.");
});
ws.on("message", function incoming(message) {
console.log(JSON.parse(message.toString()));
});
# 必要なライブラリ:
# pip install websocket-client
import os
import json
import websocket
NEW_API_KEY = os.environ.get("4All API_API_KEY")
url = "wss://4All API地址/v1/realtime?model=gpt-4o-realtime-preview-2024-12-17"
headers = [
"Authorization: Bearer " + 4All API_API_KEY,
"OpenAI-Beta: realtime=v1"
]
def on_open(ws):
print("Connected to server.")
def on_message(ws, message):
data = json.loads(message)
print("Received event:", json.dumps(data, indent=2))
ws = websocket.WebSocketApp(
url,
header=headers,
on_open=on_open,
on_message=on_message,
)
ws.run_forever()
/*
注意: ブラウザなどのクライアント環境では、WebRTC の使用を推奨します。
ただし、Deno や Cloudflare Workers のようなブラウザ風環境では、
標準の WebSocket インターフェースも使用できます。
*/
const ws = new WebSocket(
"wss://4All API地址/v1/realtime?model=gpt-4o-realtime-preview-2024-12-17",
[
"realtime",
// 認証
"openai-insecure-api-key." + 4All API_API_KEY,
// 任意
"openai-organization." + OPENAI_ORG_ID,
"openai-project." + OPENAI_PROJECT_ID,
// Beta プロトコル、必須
"openai-beta.realtime-v1"
]
);
ws.on("open", function open() {
console.log("Connected to server.");
});
ws.on("message", function incoming(message) {
console.log(message.data);
});
// サーバーイベントを受信
ws.on("message", function incoming(message) {
// メッセージデータは JSON からパースする必要があります
const serverEvent = JSON.parse(message.data)
console.log(serverEvent);
});
// イベントを送信: クライアントイベント形式に合う JSON データ構造を作成
const event = {
type: "response.create",
response: {
modalities: ["audio", "text"],
instructions: "Give me a haiku about code.",
}
};
ws.send(JSON.stringify(event));
# クライアントイベントを送信: 辞書を JSON にシリアライズ
def on_open(ws):
print("Connected to server.")
event = {
"type": "response.create",
"response": {
"modalities": ["text"],
"instructions": "Please assist the user."
}
}
ws.send(json.dumps(event))
# メッセージ受信時はメッセージ本体を JSON からパースする必要があります
def on_message(ws, message):
data = json.loads(message)
print("Received event:", json.dumps(data, indent=2))
  • 接続エラー
  • ネットワーク問題
  • 認証失敗
  • 設定ミス
  • 音声エラー
  • デバイス権限
  • 未対応フォーマット
  • コーデック問題
  • 会話エラー
  • トークン期限切れ
  • セッションタイムアウト
  • 同時実行制限
  • 自動再接続
  • セッション復元
  • エラーの再試行
  • フォールバック処理

すべてのイベントには、以下のリクエストヘッダーが必要です。

リクエストヘッダー種類説明
Authorization文字列認証トークンBearer $NEW_API_KEY
OpenAI-Beta文字列API バージョンrealtime=v1

会話のデフォルト設定を更新します。

パラメータ種類必須説明例/選択肢
event_id文字列いいえクライアント生成のイベント識別子event_123
type文字列いいえイベント種別session.update
modalities文字列配列いいえモデルが応答できるモダリティ[“text”, “audio”]
instructions文字列いいえモデル呼び出し前に設定されるシステム指示”Your knowledge cutoff is 2023-10…“
voice文字列いいえモデルが使用する音声タイプalloy、echo、shimmer
input_audio_format文字列いいえ入力音声フォーマットpcm16、g711_ulaw、g711_alaw
output_audio_format文字列いいえ出力音声フォーマットpcm16、g711_ulaw、g711_alaw
input_audio_transcription.model文字列いいえ文字起こしに使用するモデルwhisper-1
turn_detection.type文字列いいえ音声検出タイプserver_vad
turn_detection.threshold数値いいえVAD の有効化しきい値(0.0-1.0)0.8
turn_detection.prefix_padding_ms整数いいえ発話開始前に含める音声の長さ500
turn_detection.silence_duration_ms整数いいえ発話終了を検出するための無音継続時間1000
tools配列いいえモデルが利用できるツール一覧[]
tool_choice文字列いいえモデルがツールを選択する方法auto/none/required
temperature数値いいえモデルのサンプリング温度0.8
max_output_tokens文字列/整数いいえ1回の応答で生成可能な最大 token 数”inf”/4096

入力音声バッファに音声データを追加します。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_456
type文字列いいえイベント種別input_audio_buffer.append
audio文字列いいえBase64 エンコードされた音声データBase64EncodedAudioData

バッファ内の音声データをユーザーメッセージとして確定します。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_789
type文字列いいえイベント種別input_audio_buffer.commit

入力音声バッファ内のすべての音声データを消去します。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_012
type文字列いいえイベント種別input_audio_buffer.clear

会話に新しいアイテムを追加します。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_345
type文字列いいえイベント種別conversation.item.create
previous_item_id文字列いいえ新しい会話アイテムをこの ID の後に挿入しますnull
item.id文字列いいえ会話アイテムの一意識別子msg_001
item.type文字列いいえ会話アイテムの種別message/function_call/function_call_output
item.status文字列いいえ会話アイテムの状態completed/in_progress/incomplete
item.role文字列いいえメッセージ送信者の役割user/assistant/system
item.content配列いいえメッセージ内容[text/audio/transcript]
item.call_id文字列いいえ関数呼び出しの IDcall_001
item.name文字列いいえ呼び出された関数名function_name
item.arguments文字列いいえ関数呼び出しの引数{“param”: “value”}
item.output文字列いいえ関数呼び出しの出力結果{“result”: “value”}

アシスタントメッセージ内の音声コンテンツを切り詰めます。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_678
type文字列いいえイベント種別conversation.item.truncate
item_id文字列いいえ切り詰めるアシスタントメッセージアイテムの IDmsg_002
content_index整数いいえ切り詰め対象のコンテンツ部分のインデックス0
audio_end_ms整数いいえ音声切り詰めの終了時刻1500

会話履歴から指定の会話アイテムを削除します。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_901
type文字列いいえイベント種別conversation.item.delete
item_id文字列いいえ削除する会話アイテムの IDmsg_003

応答生成を開始します。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_234
type文字列いいえイベント種別response.create
response.modalities文字列配列いいえ応答のモダリティ[“text”, “audio”]
response.instructions文字列いいえモデルへの指示”Please assist the user.”
response.voice文字列いいえモデルが使用する音声タイプalloy/echo/shimmer
response.output_audio_format文字列いいえ出力音声フォーマットpcm16
response.tools配列いいえモデルが利用できるツール一覧[“type”, “name”, “description”]
response.tool_choice文字列いいえモデルがツールを選択する方法auto
response.temperature数値いいえサンプリング温度0.7
response.max_output_tokens整数/文字列いいえ最大出力 token 数150/“inf”

進行中の応答生成をキャンセルします。

パラメータ種類必須説明
event_id文字列いいえクライアント生成のイベント識別子event_567
type文字列いいえイベント種別response.cancel

エラー発生時に返されるイベントです。

パラメータ種類必須説明
event_id文字列配列いいえサーバーイベントの一意識別子[“event_890”]
type文字列いいえイベント種別error
error.type文字列いいえエラー種別invalid_request_error/server_error
error.code文字列いいえエラーコードinvalid_event
error.message文字列いいえ人間が読めるエラーメッセージ”The ‘type’ field is missing.”
error.param文字列いいえエラーに関連するパラメータnull
error.event_id文字列いいえ関連イベントの IDevent_567

conversation.item.input_audio_transcription.completed✅

Section titled “conversation.item.input_audio_transcription.completed✅”

入力音声の文字起こしが有効で、文字起こしに成功した場合に返されるイベントです。

パラメータ種類必須説明
event_id文字列いいえサーバーイベントの一意識別子event_2122
type文字列いいえイベント種別conversation.item.input_audio_transcription.completed
item_id文字列いいえユーザーメッセージアイテムの IDmsg_003
content_index整数いいえ音声を含むコンテンツ部分のインデックス0
transcript文字列いいえ文字起こしされたテキスト”Hello, how are you?“

conversation.item.input_audio_transcription.failed✅

Section titled “conversation.item.input_audio_transcription.failed✅”

入力音声の文字起こしが設定されているにもかかわらず、ユーザーメッセージの文字起こし要求に失敗した場合に返されるイベントです。

パラメータ種類必須説明
event_id文字列いいえサーバーイベントの一意識別子event_2324
type文字列配列いいえイベント類