摘要:本文介绍了词错率WER和字错率CER的概念,引入了编辑距离的概念与计算方法,从而推导得到词错率或字错率的计算方法。

本文分享自华为云社区《新手语音入门(一):认识词错率WER与字错率CER | 编辑距离 | 莱文斯坦距离 | 动态规划》,作者:黄辣鸡。

1. 词/字错率的概念

1.1 词错率与字错率

词错率(Word Error Rate, WER)是一项用于评价ASR性能的重要指标,用来评价预测文本与标准文本之间错误率,因此词错率最大的特点是越小越好。像英语、阿拉伯语语音转文本或语音识别任务中研究者常用WER衡量ASR效果好坏。

因为英文语句中句子的最小单位是单词,而中文语句中的最小单位是汉字,因此在中文语音转文本任务或中文语音识别任务中使用字错率(Character Error Rate, CER)来衡量中文ASR效果好坏。

两者计算方式相同,为行文统一,下文统一使用WER表示该性能。

1.2 计算公式

它们的计算公式是:

假设有一个参考例句Ref和一段ASR系统转写语音后生成的预测文本Hyp。带入上面公式,S表示将Hyp转化为Ref时发生的替换数量,D表示将Hyp转化为Ref时发生的替换数量,I代表将Hypo转化为Ref时发生的插入数量,N代表Ref句子中总的字数或者英文单词数。C代表Hyp句子中识别正确的字数。即原参考句子总字数N = S+ D + C。

再说一句,根据维基百科里面的说法,N就是原样例文本总的字数

举例1:

Ref: 你吃了吗
Hyp: 你吃了么

标准文本为“你吃了吗”,转写结果为“你吃了么”,上例发生了一次错误替换,Hyp将“吗”替换成了么,即S=1,D=0, I =0, 参考文本字数N=4, 因此本次转写结果WER= 1/4 = 25%.

举例2:

Ref: 你吃了吗
Hyp: 你吃了

预测文本为“你吃了”,相比标准文本错误删除1个“吗”,即S=0,D=1,I=0,N=4,因此本次转写结果WER = 1/4 = 25%。

举例3:

Ref: 今天天气很好
Hyp: 今天天气很好啊

举例3中,Hyp文本相比标准文本错误插入了一个“啊”,即S=0,D=0,I =1,N=6,因此字错率WER= 1/6 = 16.7%。

2. 字错率的实现

在参考文本给出的情况下,N可以很轻易统计出来,而编辑数量 S+I+DS+I+D的计算我们通过编辑距离的引入来计算。

2.1 编辑距离的概念

编辑距离,由前苏联数学家弗拉基米尔·莱温斯坦在1965年提出,通过计算两个字符串互相转换所需要的最小编辑数来描述两个字符串的差异,编辑操作包括替换,删除,插入。编辑距离也叫莱温斯基距离,当前被广泛用于字错率计算,DNA序列比对,拼写检测等领域。

编辑距离就等同于上文所述的S+D+IS+D+I

编辑距离的公式为:

其中 ww为指示函数,当ai​≠bj​时,其值为1;当ai​=aj​时,其值为0。

作为一个新手,直接看这个公式,可能不明所以。但是如果可以用一个矩阵来表示这个公式,并自己在纸上推导一遍,回过头来再看这个公式就会相对比较容易理解。 可以参考2.2示例。

2.2 编辑距离的计算

假设我们有两个词,horse和ros,需要计算他们俩的编辑距离。我们假设horse是参考例句Ref,而ros是预测文本Hyp, 现在计算ros转换为horse所需要的最少操作数,即它俩的编辑距离。

参考Leetcode问题#71

我们首先定义一个距离矩阵,并且命名为cache。矩阵的行数为ros字符长度+1, 矩阵的列数为horse字符长度+1,因此cache为一个4✖️6的矩阵。下文中用i表示行数,用j表示列数。

矩阵大概长这个样子:

+------+------+---+---+---+---+---+
|      | null | h | o | r | s | e |
+------+------+---+---+---+---+---+
| null |      |   |   |   |   |   |
|  r   |      |   |   |   |   |   |
|  o   |      |   |   |   |   |   |
|  s   |      |   |   |   |   |   |
+------+------+---+---+---+---+---+

多出来的一行和一列给了null。而矩阵中的每个元素将保存当前位置之前字符的互相转换所需要的操作数。例如cache[2][3]表示ro转换成为hor所需要的最小操作数。

如果可以得到最右下角的矩阵元素的值,那么就可以得到ros和horse之间互相转换所需要的编辑数。

因为我们可以较为容易的计算出来null转换为null或null转换为任何字符所需要的操作数,例如null转换成null的操作数为0,即cache[0][0]=0;null转换为h的操作数为1,即cache[0][1]=1,null转换为ho的操作数为2,即cache[0][2]=2。null转换为hor、hors、horse的操作数分别为3、4、5。

