声学模型其实就是可以识别单个音素的模型(例如:音素a的模型可以判定一小段语音是否是a);
语言模型表示一个个词串(如果结合了词典,就可以成为一个个音素串)它们在语料库中出现的概率大小(比如,不合语法的词串(句子)概率接近0,很合乎语法的词串概率大);
解码器就是基于Viterbi算法在HMM模型上搜索生成给定观测值序列(待识别语音的声学特征)概率最大的HMM状态序列,再由HMM状态序列获取对应的词序列,得到结果结果。
如果你只做单个音素识别,(语音很短,内容只是音素),那么只用声学模型就可以做到,不用语言模型。做法就是在每个音素的声学模型上使用解码器做解码(简单的Viterbi算法即可)。
但是,通常是要识别一个比较长的语音,这段语音中包含了很多词。这就需要把所有可能的词串,结合词典展开为音素串,再跟音素的声学模型结合,可以得到解码图(实际上可以看成很多很多HMM模型连接而成),然后在这个解码图上实施Viterbi算法,得到最佳序列,进而得到识别结果。
音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary。汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。
状态:这里理解成比音素更细致的语音单位就行啦。通常把一个音素划分成3个状态。
1.数据准备:音频以及对应标注
2.先对数据进行强对齐,去除一些音频和对应标注完全不符的情况,这里需要准备发音词典和音素等资源文件
htk的擅长点是在hmm建模方面,kaldi不但具有此功能,而且还能在深度学习方面直接开展实验
A版本Wer高于B版本0.3,但是Corr却又比B版本高0.5,这是为啥?
这主要是因为Corr=1-Sub-Del,而Wer=Sub+Del+Ins
因此一般以WER为主
答案是:graphviz
输入:目前端到端语音识别常用的输入特征为 fbank。fbank 特征的处理过程为对一段语音信号进行预加重、分帧、加窗、短时傅里叶变换(STFT)、mel 滤波、去均值等。一个 fbank 向量对应往往对应10ms的语音,而一段十秒的语音,即可得到大约1000个 fbank 的向量描述该语音。除了 fbank,MFCC 以及 raw waveform 在一些论文中也被当做输入特征,但主流的方法仍然采用 fbank。
输出:端到端的输出可以是字母、子词(subword)、词等等。目前以子词当做输出比较流行,和 NLP 类似,一般用 sentence piece 等工具将文本进行切分。
端到端语音识别技术将声学特征序列直接转换成字符或词语序列,其中的转换工作仅仅由一个神经网络模型完成。下图对比了端到端语音识别技术和传统语音识别技术识别流程之间的差异。
在传统的语音识别技术中,实现声学特征到文本的转换相对复杂很多。在传统的语音识别系统中也存在一个神经网络模型。虽然它的输入也是声学特征,但它的输出代表的是比字符或者词语更加细粒度的语音单位(比如,音素的状态)。解码器无法单独使用神经网络的输出进行解码,还需要结合由隐马尔科夫模型(HMM),发音词典和语言模型构成的解码图才能解码得到识别结果。其中,HMM实现对音素的建模;发音词典包含了所有词语的发音,每个发音由多个音素表示;语言模型则对词语之间连接的概率进行建模。
如果追求实时率,可能还是kaldi更猛些
语音识别的主要任务在于从语音到文本 其处理流程主要分为三个部分:
特征提取:将语音信号转化为特征向量,代表有mfcc和i-vector
声学模型:衡量语音特征和文本之间的距离,判断该语音听起来像什么
语言模型:结合先验知识对声学模型的识别结果进行评价,判断识别结果像不像人话
其中声学模型是研究的主体
根据原理,声学模型可分为三个框架:HMM、CTC和LAS
HMM+GMM是传统语音识别的核心,至今仍有深远影响 在使用HMM+GMM进行声学模型的解码之前,要做三件事:
所有这些所有模块中,语言模型和后处理的问题最容易被用户发现,因为其他技术模块的问题很难被一眼就看出来,而一旦出现同音不同字,或者加标点、顺滑等后处理问题时却很容易被发现。甚至于很多其他模块出的问题,也易被误解为是语言模型和后处理的问题,这就是为何语言识别团队,往往语言模型和后处理的离职率最高的原因。
这有点像一个人生病了,他咳嗽、流鼻涕很容易就被发现,但他得了癌症了,却很难一眼看出来。对于普通大众而言,往往只能对病的表征做出最简单的判断,在没有深入分析的条件下,无法挖掘真正的原因。
而且有意思的是,对于普通用户,在使用这种语音识别工具的时候,也更容易发现同音不同字的问题,以及加标点等后处理的badcase,而很难去凭肉眼发现声学模型或者解码器的bug,这导致经常语言模型团队和后处理团队的人容易背锅,即使他们经过一步步查case,最后发现是声学模型或者解码器的问题,也不会得到及时的处理,因为声学模型或者解码器的修改往往比较难,很长时间才更新一次。而语言模型或者后处理却能很快更新,这种快更新不会成为一种功劳,反而会成为了一种工作上的负担,因为语音识别的badcase往往都是找语言模型或者后处理的团队及时修复。
http://openslr.org/94/