技术深度解析
核心问题在于 Go 的垃圾回收设计。Go 采用并发的三色标记-清除 GC,默认目标是将暂停时间控制在 100 微秒以下。然而在实践中,当堆内存压力较大时——尤其是在处理高频音频流时——GC 暂停可能飙升至 10–50 毫秒。对于一个以 20 毫秒帧处理 16kHz 音频的语音 AI 系统,一次 30 毫秒的 GC 暂停就可能导致缓冲区欠载、丢包或可闻的音频故障。关键问题不在于平均暂停时间,而在于方差:GC 抖动是非确定性的,可能在音频管道的任何时刻发生。
Vivik 的初始架构使用 Go 构建了整个技术栈:SIP 信令、RTP 媒体处理、音频编解码转码(Opus、G.711)、语音活动检测(VAD)以及连接 LLM 推理服务器的桥梁。音频处理路径如下:
1. 网络 I/O:接收 RTP 数据包(每 20 毫秒)→ 2. 抖动缓冲区:对数据包进行重排序和平滑处理 → 3. VAD:检测语音片段 → 4. ASR:将音频流式传输至语音识别 → 5. LLM 推理:生成响应 → 6. TTS:合成语音 → 7. RTP 输出:发送数据包。
每个步骤都有严格的延迟预算。仅抖动缓冲区就必须吸收网络抖动(通常为 30–80 毫秒),同时将自身延迟降至最低。Go 的 GC 可能在这些步骤中的任意一步暂停,导致抖动缓冲区排空过慢,或 VAD 错过语音起始点。该团队测量发现,GC 相关的抖动为每秒音频增加了 15–40 毫秒的不可预测延迟,与网络 RTT(平均 100 毫秒)和 LLM 推理(400 毫秒)叠加后,总延迟被推至 700–900 毫秒。
Rust 的解决方案优雅而高效:所有权和借用机制在编译时强制保证内存安全,无需运行时垃圾回收器。音频缓冲区仅分配一次,通过引用在整条处理管道中传递,并在离开作用域时确定性释放。Rust 的 `std::sync::Arc` 和 `Mutex` 提供了安全的并发访问,且无 GC 开销。Vivik 团队用 Rust 重写了媒体平面,使用 `tokio` 异步运行时处理 I/O,使用 `cpal` 进行音频设备交互。他们还利用 `rusty_v8` crate 嵌入了一个 JavaScript 引擎用于脚本化呼叫流程,但将热路径保留在纯 Rust 中。
| 指标 | Go(原始) | Rust(重写后) | 改进幅度 |
|---|---|---|---|
| 媒体平面 P50 延迟 | 45ms | 12ms | 降低 73% |
| 媒体平面 P99 延迟 | 120ms | 18ms | 降低 85% |
| 最大观测抖动 | 55ms | 2ms | 降低 96% |
| 端到端 P95 延迟(含网络 + LLM) | 820ms | 610ms | 降低 26% |
| 每通话内存使用 | 28 MB | 19 MB | 降低 32% |
数据要点: 迁移至 Rust 几乎消除了媒体平面中的延迟抖动,将 P99 抖动从 55ms 降至仅 2ms。这直接转化为端到端 P95 延迟 26% 的改善,使系统更接近 250ms 阈值。内存节省是次要收益,但它首先减少了 GC 压力——形成了一个良性循环。
对于探索这条路径的开发者,有几个开源 Rust 项目值得关注。`tokio` 运行时(GitHub 星标:28k+)为网络和音频流提供异步 I/O。`cpal` crate(2k+ 星标)处理跨平台音频输入/输出。对于实时音频处理,`dasp` crate(600+ 星标)提供了信号处理工具包。`livekit-rust` SDK(1k+ 星标)正成为基于 WebRTC 的语音管道的热门选择。Vivik 团队尚未开源其完整引擎,但他们在 GitHub 上以 `vivik-jitter-buf`(约 500 星标)为名发布了一个抖动缓冲区的参考实现,展示了无锁、无 GC 的数据包重排序。
关键玩家与案例研究
从 Go 转向 Rust 的浪潮并非 Vivik 独有。多家公司和项目已做出类似转型,或正在积极评估 Rust 用于延迟敏感的音频工作负载。
- Vivik(本文主角):一款专为外呼和呼入电话处理设计的电话 AI 引擎。其从 Go 到 Rust 的迁移源于满足运营商级延迟要求(端到端低于 300ms)的需求。他们现在以确定性性能处理超过 10,000 路并发通话。
- LiveKit:一个被众多语音 AI 初创公司使用的开源 WebRTC 平台。LiveKit 的服务器端组件用 Go 编写,但他们最近推出了基于 Rust 的客户端音频处理 SDK。据报告,Rust SDK 相比 Go 版本将音频捕获延迟降低了 40%。
- Deepgram:领先的语音转文本提供商。其实时 ASR 引擎使用 Rust 处理音频前端(噪声抑制、VAD、流式传输),而神经网络推理则在 GPU 加速的 C++ 上运行。Deepgram 公开表示,Rust 的内存安全性和零成本抽象对于实现低于 100ms 的流式传输延迟至关重要。
- Play.ht:一家文本转语音平台。