因此可以得到距离矩阵:

+------+------+---+---+---+---+---+
|      | null | h | o | r | s | e |
+------+------+---+---+---+---+---+
| null |  0   | 1 | 2 | 3 | 4 | 5 | ➡️
|  r   |      |   |   |   |   |   |
|  o   |      |   |   |   |   |   |
|  s   |      |   |   |   |   |   |
+------+------+---+---+---+---+---+

同时可以发现一种模式,当i=0, cache[i][j] = j,

同理,竖列r、ro、ros转换为null的操作数分别为1、2、3,即分别删除1、2、3个字符。

得到以下距离矩阵:

+------+------+---+---+---+---+---+
|      | null | h | o | r | s | e |
+------+------+---+---+---+---+---+
| null |  0   | 1 | 2 | 3 | 4 | 5 |
|  r   |  1   |   |   |   |   |   |
|  o   |  2   |   |   |   |   |   |
|  s   |  3   |   |   |   |   |   |
+------+------+---+---+---+---+---+⬇️

并发现,当j=0, cache[i][j] = i。

计算距离矩阵中剩余的部分,我们首先定义两个矩阵规则,

当r \neq cr=c时,右下角的矩阵值为周边三个值最小值+1:

+---------+----------------------------------+
| replace |              remove              |
+---------+----------------------------------+
| insert  | min(replace, remove, insert) + 1 |
+---------+----------------------------------+

当r = cr=c时,右下角的矩阵值为左上角对角矩阵的值。

+---+------------------------------+
|↘️ |                              |
+---+------------------------------+
|   | just copy the diagonal value |
+---+------------------------------+

对于未填满的左上角第一个元素,r需要转换为h,根据上面第一种情况,周边三个值最小值+1,即0+1=1, 因此距离矩阵如下图:

+------+------+---+---+---+---+---+
|      | null | h | o | r | s | e |
+------+------+---+---+---+---+---+
| null |  0   | 1 | 2 | 3 | 4 | 5 |
|  r   |  1   | 1 |   |   |   |   |
|  o   |  2   |   |   |   |   |   |
|  s   |  3   |   |   |   |   |   |
+------+------+---+---+---+---+---+

按照上述两个规则我们可以填满距离矩阵:

+------+------+---+---+---+---+---+
|      | null | h | o | r | s | e |
+------+------+---+---+---+---+---+
| null |  0   | 1 | 2 | 3 | 4 | 5 |
|  r   |  1   | 1 | 2 | 2 | 3 | 4 |
|  o   |  2   | 2 | 1 | 2 | 3 | 4 |
|  s   |  3   | 2 | 2 | 2 | 2 | 3 |
+------+------+---+---+---+---+---+

得到右下角的值即ros转换成为horse的最小编辑数,即ros和horse的编辑距离为3

这时,我们可以用公式语言描述上述两个规则:

当r \neq cr=c时,右下角的矩阵值为周边三个值最小值+1:

当r = cr=c时,右下角的矩阵值为左上角对角矩阵的值:

现在我们可以将上述计算过程再用合并一下:

不难发现这个公式就是来温斯坦公式,同时也是通过动态规划方法计算编辑距离的状态方程。

使用Python代码实现:

def min_distance(word1: str, word2: str) -> int:row = len(word1) + 1column = len(word2) + 1cache = [ [0]*column for i in range(row) ]for i in range(row):for j in range(column):if i ==0 and j ==0:cache[i][j] = 0elif i == 0 and j!=0:cache[i][j] = jelif j == 0 and i!=0:cache[i][j] = ielse:if word1[i-1] == word2[j-1]:cache[i][j] = cache[i-1][j-1]else:replace = cache[i-1][j-1] + 1insert = cache[i][j-1] + 1remove = cache[i-1][j] + 1cache[i][j] = min(replace, insert, remove)return cache[row-1][column-1]
if __name__ == "__main__":min_distance("ros", "horse")

如果将上述字符换成汉字或是单词,再计算两句话的S+D+IS+D+I的值,就很容易计算WER了。

参考

  1. Wikipedia: Word Error Rate
  2. Minimum Edit distance (Dynamic Programming) for converting one string to another string (需科学上网)
  3. Leetcode: 72. Edit Distance
  4. Multiple lines one side of equation with a Curly Bracket

点击关注,第一时间了解华为云新鲜技术~

