如上图,我们通过微信发送了一段语音,在对语音进行转文字时。语音识别引擎首先会将把这段语音进行分帧(切分成若干小段),然后利用声学模型将提取的每一帧的声学特征识别为一个个 “状态”,多个状态会组合成一个音素(语音中的最小的单位),音素构成了诸多同音字,再利用 语言模型 从诸多同音字中挑选出可以使 语义完整的字(例如 不会把 “吃饭” 识别成 “痴泛”),最后将文本展示出来。
自动语音识别技术(Automatic Speech Recognition)是一种将人的语音转换为文本的技术。
所谓语音识别,就是将一段语音信号转换成相对应的文本信息,系统主要包含特征提取、声学模型,语言模型以及字典与解码四大部分。
此外为了更有效地提取特征往往还需要对所采集到的声音信号进行滤波、分帧等音频数据预处理工作,将需要分析的音频信号从原始信号中合适地提取出来。
特征提取工作将声音信号从时域转换到频域,为声学模型提供合适的特征向量。
声学模型中再根据声学特性计算每一个特征向量在声学特征上的得分,而语言模型则根据语言学相关的理论,计算该声音信号对应可能词组序列的概率。
最后根据已有的字典,对词组序列进行解码,得到最后可能的文本表示。
其中大致过程梳理如下(为方便理解忽略部分严谨性):
1 语音信号
今天又是美好的一天呀
*2 特征提取 *
今天又是美好的一天呀 → [[123456],[],[]]
*3 声学模型 *
[[123456],[],[]] → j i n t i a n y o u s h i m e i h a o d e y i t i a n
*4 字典 *
今:j īn ; 进:j ìn ; 天:t i ān; 填:t i án ; 又:y òu; 佑:y òu;是:sh ì; 美:m ěi ; 妹:m èi; 好:h ǎo; 的:d e; 一:y ī; 甜:t i án;
5 语言模型(概率)
今天:0.7456; 又:0.6524;是:0.9301;又是:0.6012;美好:0.7621,没好:0.5049,的:0.9871,;一:0.9123,天:0.6785,一天:0.9043;呀:0.7849,压:0.4356
6 输出文字
今天又是美好的一天呀
识别错误的句子个数 除以总的句子个数,即为 SER。
计算公式
SER = 错误句数 / 总句数 * 100%
可以理解为以下几种情况会导致句子错误:
识别正确的句子个数 除以总的句子个数,即为 S.Corr。
计算公式
S.Corr = 1 - SER = 正确句数 / 总句数 * 100%
为了使识别出来的词序列(实际识别结果)和标准的词序列(期望识别结果)之间保持一致,需要进行替换、删除或者插入某些词,这些插入、替换或删除的词的总个数,除以标准的词序列中词的总个数的百分比,即为 WER。
WER 是语音识别领域的关键性评估指标,WER 越低表示效果越好。
为什么存在这两种表示方式,原因如下:
通俗点的解释就是:
WER = (S + D + I ) / N = (S + D + I ) / (S + D + C) * 100%
公式注解
同时,在计算公式中因为有插入字数的计算,所以理论上 WER/CER 存在大于 100% 的可能。但实际场景,特别是大样本量的时候,基本太不可能出现。,否则就太差了,不可能被商用。
字准确率(Word Accuracy),就是 1-字错误率的结果。
计算公式
W.Acc = 1 - WER(或CER) = (N - D - S - I) / N = (C - I) / (S + D + C) * 100%
公式注解
字正确率(Word Correct),通常说的某某 ASR 识别率 (识别正确率) 达到 97%,就是指的字正确率,计算中忽略了插入的字数。
计算公式
W.Corr = ( N - D - S ) / N = C/ (S + D + C) * 100%
公式注解
示例:
语音输入: 今 天 又 是 美 好 的 一 天 呀
文本输出: 今 天 又 是 美 好
ASR 各指标计算结果,如下:
示例:
语音输入: 今 天 又 是 美 好 的 一 天 呀
文本输出: 今 天 有 是 美 好
ASR 各指标计算结果,如下:
示例:
语音输入: 今 天 又 是 美 好 的 一 天 呀
文本输出: 今 天 有 是 更 美 好
ASR 各指标计算结果,如下:
示例:
语音输入: 今 天 又 是 美 好 的 一 天 呀
文本输出: 上 山 打 老 虎
ASR 各指标计算结果,如下:
识别结果字数大于语料字数,且全错的情况
示例:
语音输入: 今 天 又 是 美 好 的 一 天 呀
文本输出: 景 甜 有 时 妹 号 得 亿 田 丫 上 山 打 老 虎
ASR 各指标计算结果,如下:
后续抽时间分享下,测试中技术难点,即如何基于编辑距离实现对 WER 的计算,包括精确的解析出 “C\S\D\I” 数据。大致输出如下 对于每个音频样本的识别结果。
{
# 音频标注文本
"ref": "五六七八九十",
# 音频预测文本
"hyp": "五七捌九玖十",
"result_detail": {
# 所有对的字列表
"C": [
{ "ref_value": "五", # ref的值
"hyp_value": "五", # hyp的值
"ref_index": 0, # 该值在ref的索引位置
"hyp_index": 0, # 该值在hyp的索引位置
"ref_syllable": "wu", # ref中该值的音节
"hyp_syllable": "wu", # hyp中该值的音节
"ref_tones": "3", # ref中该值的音调
"hyp_tones": "3" # hyp中该值的音调
},{……} ],
# 所有编辑的字列表
"S": [{……}, ],
# 所有删除的字列表
"D": [{……}, ],
# 所有插入的字列表
"I": [{……}, ]
},
# 字句的指标
"result_indicator": {
# 字错率wer指标
"wer": 0.500,
# 句错率ser指标
"ser": 1
},
# 编辑距离计算出的各项值
"result_count": {
# 全部的数量 N = S + I + D + C
"N": 6,
# 正确的的数量
"C": 4,
# 错误的的数量 W = S + I + D
"W": 3,
# 插入的数量
"I": 1,
# 删除的数量
"D": 1,
# 编辑的数量
"S": 1
},
# 将 ref 与 hpy 建立相对索引,对齐后的字典,方便展示输出
"relative_index_value": {
# 索引 1
"1": {
"ref_value": "五", # ref的值
"ref_index": 0, # 该值在ref的索引位置
"hyp_value": "五", # hyp的值
"hyp_index": 0, # 该值在hyp的索引位置
"syllable_type": "C", # 音节比对结果,C=正确 S=错误
"hyp_syllable": "wu", # hyp中该值的音节
"ref_syllable": "wu", # ref中该值的音节
"tones_type": "C", # 音调比对结果,C=正确 S=错误
"hyp_tones": "3", # hyp中该值的音调
"ref_tones": "3", # ref中该值的音调
"type": "C" # 字符比对结果,C=正确 S=编辑 I=插入 D=删除
},
# 索引二
"2": {{……},}
}
}