语音AI只有在对话速度跟上人说话时,才称得上自然。一旦网络拖后腿,用户立刻就能察觉到——尴尬的停顿、被截断的插话、迟缓的打断响应。
这对ChatGPT语音、Realtime API开发者、交互式工作流里的智能体,以及需要边听边处理的模型来说,都是致命伤。
服务9亿周活用户的三大硬指标
OpenAI的实时交互团队给出了三个必须同时满足的要求:
- 全球覆盖
:支撑超过9亿周活跃用户 - 秒级建连
:用户一开麦就能说,不能等 - 低抖动往返
:媒体往返时间(RTT)要低且稳,让对话切换干脆利落
最近,他们彻底重构了WebRTC协议栈,核心是为了解决三个在超大规模下开始互相打架的约束:
传统WebRTC的"一端口一会话"模型,和OpenAI的基础设施格格不入 有状态的ICE和DTLS会话需要稳定的归属权 全球路由必须让首跳延迟保持低位
为什么是WebRTC?
WebRTC不只是浏览器视频通话的技术,它是一套开放标准,把交互媒体中最难啃的骨头都标准化了:
- ICE
:搞定连通性建立和NAT穿透 - DTLS + SRTP
:加密传输 - 编解码协商
:压缩和解码音频 - RTCP
:质量控制 - 客户端能力
:回声消除、抖动缓冲
对AI产品来说,最关键的一点是音频以连续流的形式到达。 spoken agent可以在用户还在说话时就开始转录、推理、调用工具、生成语音,而不是等整段音频上传完。这就是"像对话"和"像对讲机"的区别。
OpenAI还直接挖来了WebRTC生态的两位奠基人:Justin Uberti(WebRTC原始架构师之一)和Sean DuBois(Pion库的创建者和维护者),现在都是OpenAI的正式员工。
SFU vs Transceiver:为什么选后者?
SFU(选择性转发单元)是多人视频会议的经典方案,每个参与者连到SFU,SFU再选择性地转发流。这种模型适合多人通话、在线课堂、协作会议。
但OpenAI的 workload不一样——绝大多数是1:1,一个人对一个大模型,或者一个应用对一个实时agent。延迟敏感,每一轮对话都要快。
所以他们选了transceiver模型:一个WebRTC边缘服务终止客户端连接,然后把媒体和事件转换成更简单的内部协议,交给模型推理、转录、语音生成、工具调用和编排。
transceiver是唯一拥有WebRTC会话状态的服务:ICE连通性检查、DTLS握手、SRTP加密密钥、会话生命周期。后端服务不需要懂WebRTC,可以像普通微服务一样扩展。
当WebRTC撞上Kubernetes
OpenAI的初版实现是一个单体的Go服务(基于Pion),同时处理信令和媒体终止,支撑了ChatGPT语音和Realtime API。
但他们想让这个服务像其他服务一样跑在Kubernetes上——弹性扩缩容、跨主机迁移。
问题来了:传统WebRTC的"一端口一会话"模式,依赖大量公共UDP端口范围,这在K8s里很难暴露、安全管控和维护。每次pod增删改迁,端口范围都要跟着变,autoscaling形同虚设。
Split Relay + Transceiver:解法
新架构把信令和媒体拆分:
- Relay(中继)
:跑在边缘,只负责UDP包的转发和路由,不碰WebRTC状态。它用少量固定端口监听,把包按会话ID路由到对应的transceiver - Transceiver
:跑在K8s里,专注于WebRTC状态终止和媒体处理,不再需要大量公共端口
这样relay处理"在哪里"(路由),transceiver处理"是什么"(WebRTC语义)。两者可以独立扩缩容,relay可以按地理位置分布,transceiver可以按负载弹性伸缩。
成果
这套架构现在支撑着ChatGPT语音和Realtime API的全球流量。OpenAI在博客里放出了架构图和关键代码思路,供整个行业参考。
从工程角度看,这不是简单的"扩容",而是一次针对AI workload的协议栈重构——让WebRTC从"视频会议工具"变成了"AI交互基础设施"。
夜雨聆风