架构技术评论

OpenRocky 如何选择 Realtime Voice API的,四大厂商开发体验对比

Image
背景阅读:OpenRocky 发布,开源手机语音助手APP,给大家一个新玩具

在开发 Rocky(一个 Voice-First 的 iPhone AI Agent)时,先后接入了 OpenAI、Google Gemini、智谱 GLM、豆包(火山引擎)四家的 Realtime Voice API,但是最后只保留了 OpenAI 和智谱的 GLM。这篇文章记录我们的真实接入体验,包括踩过的坑、最终效果、以及对国内开发者的建议。

当然,这篇文章也只是我们个人开发测试的结果。由于能力有限,可能存在不准确的情况。如果有错误,敬请指正。


什么是 Realtime Voice API?

传统的语音助手流程是这样的:

用户说话 → ASR 转文字 → LLM 生成文字回复 → TTS 合成语音 → 播放

这种"拼接式"流程延迟高(通常 2-5 秒),而且语音不自然 —— 因为 TTS 只是在"朗读"文字,没有语气、情感和上下文感知。

Realtime Voice API 则是端到端(End-to-End)的:

用户说话 → 模型直接生成语音回复 → 播放

模型同时理解语音和生成语音,延迟低(通常 < 1 秒),语气自然,还能被打断。OpenAI 在 2024 年推出的 GPT-4o Realtime API 开创了这条路,之后 Google、智谱等陆续跟进。


对比总览

OpenAI
Gemini
GLM(智谱)
豆包(火山引擎)
真正 E2E 语音
✅
✅
✅
❌ 拼接式
原生 Tool Calling
✅
✅
✅
❌ 需走单独 API
国内可直连
❌ 需翻墙
❌ 需翻墙
✅
✅
中文语音质量
一般
一般
优秀
优秀
开发文档质量
优秀
良好
一般
一般
AI 辅助开发体验
极好
好
差
差
价格
贵
中等
便宜
中等

OpenAI —— 标杆,但有门槛

背景

https://developers.openai.com/api/docs/guides/realtime

Image

OpenAI 于 2024 年 10 月推出 Realtime API,是行业内第一个可用的端到端实时语音 API。基于 GPT-4o 模型,支持语音输入、语音输出、文字输出、Tool Calling,协议基于 WebSocket。

接入体验

一句话总结:让 AI 写代码,几次就搞定了。

OpenAI 的 Realtime API 文档清晰、协议设计合理、SDK 成熟(SwiftOpenAI 原生支持)。我们用 Claude Code 开发,基本是描述需求 → AI 写代码 → 一次跑通。整个接入过程不超过几句话。

Server VAD(服务端语音活动检测)工作正常 —— 用户说话时自动检测开始和结束,不需要客户端做任何额外处理。Tool Calling 直接在 Realtime Session 内完成,可以在对话中调用 iOS 原生功能(查天气、建日历、读联系人等)。

优势

  • 最成熟稳定,基本没有坑
  • 文档和 SDK 质量高,AI 辅助开发体验极好
  • Server VAD 可靠,Tool Calling 原生支持

劣势

  • 需要翻墙,国内直连不了
  • 价格较贵(Realtime Mini 也不便宜)
  • 中文语音质量不如国产模型

Google Gemini —— 能力强,但不稳定

背景

https://ai.google.dev/gemini-api/docs/live-api

Image

Google 在 2025 年推出 Gemini Live API(也叫 Native Audio),基于 Gemini 2.5 系列模型。支持多模态输入(音频 + 视频),价格比 OpenAI 低不少,也支持 Tool Calling。

接入体验

Gemini 的 WebSocket 协议和 OpenAI 不同,但整体思路类似。接入难度中等,主要挑战在于 Google 的 API 版本和 URL 格式经常变动。

但稳定性是最大的问题 —— 我们在实际测试中经常遇到 WebSocket 连接失败。错误信息通常是 "Socket is not connected",TCP 层面就被拒绝了。这可能与 IPv6 路由、网络环境有关。

优势

  • 模型能力强,支持 Native Audio + 视频
  • 价格相对便宜
  • Tool Calling 原生支持

