OpenAI Realtime API 国内使用指南
Realtime API 是 OpenAI 为低延迟语音/多模态交互设计的接口,核心是基于 WebSocket 的持久连接,而不是传统的请求-响应模式。对于要做语音助手、实时客服、AI 通话类产品的开发者,理解它的通信模型和国内接入方式是绕不开的一课。
一、Realtime API 解决的是什么问题
传统调用方式(先转文字、再调用 Chat Completions、再转语音)有两个明显缺陷:
- 延迟叠加:语音转文字(STT)+ 模型推理 + 文字转语音(TTS)三段串联,每段都有网络往返,累计延迟往往超过 2–3 秒
- 打断不自然:用户说话到一半想打断 AI 回复,传统三段式架构很难做到流畅的”抢话”体验
Realtime API 把这三步压缩进一个持久的 WebSocket 连接里,音频流直接进、直接出,模型内部处理语音理解和生成,省掉了中间的文字转换环节,端到端延迟通常能做到 500ms 以内。
二、核心通信模型:事件驱动的 WebSocket
Realtime API 不是简单的”发请求、等响应”,而是双向事件流:
客户端 → 服务端事件(举例):
session.update # 配置会话参数(模型、语音、指令)
input_audio_buffer.append # 追加一段音频数据
input_audio_buffer.commit # 提交音频缓冲区,触发处理
conversation.item.create # 手动插入一条对话内容
response.create # 请求模型生成回复
服务端 → 客户端事件(举例):
session.created
input_audio_buffer.speech_started # 检测到用户开始说话
input_audio_buffer.speech_stopped # 检测到用户停止说话
response.audio.delta # 流式返回的音频片段
response.audio_transcript.delta # 流式返回的文字转写
response.done # 本轮回复结束
理解这套事件模型是接入的关键:你不是”调用一次拿到一个结果”,而是监听一连串事件,按事件类型分别处理。
三、Python 快速接入示例
import asyncio
import json
import websockets
OPENAI_API_KEY = "your-api-key"
URL = "wss://api.openai.com/v1/realtime?model=gpt-realtime"
async def run_session():
headers = {"Authorization": f"Bearer {OPENAI_API_KEY}"}
async with websockets.connect(URL, additional_headers=headers) as ws:
# 1. 配置会话
await ws.send(json.dumps({
"type": "session.update",
"session": {
"modalities": ["audio", "text"],
"instructions": "你是一个中文语音客服助手,回答简洁友好。",
"voice": "alloy",
"input_audio_format": "pcm16",
"output_audio_format": "pcm16",
"turn_detection": {"type": "server_vad"}
}
}))
# 2. 监听事件循环
async for message in ws:
event = json.loads(message)
event_type = event.get("type")
if event_type == "response.audio.delta":
# 收到一段音频,追加播放
audio_chunk = event["delta"] # base64 编码的 PCM 数据
# play_audio(audio_chunk) # 实际项目中接入播放器
pass
elif event_type == "response.audio_transcript.delta":
print(event["delta"], end="", flush=True)
elif event_type == "response.done":
print("\n[本轮回复结束]")
asyncio.run(run_session())
关键点:turn_detection 设为 server_vad 后,服务端会自动检测语音的开始/结束(Voice Activity Detection),不需要客户端自己判断”用户说完了没”。
四、国内开发者接入的三个实际问题
问题 1:WebSocket 连接不稳定
Realtime API 依赖长连接,国内到 OpenAI 服务器的网络路径本身就不稳定,长连接比短请求更容易被中间节点重置。表现为:连接建立后几十秒到几分钟就断开,且断开时机不规律。
排查思路:先用普通 Chat Completions 接口测试网络是否通畅,再单独测试 WebSocket 连接;如果 HTTP 请求正常但 WebSocket 频繁断线,基本可以确定是长连接层面被干扰,而非账号或代码问题。
问题 2:音频延迟和抖动
即使连接不断开,网络抖动也会导致音频流”卡顿”——这在语音场景比文字场景敏感得多(文字卡一下用户感知不强,语音卡一下就是明显的断续感)。
缓解方式:
- 客户端做适当的音频缓冲(牺牲一点延迟换流畅度)
- 监控
input_audio_buffer.speech_started/stopped事件的时间间隔,异常延迟可以主动重连
问题 3:断线重连后的会话状态丢失
WebSocket 断开后重连,默认是全新会话,之前的对话上下文会丢失。生产环境需要自己实现:
# 断线重连时,重放必要的上下文
async def reconnect_with_context(ws, conversation_history):
await ws.send(json.dumps({
"type": "session.update",
"session": {"modalities": ["audio", "text"], "instructions": "..."}
}))
for item in conversation_history:
await ws.send(json.dumps({
"type": "conversation.item.create",
"item": item
}))
五、通过中转接入的注意事项
如果通过 API 中转服务访问 Realtime API,需要确认两件事:
- 中转是否支持 WebSocket 协议转发——不是所有中转商都支持长连接代理,部分中转只做 HTTP 请求转发,这种情况下 Realtime API 无法使用
- 中转的连接稳定性是否针对长连接优化——普通 HTTP 中转和长连接中转在底层网络处理上不同,选择中转前建议先做一次几分钟的连接稳定性测试
client_url = "wss://api.yotradeapi.com/v1/realtime?model=gpt-realtime"
# 其余事件收发逻辑与直连完全一致
六、成本注意事项
Realtime API 按音频输入/输出时长和文本 token 双重计费,通常比纯文字对话贵不少(语音数据量本身远大于文字)。生产环境建议:
- 设置合理的会话超时,避免用户挂断后连接仍在计费
- 对于不需要实时性的场景(如离线语音转写后分析),优先用普通 STT + Batch API 组合,成本更低,参考OpenAI Batch API 节省 50% 成本实战
七、常见问题
Q:Realtime API 支持中文语音吗? 支持,模型本身具备多语言语音理解和生成能力,中文语音交互体验目前整体可用,但语气/口音的自然度仍在持续迭代中。
Q:可以只用文字模式,不用语音吗?
可以,modalities 设置为 ["text"] 即可,这种情况下更接近普通流式对话,但延迟优势会打折扣(因为省掉了语音层面的优化)。
Q:和 Anthropic 有类似的实时语音接口吗? 截至本文,Anthropic 尚未发布对标的原生语音 Realtime API,如果项目需要语音交互,目前 OpenAI Realtime API 是更成熟的选择。
八、相关阅读
想在国内稳定接入 Realtime API?YoTradeApi 支持 WebSocket 长连接中转,为语音交互场景做了专门的连接稳定性优化,支付宝充值即可使用。