两个人同时说话,语音系统怎么办
开会的时候有人抢话,是再正常不过的事。但在多数语音系统的假设里,这件事不存在。
你可以回忆一下任何一场四五个人的真实会议:一个人还没说完,另一个人已经接上了;有人在旁边”嗯嗯""对对”地应着;两个人同时想插话,撞在一起,然后其中一个笑着停下来。这些片段占不了整场会议的多少时长,但它们几乎都出现在最关键的位置——争论、纠正、拍板的那几秒。
而当你拿到转写稿的时候,这些地方往往看不出任何异常。
丢失比错误更隐蔽
先把问题的根源讲清楚。
说话人分离(diarization)的经典流程是:分段 → 提取说话人嵌入 → 聚类 → 指派标签。 聚类这一步的数学形式,天然就带着一个假设:同一时刻只有一个人在说话。每一段音频要被归到某一个簇里去,它不允许一段音频同时属于两个簇。
一旦真实音频打破了这个假设,会发生什么?重叠的那一段会被硬指派给其中一人。声音更响、嵌入更接近某个簇中心的那一位赢了,另一个人的话——不是被识别错,而是直接丢失。
这两件事的严重程度完全不同。
识别错了,你读转写稿的时候会发现别扭:一句话不通顺,一个词莫名其妙,你会去回放音频核对。但丢失不会给你任何提示。 剩下那半句话语法完整、语义自洽,读起来一点问题没有。你以为你看到了会议的全部,实际上少了一个人的表态。
在会议纪要、客服质检、庭审记录这类场景里,这是比准确率低更值得警惕的失败模式。因为它不触发任何怀疑。
重叠语音检测是一个独立的子任务
那能不能指望分离模型顺手把这事解决了?
工程上给出的答案是:不能,它得单独做。
一个可以点名的事实:pyannote.audio 把”重叠语音检测”与语音活动检测、说话人变更检测、说话人嵌入并列,一起列为说话人分离的独立神经网络构件。
这个并列关系本身就是信息量。它说明在工程实践中,“这一段有没有两个人在同时说”是一个被单独建模、单独训练、单独评估的判别任务,和”这一段有没有人说话”(VAD)处在同一层级,而不是分离流程里顺带就能得到的副产品。
理解了这一点,后面三条路径的分工就清楚了:检测是前提,处理是选择。 你可以选择不拆分重叠段,但你不该选择不知道哪里有重叠。
三条处理路径
| 路径 | 做法 | 代价 | 适合场景 |
|---|---|---|---|
| ① 检测并标注 | 单独跑一个重叠检测模型,把重叠区间标出来,交给下游 | 不解决内容缺失,只是把”不可靠”这个信息传下去;需要多维护一个模型 | 转写结果有人工复核环节,或下游要做置信度加权的场景 |
| ② 分离后分别识别 | 用语音分离把重叠段拆成多路音轨,每路单独送 ASR | 分离会引入失真与残留串音,拆出来的音轨声学特征已经变了,识别本身可能变差;链路更长 | 内容完整性优先、可接受额外算力和调试成本的离线转写 |
| ③ 产品层面降级 | 不试图还原,直接在转写稿上标记”此处有交叠,转写可能不全” | 用户看到一处明确的缺口 | 绝大多数面向人阅读的场景 |
第三条要单独说几句,因为它最容易被工程师看不上。
明确告知用户”这里我没听清”,比假装转写正确要负责得多。 一个标了”[交叠]“的地方,读的人知道要去回放那五秒;一段悄无声息吞掉了半句话的通顺文本,读的人什么都不会做。前者把不确定性交回给了有判断力的人,后者把不确定性藏了起来。
产品层面的降级不是技术上的认输,它是在已知能力边界内做出的诚实设计。而且这条路径依赖的恰恰是路径①——你得先检测出来,才谈得上标记。
中文对话里的附和语
有一类重叠特别值得单独提:backchannel,附和语。
中文对话里,“嗯""对""是吗""哦""行”这类词出现的密度非常高。它们的功能是社交性的——表示”我在听""我跟上了""你继续”,说话人并没有打算抢过话轮。
它们制造了大量的短重叠,而且有几个特点让处理起来格外麻烦:
- 时长极短,可能只有几百毫秒,短到不容易被稳定检测;
- 语义价值很低,转写进结果里基本是噪音,读的人不需要知道谁在什么时候”嗯”了一声;
- 但它们对系统的干扰很大——短促的附和会污染主说话人的嵌入向量,让聚类边界变模糊;也会让分离模型在这些点上产生不必要的切分。
所以附和语构成了一个有点讽刺的局面:最不值得转写的内容,最容易搞乱转写。 实践中的处理往往不是”更努力地识别它们”,而是有意识地在下游过滤掉。但这个判断需要产品来定——在有些场景里(比如判断对方是否真的在听),附和恰恰是有价值的信号。
硬件层面的绕开
上面所有讨论都建立在一个前提上:你只有一路混在一起的音频。
如果能改变这个前提,问题的性质就变了。每人一支麦克风的会议室,或者带阵列的设备,可以在物理层面就把说话人分开——每一路信号里主要是一个人的声音,重叠不再是需要从混合信号里反推的难题,而是变成了”两路音轨在同一时间段都有内容”这么一个简单的事实判断。
这也是很多专业会议系统愿意在硬件上花钱的原因:在信号采集阶段解决的问题,不用在算法阶段付十倍代价去猜。
代价当然是部署成本和场地约束。一场线上会议、一段手机录音、一通电话,你没有这个选项。所以算法路径不会因为硬件方案的存在而失去价值,它们服务的是不同的场景。
常见问题
问:我怎么知道我的转写稿里有没有丢内容?
单看转写稿看不出来,这正是这个问题的麻烦之处。可行的做法是:跑一个重叠语音检测,把重叠区间的时间戳和转写结果对照——如果某个重叠区间里只出现了一个说话人的标签,那另一个人的话很可能就丢在那儿了。这也是路径①的实际用法。
问:把语音分离加上去,是不是就万无一失了?
不是。分离本身会引入失真,拆出来的音轨在声学特征上和干净录音不一样,ASR 在这种输入上的表现未必好。而且分离的路数通常需要预先假定,说话人数量估计错了同样会出问题。它是一条可选路径,不是一个免费的补丁。
问:重叠语音检测和 VAD 是一回事吗?
不是,但它们是同一层级的任务。VAD 回答”这一段有没有人在说话”,重叠检测回答”这一段是不是有不止一个人在同时说话”。两者都是帧级或段级的判别任务,都为下游提供切分依据,但判据完全不同。在 pyannote.audio 的构件清单里,它们也是分开列的。
相关阅读
- 语音识别是怎么工作的:从声波到文字的四个环节
- VAD 是什么:ASR 前面为什么总要挂个断句器
- 降噪和回声消除,该放在 ASR 前面还是交给模型
- 说话人分离和声纹识别,到底哪里不一样
- 多人会议怎么分轨:谁在什么时候说了什么
本文讲的是重叠语音处理的通用原理与工程取舍,不绑定某一个具体实现。 文中提到的开源项目能力,依据其仓库自述的功能类别,不含任何性能评价。 各家系统对重叠语音的支持程度差异很大,请以你所用系统的官方文档为准。 我们没有对文中提到的任何方案做过实测,因此不给准确率、延迟一类的数字。