劣势

  • 需要翻墙
  • 连接稳定性不够
  • API 格式变动较频繁

GLM(智谱)—— 国内唯一的真正 Realtime Voice

背景

https://docs.bigmodel.cn/cn/guide/models/sound-and-video/glm-realtime

Image

智谱 AI 是国内少数提供真正 End-to-End Realtime Voice API 的厂商。基于 GLM-Realtime 模型,支持实时语音交互、Tool Calling、多种中文音色。WebSocket 协议设计参考了 OpenAI 的模式,但有不少自己的特色(和坑)。

接入体验

一句话总结:能跑通,但过程艰辛。对,虽然能跑通,其实大家如果使用现在最新的 OpenRocky 的话,会发现每次回答前面都会出现两声“滴滴”的声音。

这两声“滴滴”声看起来挺简单,但模型始终去不掉。有时也可以去掉,但去掉后又会引入其他的问题,所以目前这个问题还没有彻底解决。如果你知道如何彻底解决,也非常欢迎,希望能告诉我。

这是我们接入时间最长的一个 Provider,前后废了非常多的口舌和测试自己打日志给AI看。和 OpenAI 的"几次就搞定"形成鲜明对比。主要原因:

1. 文档和 SDK 不完善

Image

虽然有这两个 SDK 的 demo(包括 Python、Golang、TypeScript 以及前端的代码),但对于客户端开发来说,感觉还是有所缺失。再加上让 Codex 和 Claude Code 去参考这些代码进行开发,其中依然会存在一些坑。比如说 AI 仍然很难做到一次性搞定或者几次搞定,仍然需要不断地加日志调试,最后才能够开发完成。

GLM 的 Realtime API 文档缺少关键细节。比如 session.update 必须包含 beta_fields(含 chat_mode、tts_source、auto_search),但文档没有明确说明这是必填字段。没有 beta_fields,服务端会直接断开 WebSocket 连接,且没有任何错误提示。

我们最终是通过阅读智谱开源的前端 Demo(realtime-front)源码,才发现这个关键参数。

2. Server VAD 不可用

OpenAI 和 Gemini 的 Server VAD 工作正常 —— 服务端自动检测用户说话的开始和结束,然后生成回复。但 GLM 的 Server VAD 只能检测到 speech_started,永远不会触发 speech_stopped,导致模型不会生成回复。

我们不得不改用 Client VAD(客户端语音活动检测),自己在 iOS 端用 RMS 能量检测来判断用户是否停止说话,然后手动 commit 音频 + 发送 response.create。

3. 音频格式有坑

  • GLM 的前端 Demo 使用 16kHz 采样率录音。我们的 iOS App 录音是 24kHz(和 OpenAI 一致)。直接发 24kHz 的 PCM 数据给 GLM,Server VAD 能检测到语音但模型无法理解内容。最终需要在发送前做 24kHz → 16kHz 降采样,并包装为 WAV 格式。
  • 输出音频是 24kHz PCM16,倒是和 OpenAI 一致,可以直接播放。

4. Tool 参数验证极其严格

GLM 对 Tool 定义的参数校验比 OpenAI 严格得多:

  • properties
     和 required 字段不能是 null,也不能是空对象 {} / 空数组 [](服务端内部会把空值转为 null,然后 422)。
  • 不支持 tool_choice 参数。
  • 工具数量不能太多(超过 10 个左右 response 会卡死不返回)。

最终的 workaround:给没有参数的工具添加 _placeholder 占位属性,限制发送 10 个工具。

5. AI 辅助开发体验差

由于文档不完善,Claude / Codex 在写 GLM 相关代码时经常"猜错"。很多问题需要人工阅读前端 Demo 源码、用 Python 脚本手动测试 WebSocket、逐步排查才能定位。整个过程和 OpenAI 的"一次搞定"形成鲜明对比。

这也反映了一个更深层的问题:AI 辅助开发的质量很大程度上取决于目标平台的文档和 SDK 质量。OpenAI 的文档好,AI 就能写出正确的代码;GLM 的文档有缺失,AI 就会反复试错。

