摘要:把"一段多人对话录音"变成"带证据、可复核的质检结论",链路上至少有五个环节会引入误差。本文按数据流顺序拆解每一环的关键设计与取舍,重点讨论误差如何传递,以及怎样让最终结论可审计。
一、先说问题
典型输入是现场录音:背景噪声不固定,2~3人交替甚至重叠发言,质检规则却是业务语言,比如"是否告知了费用构成"。
最朴素的方案是整段转写后直接丢给大模型,让它给结论。这在演示里能跑通,上线后会暴露三个问题:结果不稳定,无法追溯依据,长文本下漏判严重。后文的设计基本都在对付这三件事。
二、整体链路
音频 → VAD切分 → 流式ASR → 说话人分离 → 角色映射
→ 文本规整 → 规则召回 → LLM判定 → 结构化结果(含证据)
核心约束只有一条:每一级的中间产物都要落盘、带时间戳,保证可回放。 质检结论被质疑时,要能定位到原始音频的具体区间。
三、VAD与音频切分
VAD决定哪些音频送进后续模块。两类错误的代价不同:
漏检(语音被判成静音):句首被截断,ASR丢字,且无法在下游补救。
误检(噪声被判成语音):增加计算量,还可能产生幻觉式转写。
所以阈值通常偏向召回,宁可多送一点,再依靠ASR置信度和后处理过滤。
切分策略上,不建议按固定时长硬切。一句话被切在中间,说话人判定和语义理解都会受影响。更合理的做法是在VAD停顿处切分,并给相邻片段保留一小段重叠上下文。
四、ASR:看指标要分层
流式识别常见的架构是CTC或Transducer系列,离线精修可以再接一遍更大的非流式模型做重打分。
评估时别只报一个总的CER。至少按这几个维度拆开:
信噪比分桶(安静 / 中等噪声 / 强噪声)
说话人类型(方言口音、语速)
实体类型(数字、金额、日期、专有名词)
实体错误值得单独拎出来。同音字错误,下游LLM靠上下文常能纠正;但"三百"听成"四百",LLM纠正不了,而这类错误恰恰最容易改变质检结论。
领域术语的处理,优先考虑热词偏置(解码阶段对指定词增加得分)和外接领域语言模型融合,成本远低于重训声学模型。热词表过大会导致过度偏置,把不相关的音误识成热词,需要用回归集控制。
五、说话人分离与角色映射
质检的前提是知道"谁说了这句话"。角色映射错了,结论方向会整体反转。
常见流程:
对语音段提取说话人嵌入(x-vector、ECAPA-TDNN等)。
在嵌入空间聚类,得到匿名说话人标签。
用已注册的声纹模板做比对,把匿名标签映射到具体角色。
比对一般用余弦相似度:
import numpy as np
def cosine_score(a: np.ndarray, b: np.ndarray) -> float:
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b) + 1e-8))
def match_role(emb, enrolled, thr):
return cosine_score(emb, enrolled) >= thr
几个工程细节:
阈值必须在目标场景数据上标定,依据FAR/FRR曲线(或EER、minDCF)选工作点,不能直接沿用公开数据集上的结论。
短片段嵌入不稳定。实践中会把同一聚类下的多个片段做聚合后再判定,而不是逐句打分。
重叠语音是分离的难点,会同时拉高DER。如果系统不处理重叠,至少要在结果里标记重叠区间,避免把这些区间的转写当成可靠证据。
两类误判代价不对称。把对方误判成己方,通常比反过来更伤,阈值应向保守一侧倾斜。
六、LLM判定的工程化
规则原子化
一条业务规范拆成若干个独立检查项,每项只回答一个问题,并明确判定范围和反例。粒度太粗,模型会在一个提示里同时做多件事,准确率明显下降。
先召回再判定
全文输入成本高,长上下文下注意力也会稀释。更稳的做法是先用关键词、向量检索或轻量分类器,召回与当前规则相关的候选片段,再让模型只在候选范围内判定。
这里要注意:召回环节的漏召,LLM是补不回来的。 所以召回阶段要单独评估召回率,不能因为最终效果还行就忽略它。
强制结构化输出,证据是必填项
{
"rule_id": "R-017",
"hit": true,
"confidence": 0.86,
"evidence": [
{
"segment_id": "s_0412", "start_ms": 183200, "end_ms": 187900}
],
"reason": "报价环节未提及违约金条款"
}
输出格式可以用受限解码(基于JSON Schema或语法约束)来保证,而不是靠提示词"请输出JSON"碰运气。
evidence 的校验逻辑是:证据片段必须真实存在于输入中,且与判定内容有对应关系。校验不通过的结果,不予采信,转人工复核。这是抑制幻觉最直接的手段。
置信度要校准
模型自报的置信度通常偏高,不能直接当概率用。可以用历史标注数据做校准(如温度缩放、等渗回归),用ECE之类的指标衡量校准效果。校准之后,再设置"自动通过 / 人工复核"的分流阈值。
评估
按规则维度分别统计精确率和召回率,不要用单一的整体准确率。多数质检场景更看重精确率:误报会让被检对象失去对系统的信任,而这种信任丢了很难挽回。
七、几个容易踩的坑
时间戳不统一。 ASR、说话人分离、证据回溯各自产出时间戳,如果起点基准、采样率换算不一致,"点击证据跳转到原音"就会错位。建议在数据结构层面统一用毫秒级的绝对偏移,并在每一级做对齐校验。
模型升级导致行为漂移。 更换基座模型后,同一份提示词的输出分布可能变化。需要维护一份固定的回归集,每次模型或提示词变更都全量跑一遍,对比各规则维度的指标变化。
只看离线指标。 离线测试集的分布往往比线上干净。上线后应抽样回流线上数据做人工标注,持续监控指标漂移。
隐私与合规。 录音和声纹都属于敏感个人信息:采集需明确告知并取得授权,存储需加密,声纹模板应与业务数据隔离存放,并设定明确的留存和删除策略。
八、小结
这类系统的难点不在某个单点模型,而在多级误差的传递控制:VAD的漏检会传导给ASR,ASR的实体错误会传导给LLM,说话人映射的错误会直接反转结论。
比较可行的思路是,每一级都暴露自己的置信度和中间产物,下游根据上游的不确定性调整信任程度,并让最终结论始终绑定可回放的证据。