语音 AI 的转身检测两难:提高静音阈值避免打断会导致用户感知的不可接受延迟,揭示语音交互中延迟的非线性感知曲线。
大多数语音 Agent 都通过测量静音时长,来判断你是否已经说完。语音活动检测(VAD)会将音频标记为“语音”或“非语音”;进入“非语音”状态后,计时器开始运行;当计时超过某个阈值时,当前轮次结束,系统开始生成回复。
作为第一版架构,这很合理。但它也存在一个问题:对话越自然,这个问题反而越严重。
问题通常是这样发生的:一个人一边说话,一边思考。他会在句子中间停顿,因为当人们是在组织想法,而不是照着稿子念时,本来就会这样。停顿超过阈值,系统便结束当前轮次并开始回应。结果,用户的话说到一半,思路还没表达完,就被机器打断了。
最直接的解决办法,是提高阈值。等得更久一些,再判断这一轮是否已经结束。
这里有一点值得明确写下来:提高阈值,只是用一种故障换来了另一种更糟糕的故障。对话延迟的成本曲线并不是平滑的。低于某个临界点时,人们根本不会察觉延迟;超过这个点后,他们就会觉得系统反应迟钝。而在语音界面中,“慢”会给人一种系统坏了的感觉,这种感受远比视觉界面的延迟更强烈——因为这里没有旋转的加载图标,没有加载状态,也没有任何迹象表明机器仍在工作。语音 Agent 的沉默与系统故障没有区别。因此,你为了避免打断而提高阈值,却失去了原本让产品显得真实自然的东西。
调参范围的两端都很糟糕。这才是这个问题真正的形态,也正因如此,无论把阈值调成多少,单纯调节阈值都不是答案。
真正帮我重新理解这个问题的思路是:对于如此重要的决策,静音是所有可用信号中最弱的一种,而纯 VAD 方案却只使用了这一种信号。人类并不是通过计算停顿时长来判断一轮对话是否结束。我们会利用句法,判断从句是否已经完整收束;利用韵律,判断音高是落入了表示结束的轮廓,还是仍然悬而未决;利用语义,判断对方说出的内容是否已经完整到足以作出回应。我们一直在持续预测对方是否已经说完,甚至会在对方真正停下来之前,就开始准备自己的回答。
这指向了一种不同的架构。不要使用一个在检测到静音后触发的计时器,而是让一个轻量级的端点检测模型处理部分转写文本,输出当前轮次已经完成的概率;静音只是模型的一项输入,而不是整个决策本身。一个完整从句结束后逐渐停下来的停顿,与从句中间的停顿,对 VAD 来说是同一种事件;但对于任何能够理解文本的系统来说,两者完全不同。
第二部分,是将检测与最终提交解耦。轮次结束预测不必是一次不可逆的单一决策。你可以在预测很可能到达端点时就开始生成;如果用户重新开口,再以很低的成本取消生成。这样一来,一个硬分类问题就被转化成了软判断问题,而软判断问题更能容忍出错。
这些问题目前都还没有解决。如何处理 Barge-in、取消操作的成本,以及用户在系统回复时插话该怎么办——对我来说,这些仍然都是开放问题。我更愿意在它们尚未解决时就把思考写下来,而不是等到把一切整理成一个漂亮结论之后再谈。
如果你曾经真正上线过实时语音产品,我很想了解你们生产环境中的端点检测究竟是什么样的,尤其是:当预测过早触发,而生成已经开始时,你们会怎么处理。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。