优势

  • 国内唯一
    可直连的真正 E2E Realtime Voice API
  • 中文语音质量优秀,7 种音色可选
  • 价格便宜(Flash 版 ¥0.18/分钟)
  • 支持 Tool Calling(虽然有限制)
  • 支持自动问候语(greeting_config)

劣势

  • 文档不完善,关键参数需要看源码才知道
  • Server VAD 不可用(speech_stopped 永远不触发)
  • 空 Tool 参数服务端处理有 bug
  • 工具数量限制(超过约 10 个会导致 response 卡死)
  • 每次回复音频前有一小段 TTS 前导噪音
  • AI 辅助开发体验较差

豆包(火山引擎)—— 不是真正的 Realtime

背景

https://console.volcengine.com/speech/service/10017

Image

https://seed.bytedance.com/en/realtime_voice

我发现豆包虽然在 2025 年 1 月就发表了这样的论文,但是从 API 的开发体验上来看并不是特别好,尤其是文档,也是上个世纪的那种文档。

https://seed.bytedance.com/zh/seeduplex

当时也说是升级到了这个模型,但是好像不给用,没有办法开发,只是豆包自己在用。

字节跳动的豆包是国内最受欢迎的 AI 应用之一,语音对话体验在 App 端做得很好。火山引擎也提供了 Realtime Voice API(基于 doubao-e2e-voice 模型)。

接入体验

https://www.volcengine.com/docs/6561/1597643?lang=zh

Image

然而,深入看代码就会发现,豆包的"Realtime Voice"并不是真正的端到端:

用户说话 → ASR 转文字 → 对话模型生成文字 → TTS 合成语音 → 播放

它本质上是把 ASR + LLM + TTS 三个步骤串联起来,通过 WebSocket 流式传输。虽然感知上延迟不高,但这不是 OpenAI / Gemini / GLM 那种"模型直接理解和生成语音"的方式。

更关键的是,Tool Calling 不在 Realtime Session 内 —— sendToolOutput() 是空实现。如果需要在对话中调用工具,需要走单独的 Chat API,这在语音交互场景下体验不好。

接入复杂度也不低:需要分别配置 appId、appKey、resourceId 三个凭证,比其他三家都麻烦。文档也是上个世纪的风格。

优势

  • 国内可直连
  • 中文语音质量好
  • 豆包 App 本身的语音体验很好

劣势

  • 不是真正的 E2E Realtime Voice
  • Tool Calling 不在 Realtime Session 内
  • 接入需要多个凭证

补充

公平地说,豆包 App 的语音对话体验确实不错,可能是字节在 App 层面做了很多优化。但从 API 层面看,目前开放的能力和 OpenAI / GLM 的真正 Realtime 还是有本质区别。也有可能是我们没有找到更好的接入方式。

不管怎么样吧,豆包这个看起来并不是一个实时的,并不是真正的端到端。而且它也不支持 Tool Call,反正 Codex 和 Claude Code 是没搞定。因为不是一个实时的,不支持 Function Calling,这样其实效果会大打折扣。

Image

国内其他厂商呢?

https://help.aliyun.com/zh/model-studio/realtime

我们也测试过阿里的 Realtime Voice API。各厂商在宣传上都说得不错,但实际接入体验差距很大。主要是我和克拉特聊了非常久,经过各种测试,始终不能把阿里的这个 RTC One Click 调试通过,也可能是个人能力问题。

  • 文档不完善,关键参数缺失
  • 示例代码跑不通,或者只有 Python 版本
  • 错误提示不清晰,很难定位问题
  • AI 辅助开发基本不可能(因为 AI 也没见过这些 API 的正确用法)

最终结论:在国内,智谱 GLM 是目前唯一一个我们成功跑通了真正 E2E Realtime Voice + Tool Calling 的 API。


给开发者的建议

如果你在海外或有稳定的翻墙环境

首选 OpenAI Realtime API。最成熟、最稳定、文档最好、AI 辅助开发体验最佳。如果预算有限,可以考虑 Gemini。

如果你面向国内用户

GLM 是目前的唯一选择(应该也有其他的,但是我没找到可用的)。虽然接入过程比 OpenAI 复杂不少,但跑通之后效果还可以。这篇文章记录的所有坑我们都已经在 OpenRocky 项目中解决了,你可以直接参考代码。当然,这个 GLM 还是有一些 bug 没特地解决。

