
5 月 7 日 OpenAI 在 API 里上线了三款新的实时语音模型:gpt-realtime-2(具备 GPT-5 级推理、上下文从 3.2 万扩到 12.8 万 token)、gpt-realtime-translate(70+ 种输入语言实时翻译到 13 种输出语言)、gpt-realtime-whisper(流式语音转写)。它们都在同一个 Realtime API 下。本文给出一条可跑的最短路径:后端签发 ephemeral token,浏览器用 WebRTC 直连模型,并用 session.update 把模型切到 gpt-realtime-2、开启语义化断句。
1. 三个模型分别解决什么
不要把它们当成一个模型的三种模式,而是三件各司其职的工具:
gpt-realtime-2(Reason):第一款带 GPT-5 级推理的实时语音模型。它能边听边想、处理更难的请求并把对话自然推进下去。上下文窗口从上一代的 32K 扩到 128K token,适合更长的多轮工作流。gpt-realtime-translate(Translate):实时口译,支持 70+ 种输入语言译到 13 种输出语言,且能跟上说话人的语速。gpt-realtime-whisper(Transcribe):流式语音转文字,说话人还在讲,文字就在持续吐出来。
选型原则很直接:要"会做事的语音助手"用 gpt-realtime-2;要"同声传译"用 translate;只要"字幕/听写"用 whisper。
2. 架构:为什么要用 WebRTC + ephemeral token
实时语音对延迟极其敏感,OpenAI 官方推荐浏览器端走 WebRTC 直连模型,而不是把音频先绕一圈到你自己的服务器。但你绝不能把正式 API key 暴露在前端。
标准做法是两段式:
- 后端 用正式 key 调用一次接口,签发一个短期令牌(ephemeral token)。
- 前端拿这个短期令牌,通过 WebRTC 直接和 Realtime API 建立点对点音频连接。
下面分别给出后端(Node.js)和前端(浏览器)的最短可用实现。
3. 后端:签发 ephemeral token
javascript
// server.js --- Node.js + Express
import express from "express";
const app = express();
app.get("/session", async (req, res) => {
// 用正式 key 申请一个短期客户端令牌
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",
audio: { output: { voice: "marin" } },
},
}),
});
const data = await r.json();
res.json(data); // 把短期令牌返回给前端,正式 key 永不离开服务器
});
app.listen(3000, () => console.log("token server on :3000"));
要点:正式 OPENAI_API_KEY 只存在于服务器环境变量里;前端只拿到有效期很短的令牌。
4. 前端:用 WebRTC 直连模型
javascript
// client.js --- 在浏览器中运行
async function startVoice() {
// 1) 取短期令牌
const tokenResp = await fetch("/session");
const session = await tokenResp.json();
const EPHEMERAL_KEY = session.value; // 字段名以官方返回为准
// 2) 建立 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]);
// 3) 数据通道:用于收发事件(session.update 等)
const dc = pc.createDataChannel("oai-events");
dc.onopen = () => {
// 切换模型 + 配置音频格式与断句策略
dc.send(
JSON.stringify({
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-2",
output_modalities: ["audio"],
audio: {
input: {
format: { type: "audio/pcm", rate: 24000 },
turn_detection: { type: "semantic_vad" },
},
output: { format: { type: "audio/pcm", rate: 24000 } },
},
},
})
);
};
dc.onmessage = (e) => console.log("event:", e.data);
// 4) SDP 握手
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const sdpResp = await fetch("https://api.openai.com/v1/realtime/calls", {
method: "POST",
body: offer.sdp,
headers: {
Authorization: `Bearer ${EPHEMERAL_KEY}`,
"Content-Type": "application/sdp",
},
});
const answer = { type: "answer", sdp: await sdpResp.text() };
await pc.setRemoteDescription(answer);
}
startVoice();
跑通后,你对着麦克风说话,gpt-realtime-2 会边听边推理并用语音回答;semantic_vad(语义化语音活动检测)让它按"你这句话说完了没"来断句,而不是死板地按静音时长切,体验明显更自然。
5. 切换到翻译 / 转写
同一套 WebRTC 骨架,只要换模型名即可。做同声传译时把 model 换成 gpt-realtime-translate,并在指令里指定目标语言;只要字幕则换成 gpt-realtime-whisper、把 output_modalities 收成 ["text"],从数据通道读流式文本:
javascript
dc.send(JSON.stringify({
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-whisper",
output_modalities: ["text"],
},
}));
6. 踩坑提示
- 别把正式 key 放前端:一定走"后端签发短期令牌"的两段式,否则 key 会在浏览器里裸奔。
- HTTPS 是硬要求 :
getUserMedia只在 HTTPS(或 localhost)下可用,部署到 http 站点会直接拿不到麦克风。 - 字段名以官方文档为准 :短期令牌的返回字段、
/realtime/calls端点等接口细节仍在演进,本文示例请对照 https://developers.openai.com/api/docs/models/gpt-realtime-2 校对后再上生产。 - 采样率要对齐:示例用 24000 Hz 的 PCM;输入输出格式不一致会导致杂音或静默。
- 上下文不是无限 :
gpt-realtime-2上限 128K token,长会话仍需做摘要或截断,别指望塞进无限历史。
参考资料
- OpenAI:Advancing voice intelligence with new models in the API --- https://openai.com/index/advancing-voice-intelligence-with-new-models-in-the-api/
- gpt-realtime-2 模型文档 --- https://developers.openai.com/api/docs/models/gpt-realtime-2
- Realtime API with WebRTC 指南 --- https://platform.openai.com/docs/guides/realtime-webrtc