WER 怎么算:一个公式说清语音识别的准确率
WER(Word Error Rate,词错误率)衡量的是识别结果相对参考文本的错误比例,公式是 WER = (S + D + I) / N,其中 S 是替换数、D 是删除数、I 是插入数,而 N 是参考文本的词数——不是识别结果的词数。
这个公式短到可以写在一行里,但它周围有三个坑:分母取谁、三类错误是怎么数出来的、以及为什么这个”率”能超过 100%。下面一个一个拆。
分母是参考文本,这一点很多人搞错
先把符号钉死:
- S(substitution,替换):该说 A 的地方被识别成了 B。
- D(deletion,删除):参考里有这个词,识别结果里没有。
- I(insertion,插入):识别结果里多出来一个参考里没有的词。
- N:参考文本的总词数。
最常见的误解是把分母当成识别结果的词数。为什么必须是参考?因为参考文本是这道题的标准答案,它是固定的、可比的;而识别结果本身是被评价的对象,它的长度会随模型行为剧烈变化。如果分母跟着识别结果走,一个疯狂多吐词的模型反而会因为分母变大而显得错误率更低——指标就被玩坏了。
把分母固定在参考侧,还带来一个直接后果:分子可以比分母大。这就是下文要重点讲的那一条。
三类错误不是数出来的,是对齐出来的
拿到一句参考和一句识别结果,你没法一眼看出哪个词是”被替换的”、哪个是”被删掉的”。得先做一件事:对齐。
对齐的做法是算两串词之间的编辑距离——把识别结果改造成参考文本,最少需要多少次替换、删除、插入操作。这个最小操作序列就是错误标注,操作的类型和数量直接对应 S、D、I。
这里有个容易被忽略的细节:同一对句子的错误标注方式可能不唯一。编辑距离只保证总代价最小,但达到同样最小代价的路径可能有好几条。比如某处既可以标成”一次替换加一次插入”,也可以标成另一种组合,只要总数一样,标注就都算合法。
所以严格地说,S、D、I 各自的数值可能因实现而略有差异,但它们的和是确定的——而 WER 只用到这个和。这就是为什么不同评测脚本算出的 WER 通常一致,即便它们标出来的错误明细长得不太一样。
手算一遍
用一句英文来演示,因为 WER 的基本单位是词。
参考文本(10 个词,N = 10):
please book a flight to shanghai for next monday morning
识别结果(11 个词):
please book the flight two shang hai next monday morning
对齐后逐位比对:
| 参考 | 识别结果 | 判定 |
|---|---|---|
| please | please | 正确 |
| book | book | 正确 |
| a | the | 替换 S1 |
| flight | flight | 正确 |
| to | two | 替换 S2 |
| shanghai | shang | 替换 S3 |
| —— | hai | 插入 I1 |
| for | —— | 删除 D1 |
| next | next | 正确 |
| monday | monday | 正确 |
| morning | morning | 正确 |
数一下:S = 3,D = 1,I = 1。
代入公式:
WER = (3 + 1 + 1) / 10 = 0.5 = 50%
几个值得停一下的地方:
第一,分母是 10 不是 11。 识别结果有 11 个词,但我们用参考文本的 10。
第二,“shanghai” 被拆成两个词,算一次替换加一次插入,不是两次插入。 因为参考里那个位置本来就有一个词等着被对上,把 shang 对上去(替换)比把它也算成插入(那样参考的 shanghai 就得算删除)总代价更低。前者代价 2,后者代价 3,编辑距离选前者。
第三,“to” 被识别成 “two” 只算一次替换。 从语义上看这句话几乎没坏,但 WER 不管语义,它只看词面是否一致。
★ WER 可以超过 100%
这是最反直觉的一点:WER 不是百分比意义上的”准确率的补数”,它没有 100% 的上限。
原因就在分母。分母被钉在参考文本上,而插入错误的数量完全由识别结果决定,没有任何东西限制它。插入足够多时,分子就会大于分母。
一个能说明问题的典型场景是模型陷入重复输出。生成式的解码在某些音频上会卡进循环,反复吐同一个短语直到触发长度上限。假设参考文本只有 10 个词,而模型把某个短语重复输出了几十遍——参考里的词一个都没对上(10 次删除或替换),外加几十个插入。分子轻松突破 100,WER 就成了几百个百分点。
所以在评测报告里看到 WER 超过 100% 时,不要以为是脚本算错了,它更可能是在告诉你一件很具体的事:这条音频上,模型的输出崩了。反过来说,如果你的评测流程把 WER 硬截断到 100%,你就永远看不到”崩溃”和”错得离谱”之间的区别,而这两者在工程上要采取的行动完全不同。
WER 掩盖了什么
WER 最大的局限是:所有错误的权重都一样。
把”不”识别成”很”,和把”的”识别成”地”,对 WER 的贡献是同一个数字——各一次替换。但前者把一句话的意思完全反转了,后者读者根本不会注意到。一个把否定词全部识反的系统,WER 可能比一个把虚词写错的系统还低,但它在业务上是不可用的。
同类的盲区还有几处:
- 位置不敏感。把人名识别错和把语气词识别错,代价相同;但用户往往只在意前者。
- 只报平均值会稀释崩溃。少数几条长音频完全崩掉,混在几百条正常样本里做平均,指标看着还行。分布比均值更能说明问题,至少要看看最差的那几条长什么样。
- 对后处理敏感。评测前把标点去掉、大小写统一、数字统一写法,会让 WER 明显变好看,但真实产品里这些恰恰是用户能看见的错误。评测口径必须和测试集一起说明,否则数字之间没有可比性。
结论不是”WER 没用”,而是:WER 适合做同一测试集上不同版本之间的相对比较,不适合单独拿出来当作系统好坏的判词。 真要评估一个系统,得再叠上按错误类型分类的统计,以及针对关键词(人名、产品名、否定词)的单独准确率。
顺带说一句:中文没有天然的词边界,直接算 WER 会因为分词器不同而不可比,所以中文通常改按字计算,得到 CER。这条单独展开在中文为什么用 CER 不用 WER。
常见问题
问:WER 和”准确率”是什么关系?
很多人默认 准确率 = 1 − WER,这在 WER 较小时是个可用的近似说法,但严格上不成立——因为 WER 可以超过 1,那样”准确率”就成了负数。更稳妥的表述是直接报 WER,不要转成准确率。
问:为什么我用两个不同的工具算同一份结果,WER 略有差别?
先排除对齐之外的因素,通常是预处理口径不同:有没有去标点、大小写怎么处理、数字是保留阿拉伯形式还是转成读法、连字符词算一个还是两个。这些规则的差异对 WER 的影响往往比模型本身的差异还大。跑对比实验前,先把预处理脚本统一。
问:WER 多少算好?
这个问题脱离场景没有答案。安静环境下的朗读稿和嘈杂会议里的多人抢话,难度差着量级,同一个模型在两者上的 WER 完全不可比。比起追一个绝对数字,更有意义的是用自己的业务数据建一个测试集,横向比较候选方案在你的数据上的表现。
问:那我该看什么指标才够?
至少三样:WER(或中文的 CER)、错误的类型分布、关键词的单独命中情况。再加上一条纪律——看最差的那几条样本,不要只看平均值。
相关阅读
本文讲的是语音识别评测领域的通用定义与计算方法,不绑定某一个具体实现。 文中的手算例子为说明公式而构造,不代表任何系统的真实表现。 我们没有对任何模型做过准确率实测,因此全文不给具体的 WER 数值、速度或排名。 各家评测工具的预处理与对齐细节存在差异,请以你所用工具的官方文档为准。