关于 AI 辅助开发

这次接入体验让我们深刻感受到:API 的文档质量直接决定了 AI 辅助开发的效率。

以后所有 SDK 的标准都应该做到:让 AI 参考 SDK 文档或者是 Demo,能够一次性看懂并完成接入。这其实就是我觉得的新时代 SDK 的一个文档标准。

  • OpenAI:让 Claude 写代码,几次就搞定 → 半天完成
  • GLM:Claude 反复试错,大量需要人工测试辅助和阅读源码 → 一整天

如果你是 API 提供方,想让开发者(和他们的 AI 助手)快速接入,请:

  1. 写清楚必填参数和可选参数
  2. 提供完整的请求/响应示例
  3. 错误时返回清晰的错误信息(而不是静默断开连接)
  4. 保持 SDK 和文档与 API 同步更新

总结:OpenRocky 的最终选型

经过对四家厂商的完整接入和测试,我们在 OpenRocky 中做出了一个清晰的选择:只保留 OpenAI 和 GLM,移除 Gemini 和豆包。

维度
OpenAI
GLM
定位
海外用户首选
国内用户首选
真正 E2E
✅
✅
Tool Calling
✅ 44个工具
✅ 10个工具
稳定性
极高
高(需 workaround)
网络要求
需翻墙
国内直连

移除 Gemini 的原因:连接不稳定,WebSocket 经常 "Socket is not connected",在实际使用中体验不可靠。移除豆包的原因:不是真正的 E2E Realtime Voice,Tool Calling 也不在 Realtime Session 内。

这样做的好处是:海外用户用 OpenAI,体验最好;国内用户用 GLM,不需要翻墙。 两条路线覆盖了绝大多数用户场景,架构也更简洁。

选型的评估过程

我们的评估标准很简单,就三条:

  1. 是不是真正的 E2E?
     —— 模型直接理解和生成语音,而不是 ASR+LLM+TTS 拼接。这决定了延迟和语音自然度的上限。
  2. 能不能在语音中调用 Tool?
     —— Rocky 是一个 Agent,用户说"帮我查一下明天的天气",需要在对话中直接调用 iOS 的天气 API,而不是让用户切到文字模式。
  3. 能不能稳定工作?
     —— 演示能跑通不算数,日常使用不能三天两头连不上。

用这三条标准筛下来,只有 OpenAI 和 GLM 同时满足。

接入难度的真实差距

最后想说一个可能对开发者最有参考价值的点:AI 辅助开发的效率,几乎完全取决于目标 API 的文档质量。

OpenAI
GLM
用 Claude Code 开发
描述需求 → AI 写代码 → 跑通
AI 写代码 → 报错 → 人工查源码 → 再试 → 再报错 → ……
接入耗时
半天
一整天
主要时间花在
写业务逻辑
排查 API 的隐含要求

OpenAI 的文档、SDK、错误提示都很完善,AI 读了文档就能写出正确的代码。GLM 的文档有关键信息缺失(比如 beta_fields 是必填的、Server VAD 不可用、空参数会 422),AI 只能反复试错,很多问题最终靠人工阅读官方 Demo 源码才解决。

这也给 API 厂商提了一个建议:在 AI 编程时代,文档质量不仅是开发者体验问题,更是 AI 能不能帮开发者用上你的 API 的问题。 文档好,开发者让 AI 一个小时就能接入;文档差,开发者自己调一天也不一定搞得定。


Realtime Voice API 是一个很新的领域,各家都在快速迭代。我们在 OpenRocky 项目中完整实现了 OpenAI 和 GLM 的 Realtime Voice Client,代码完全开源,希望能帮到有同样需求的开发者。

  • GitHub: github.com/openrocky/openrocky
  • 官网: openrocky.org

最后还是要再说一遍,这也只是我个人测试的结果,当然也是在个人让 PowerCode 以及 Codex 测试的结果。

这并不一定代表模型厂商最新的真实情况,可能存在不准确的情况,如果大家发现有误,请尽情指正。