WER 怎么算:一个公式说清语音识别的准确率

2026-08-24

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

对齐后逐位比对:

参考识别结果判定
pleaseplease正确
bookbook正确
athe替换 S1
flightflight正确
totwo替换 S2
shanghaishang替换 S3
——hai插入 I1
for——删除 D1
nextnext正确
mondaymonday正确
morningmorning正确

数一下: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 数值、速度或排名。 各家评测工具的预处理与对齐细节存在差异,请以你所用工具的官方文档为准。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。