当交互方式从文字输入变成实时语音,并进一步加入数字人形象后,系统面对的不再是一次普通的模型请求。音频采集、实时传输、识别、推理、合成和播放必须连续协作,任何环节的延迟或中断处理失误都会直接影响体验。下面从工程架构入手,拆解这条链路的关键设计。
脱敏说明:本文基于一个实时语音对话项目的工程实践总结,文中隐去具体厂商与产品名称,统一以"主流 RTC 云服务""某大模型云平台""开源语音模型"等通用名称代称。
文字聊天机器ren大家都做过:用户发文字,后端调一次大模型,返回文字。但要做一个"能听会说、还带数字人形象"的实时语音助手,复杂度完全不是一个量级。整条链路涉及五个独立能力的实时串联:
用户说话 → 实时音视频传输 → 语音识别(ASR) → 大模型推理(LLM) → 语音合成(TTS) → 数字人播放
每一段都有延迟,而语音对话对延迟极其敏感——端到端超过 1.5 秒,用户就会明显感觉"反应迟钝"。本文拆解这条链路在真实项目中是如何落地的。
项目实际采用"前端 + 两个后端"的三服务结构:
| 层 | 技术选型(脱敏后) | 职责 |
|---|---|---|
| 前端 | React + TypeScript + RTC Web SDK | 进出音视频房间、麦克风采集、数字人渲染 |
| Node 代理层 | Node.js(Koa 风格) | 拼装 RTC OpenAPI 参数、接口签名、场景配置代理 |
| Python 服务层 | 异步 Web 框架 | 接收 RTC 回调、RAG 检索、流式 LLM 推理 |
| AI 能力 | 主流 RTC 云 + ASR/TTS + 大模型平台 | 音视频通道、识别、合成、推理 |
为什么签名代理要单独用一个 Node 服务?因为 RTC 云的 OpenAPI 需要用密钥做请求签名,密钥绝不能下发到浏览器。前端只向自己的后端发业务请求,由后端持有密钥、拼装参数、签名后转发给 RTC 云。这是所有"前端直连云服务"类应用的标准安全姿势。
① 前端通过 RTC Web SDK 进入音视频房间,开始采集麦克风音频
② Node 代理层接收开启语音会话请求,读取场景配置 JSON,
拼装 ASR/TTS/LLM/数字人的全部参数,签名后调用 RTC OpenAPI
③ RTC 云完成流式 ASR,识别出用户发言文本,通过回调推给 Python 服务
④ Python 服务先做 RAG 检索,拿到知识库上下文
⑤ 大模型流式生成回复文本
⑥ 文本经 TTS 合成语音,驱动数字人播报
这里有两个关键工程设计。
场景配置文件化。 ASR 用什么模型、TTS 用什么音色、LLM 走官方模型还是第三方 Bot、数字人形象用哪套,全部写在一个 JSON 场景文件里。切换业务场景(客服、陪练、导览)不需要改代码,换配置即可。
RTC Token 由后端签发。 前端进房间需要临时 Token,Token 有时效、绑定房间和用户身份,由 Node 层用 RTC AppID 和 AppKey 动态生成。即使 Token 泄露,也只能在限定时间内进入指定房间。
如果每一段都等完整结果再传给下一段,时序是这样的:用户说完一整句(2 秒)→ ASR 出完整文本(1 秒)→ LLM 生成完整回复(3 秒)→ TTS 合成完整语音(2 秒),用户要等 8 秒才听到第一个字。
全流式链路把等待压到最短:
用户感知到的首字延迟 ≈ ASR 尾点延迟 + LLM 首 token 延迟 + 首个语音分片延迟,可以控制在 1~2 秒。数字人口型驱动也按语音分片对齐,避免声画不同步。
项目实现时各能力是"ASR、LLM、TTS 三个云服务拼接"的模式,这在 2025 年是主流。2025 年下半年以来行业出现了两个明显变化:
如果今天重新立项,建议优先评估一体化实时 API,把 Node 签名代理 + Python 回调服务的自研模式作为需要深度定制时的备选。
实时语音对话的本质是"五个流式能力的低延迟编排"。记住三个核心设计:密钥和签名永远留在服务端、全链路流式才能压低首字延迟、打断处理是语音体验的生死线。同时关注一体化实时 API 和端到端语音模型的演进——它们正在把这条过去需要三个团队配合的链路,压缩成一个长连接。