这一篇文章实际上是参考了不少篇文章以后写出的一篇对于语言模型的一篇科普文,目的是但愿你们能够对于语言模型有着更好地理解,从而在接下来的NLP学习中能够更顺利的学习.
算法
1:传统的语音识别方法:数组
这里咱们讲解一下是如何将声音变成文字,若是有兴趣的同窗,咱们能够深刻的研究.网络
首先咱们知道声音实际上是一种波,常见的MP3等都是压缩的格式,必需要转化成非压缩的纯波形的文件来处理,下面以WAV的波形文件来示例:架构
在进行语音识别以前,有的须要把首尾段的静音进行切除,进行强制对齐,以此来下降对于后续步骤的干扰,整个静音的切除技术通常称为VAD,须要用到对于信号处理的一些技术.框架
若是要对于声音进行分析,就须要对于声音进行分帧,也就是把声音切成一小块一小块,每一小块称为一帧,分帧并非简单地切开,而是使用的移动窗函数来实现的,而且帧和帧之间通常是有交叠的函数
就像上图这样性能
分帧以后,语音就变成了不少个小段,可是波形在时域上是没有什么描述能力的,所以就必需要将波形进行变换,常见的一种变换方法就是提取MFCC特征,而后根据人耳的生理特性,把每一帧波变成一个多维度向量,这个向量里是包含了这块语音的内容信息,这个过程叫作声学特征的提取,可是实际方法有不少,基本相似.学习
至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序列以下图所示,图中,每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。大数据
接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍两个概念:优化
1:音素:
单词的发音由音素构成。对英语,一种经常使用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary。汉语通常直接用所有声母和韵母做为音素集,另外汉语识别还分有调无调,不详述。
1. 状态:这里理解成比音素更细致的语音单位就行啦。一般把一个音素划分红3个状态。
语音识别是怎么工做的呢?实际上一点都不神秘,无非是:
把帧识别成状态(难点)。
把状态组合成音素。
把音素组合成单词。
以下图所示:
图中,每一个小竖条表明一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应哪一个状态了,语音识别的结果也就出来了。
那每帧音素对应哪一个状态呢?有个容易想到的办法,看某帧对应哪一个状态的几率最大,那这帧就属于哪一个状态。好比下面的示意图,这帧在状态S3上的条件几率最大,所以就猜这帧属于状态S3。
那这些用到的几率从哪里读取呢?有个叫“声学模型”的东西,里面存了一大堆参数,经过这些参数,就能够知道帧和状态对应的几率。获取这一大堆参数的方法叫作“训练”,须要使用巨大数量的语音数据,训练的方法比较繁琐,这里不讲。
但这样作有一个问题:每一帧都会获得一个状态号,最后整个语音就会获得一堆乱七八糟的状态号。假设语音有1000帧,每帧对应1个状态,每3个状态组合成一个音素,那么大概会组合成300个音素,但这段语音其实根本没有这么多音素。若是真这么作,获得的状态号可能根本没法组合成音素。实际上,相邻帧的状态应该大多数都是相同的才合理,由于每帧很短。
解决这个问题的经常使用方法就是使用隐马尔可夫模型(Hidden Markov Model,HMM)。这东西听起来好像很高深的样子,实际上用起来很简单: 第一步,构建一个状态网络。 第二步,从状态网络中寻找与声音最匹配的路径。
这样就把结果限制在预先设定的网络中,避免了刚才说到的问题,固然也带来一个局限,好比你设定的网络里只包含了“今天晴天”和“今天下雨”两个句子的状态路径,那么无论说些什么,识别出的结果必然是这两个句子中的一句。
那若是想识别任意文本呢?把这个网络搭得足够大,包含任意文本的路径就能够了。但这个网络越大,想要达到比较好的识别准确率就越难。因此要根据实际任务的需求,合理选择网络大小和结构。
搭建状态网络,是由单词级网络展开成音素网络,再展开成状态网络。语音识别过程其实就是在状态网络中搜索一条最佳路径,语音对应这条路径的几率最大,这称之为“解码”。路径搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。
这里所说的累积几率,由三部分构成,分别是:
1. 观察几率:每帧和每一个状态对应的几率
2. 转移几率:每一个状态转移到自身或转移到下个状态的几率
3. 语言几率:根据语言统计规律获得的几率
其中,前两种几率从声学模型中获取,最后一种几率从语言模型中获取。语言模型是使用大量的文本训练出来的,能够利用某门语言自己的统计规律来帮助提高识别正确率。语言模型很重要,若是不使用语言模型,当状态网络较大时,识别出的结果基本是一团乱麻。
这样基本上语音识别过程就完成了。
2:端到端的模型
现阶段深度学习在模式识别领域取得了飞速的发展,特别是在语音和图像的领域,由于深度学习的特性,在语音识别领域中,基于深度学习的声学模型现现在已经取代了传统的混合高斯模型GMM对于状态的输出进行建模,所以在普通的深度神经网络的基础之上,基于长短记忆网络的递归神经网络对语音序列的强大的建模能力进一步提升了语音识别的性能,可是这些方法依旧包含着最基础的隐马尔可夫HMM的基本结构,所以依旧会出现隐马尔科夫模型的训练和解码的复杂度问题.
基于深度学习的声学模型训练过程必须是由传统的混合高斯模型开始的,而后对训练数据集合进行强制的对齐,而后进行切分获得不一样的声学特征,其实传统的方式并不利于对于整句话的全局优化,而且这个方法也须要额外的语音学和语言学的知识,好比发音词典,决策树单元绑定建模等等,搭建系统的门槛较高等问题.
一些科学家针对传统的声学建模的缺点,提出了连接时序分类技术,这个技术是将语音识别转换为序列的转换问题,这样一来就能够抛弃了传统的基于HMM的语音识别系统的一系列假设,简化了系统的搭建流程,从而能够进一步提出了端到端的语音识别系统,减小了语音对于发音词典的要求.
端到端的系统是由LSTM的声学建模方法和CTC的目标函数组成的,在CTC的准则下,LSTM能够在训练过程当中自动的学习声学的特征和标注序列的对应关系,也就不须要再进行强制的对数据集合进行对齐的过程了.而且能够根据各类语种的特色,端到端识别直接在字或者单词上进行建模,可是由于端到端的识别多是意味着发展的趋势,可是由于彻底崛弃了语音学的知识,现现在在识别性能上仍然和传统的基于深度学习的建模方法有着必定的差距,不过我最近在看的一篇论文中,基于端到端的藏语识别已经达到甚至超过了现有的通用算法.
就拿藏语举例,藏语是一种我国的少数民族语言,可是由于藏族人口较少,相比起对于英文,汉语这样的大语种来讲,存在着语音数据收集困难的问题,在上一篇文章中咱们能够知道,天然语言处理的最重要的需求就是语料,若是有很好的语料库天然会事半功倍,这样就致使了藏语的语音识别研究工做起步较晚,而且由于藏语的语言学知识的匮乏进一步阻碍了藏语语音识别的研究的进展,在我国,藏语是属于一种单音节字的语言,在端到端的语音过程当中,藏语是建模起来很是简单的一种语言,可是做为一种少数民族语言,语料不足会在训练过程当中出现严重的稀疏性问题,而且不少人在研究现有的藏语词典中发现,若是彻底崛弃现有的藏语发音词典,彻底不利用这样的先验知识,这样其实也是不利于技术的发现的,所以现阶段下,采用CTC和语言知识结合的方式来建模,能够解决在资源受限的状况下声学的建模问题,使得基于端到端的声学模型方法的识别率超过当下基于隐马尔科夫的双向长短时记忆模型.
在基于CD-DNN-HMM架构的语音识别声学模型中,训练DNN一般须要帧对齐标签。在GMM中,这个对齐操做是经过EM算法不断迭代完成的,而训练DNN时须要用GMM进行对齐则显得很是别扭。所以一种不须要事先进行帧对齐的方法呼之欲出。此外对于HMM假设一直受到诟病,等到RNN出现以后,使用RNN来对时序关系进行描述来取代HMM成为当时的热潮。随着神经网络优化技术的发展和GPU计算能力的不断提高,最终使用RNN和CTC来进行建模实现了end-to-end语音识别的声学模型。CTC的全称是Connectionist Temporal Classification,中文翻译大概是链接时序分类。它要达到的目标就是直接将语音和相应的文字对应起来,实现时序问题的分类。
这里仍然能够描述为EM的思想:
E-step:使用BPTT算法优化神经网络参数;
M-step:使用神经网络的输出,从新寻找最有的对齐关系。
CTC能够当作是一个分类方法,甚至能够看做是目标函数。在构建end-to-end声学模型的过程当中,CTC起到了很好的自动对齐的效果。同传统的基于CD-DNN-HMM的方法相比,对齐效果引用文章[Alex Graves,2006]中的图是这样的效果:
这幅图能够理解:基于帧对齐的方法强制要求切分好的帧对齐到对应的标签上去,而CTC则能够时帧的输出为空,只有少数帧对齐到对应的输出标签上。这样带来的差异就是帧对齐的方法即便输出是正确的,可是在边界区域的切分也很难准确,从而给DNN的训练引入错误。c) End-to-end模型因为神经网络强大的建模能力,End-to-end的输出标签也再也不须要像传统架构同样的进行细分。例如对于中文,输出再也不须要进行细分为状态、音素或者声韵母,直接将汉字做为输出便可;对于英文,考虑到英文单词的数量庞大,可使用字母做为输出标签。从这一点出发,咱们能够认为神经网络将声学符号到字符串的映射关系也一并建模学习了出来,这部分是在传统的框架中时词典所应承担的任务。针对这个模块,传统框架中有一个专门的建模单元叫作G2P(grapheme-to-phoneme),来处理集外词(out of vocabulary,OOV)。在end-to-end的声学模型中,能够没有词典,没有OOV,也没有G2P。这些全都被建模在一个神经网络中。另外,在传统的框架结构中,语音须要分帧,加窗,提取特征,包括MFCC、PLP等等。在基于神经网络的声学模型中,一般使用更裸的Fbank特征。在End-to-en的识别中,使用更简单的特征好比FFT点,也是常见的作法。或许在不久的未来,语音的采样点也能够做为输入,这就是更加完全的End-to-end声学模型。除此以外,End-to-end的声学模型中已经带有了语言模型的信息,它是经过RNN在输出序列上学习获得的。但这个语言模型仍然比较弱,若是外加一个更大数据量的语言模型,解码的效果会更好。所以,End-to-end如今指声学模型部分,等到不须要语言模型的时候,才是彻底的end-to-end。三、 语言模型(Language Model, LM)语言模型的做用能够简单理解为消解多音字的问题,在声学模型给出发音序列以后,从候选的文字序列中找出几率最大的字符串序列。
四、 解码传统的语音识别解码都是创建在WFST的基础之上,它是将HMM、词典以及语言模型编译成一个网络。解码就是在这个WFST构造的动态网络空间中,找到最优的输出字符序列。搜索一般使用Viterbi算法,另外为了防止搜索空间爆炸,一般会采用剪枝算法,所以搜索获得的结果可能不是最优结果。在end-to-end的语音识别系统中,最简单的解码方法是beam search。尽管end-to-end的声学模型中已经包含了一个弱语言模型,可是利用额外的语言模型仍然可以提升识别性能,所以将传统的基于WFST的解码方式和Viterbi算法引入到end-to-end的语音识别系统中也是很是天然的。然而因为声学模型中弱语言模型的存在,解码可能不是最优的。文章[yuki Kanda, 2016]提出在解码的时候,须要将这个若语言模型减掉才能获得最优结果。
这篇文章语音识别的技术原理是什么?来自于这个问题的多个答案,之间加上了个人一些理解,也但愿请这方面的专家可以多多指教.