语音 Agent 的实时对话链路怎么设计?全双工交互(可随时打断)难在哪?
先这样答
链路四段串行:语音识别出文字,大模型理解并生成回复,语音合成出音频,播放。每一段都有延迟,用户体验的硬指标是首响应延迟——用户说完到 Agent 开口,超过两秒就觉得迟钝,一秒内才算流畅。延迟预算要逐段核算:流式识别在说话过程中就开始出字,说完后几十毫秒内出最终结果;大模型走流式输出,首 token 决定后续合成能否提前启动;合成用流式分段合成,模型吐出第一句话就开始合成播放,不等全文。优化手段本质是流水线化:让每一段都尽早开始、部分结果往前传。
全双工意味着用户随时可以打断 Agent 说话,难点有三个。回声消除:Agent 自己在出声,麦克风同时拾音,要把扬声器播出去的声音从采集信号里减掉,否则 Agent 被自己的声音触发。打断检测:区分用户真在说话还是环境噪声或口头禅,要在几百毫秒内决策并执行打断——停止播放、取消正在生成的后续内容、开始听新指令。可抢占的生成管线:大模型的生成是持续吐 token 的过程,打断发生时要能立刻截断并丢弃未合成部分,这要求识别、生成、合成三段的任务句柄都可取消。
交互设计上还要处理话轮转换:用户停顿是说完还是思考中,抢答和傻等都伤体验,端点检测的静音阈值要按场景调,支持「嗯,我在听」这类填充词维持对话感。
面试官会怎么追问
- 「首响应延迟怎么压到一秒内?」 并行化:识别的流式结果直接喂给大模型预测性起跑;合成不等整句,按标点切分逐句合成;端侧预热的常驻会话省去冷启动。每段的 P99 而不是平均值才是设计对象。
- 「打断后正在生成的 token 怎么办?」 立刻取消生成任务(streaming 的 abort),已合成未播放的音频清空播放队列。新指令的识别上下文里要保留被打断前的对话记录,理解才连贯。
- 「回声消除在什么场景最难?」 大音量外放加远场拾音:扬声器和麦克风距离远、房间混响重,消不干净就自触发。车载和智能音箱是重灾区,麦克风阵列加自适应滤波是标配。
回答的坑
- 把语音 Agent 说成「ASR 加聊天加 TTS 简单拼接」。流水线化和打断处理才是工程难点所在。
- 不算延迟账。四段延迟的预算分配讲不出数字,说明没实际压过延迟。
同系列的题
—— 本题完 ——