AI语音入门:认识词错率WER与字错率CER相关推荐

  1. mlfviewer_语音识别ASR - HTK(HResults)计算字错率WER、句错率SER

    HResults计算字错率(WER).句错率(SER) 前言 好久没发文,看到仍有这么多关注的小伙伴,觉得不发篇文对不住.确实好久没有输出经验总结相关的文档,抽了个时间,整理了下笔记,发一篇关于ASR ...

  2. 语音识别ASR - HTK(HResults)计算字错率WER、句错率SER

    HResults计算字错率(WER).句错率(SER) 前言 好久没发文,看到仍有这么多关注的小伙伴,觉得不发篇文对不住.确实好久没有输出经验总结相关的文档,抽了个时间,整理了下笔记,发一篇关于ASR ...

  3. 语音识别中的词错率(SER)以及字错率(WER)

    1.句错率 句错率(Sentenct Error Rate,SER):如果识别的句子与标准句子中由任意一个字不对应,那么这句话就是错的,错的句子个数除以总句子个数即为句错率. 公式如下:       ...

  4. AI从入门到放弃2:CNN的导火索,用MLP做图像分类识别?

    来源 | 腾讯知乎专栏 作者 | AIoys(腾讯员工,后台工程师) 项目文档和代码在此:github项目地址: https://github.com/zsysuper/AI_Notes ▌一.前言 ...

  5. 依图要修AI语音双学位,左手摸底考第一名成绩单,右手开放平台方案

    李根 发自 凹非寺  量子位 报道 | 公众号 QbitAI 依图,又展示出新前途. 这家以"图"起家的AI公司,现在宣布修个"语音"双学位,而且出场便是学霸的 ...

  6. 全新 AI 语音芯片、双麦 AIoT 模组,科大讯飞硬核技术助力智能家电创新

    据艾瑞咨询的数据显示,2017 年中国智能家居市场规模为 3342.3 亿元,其中智能家电规模为2828.0亿元,占比87%.预计到 2020 年智能家电的市场规模将达到 5155.0 亿元. 智能家 ...

  7. CI130X智能语音芯片应用于空气炸锅,可实现离线语音控制空气炸锅,高抗噪高识别率

    随着人们生活水平的提高,用户对产品的追求呈现多元化趋势,空气炸锅作为一种新兴厨电产品,深受年轻人的喜爱.空气炸锅控制方式也从触摸按键到智能语音控制,所呈现的趋势是易使用,智能化,物联化,舒适化. 启英 ...

  8. Azure AI的又一里程碑,Neural TTS新模型呈现真人般情感饱满的AI语音

    在人与人之间的对话中,即使是同样的字句,也会因为所处情景和情感的不同而表现出丰富的抑扬顿挫,而这种动态性恰恰是各种AI合成语音的"软肋".相比于人类讲话时丰富多变的语气,AI语音的 ...

  9. 助力企业抗疫,360金融推出免费AI语音机器人

    复工潮来临之际,为帮助各大企业进行高效的内部防疫宣传.员工行程信息收集以及快速生成公司内部防疫排班表,360金融针对复工企业的需求痛点推出了AI语音机器人,以助力企业更高效的防疫.抗疫. 针对复工企业 ...

最新文章

  1. 朱敏:40岁创业如何成就绝代明星?(五)
  2. Hibernate的配置文件 Hibernate.cfg.xml与xxx.hbm.xml
  3. SpringBoot整合Mybatis完整详细版
  4. JavaScript设计模式-10.工厂模式实例xhr
  5. kindeditor 限制上传图片大小及宽高
  6. 在数据库系统中遇见存储技术飞跃会怎样?
  7. android代码查找图像,Android平台上利用opencv进行图像的边沿检测
  8. embed标签 阻止点击事件 让父元素处理点击事件
  9. C++面试题-面向对象-面向对象概念
  10. (匹配)Fire Net --hdu --1045
  11. @Value注入static属性
  12. 硕士毕业论文页眉页脚页码设置
  13. CPE/CPA/CPL/CPC/CPM/CPO/CPS/CPV/CPT/CPP广告
  14. windows7桌面计算机作用,win7系统虚拟桌面功能的详细教程
  15. 最小圆覆盖问题 算法步骤与证明+代码模板
  16. c语言微信昵称大全女生,微信昵称女生大全(精选210个)
  17. android 串口通信打开失败
  18. 每日一言:站在高山之巅的人
  19. 第19章 Linux电源管理的系统架构和驱动之CPUFreq驱动
  20. Qt 串口通信软件开发教程

热门文章

  1. 为什么开源和企业用户是天生的盟友
  2. 好的物联网开源框架_通过开源文化实现更好的物联网
  3. Bootstrap3 表单控件的状态
  4. Bootstrap源代码多行代码
  5. 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建
  6. extras mibs php7,ubuntu编译安装php7遇到的问题及解决方案
  7. python线性输出_Python实现基本线性数据结构
  8. python写整数逆位运算_位运算
  9. 神经网络入门概念和框架理解(YOLOv1v2v3改进分析)
  10. 面试系列26 如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试