2017-08-04 14:02:49 qq_28125719 阅读数 323
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

阅读原文请点击

摘要: 目前深度学习在图像和语音识别等领域应用越来越广泛,比如图像处理类应用、视频归纳、智能客服,以及延伸的服务机器人领域、车载助手等,本文着重介绍深度学习在语音识别中声学模型与语言模型中的应用,如FSMN,LSTM,RNN等网络结构的设计,比传统的结构在效果上有巨大的提升

         过去 3 年,深度学习在各个领域取得较大突破,比如计算机视觉领域的物体识别、场景分类,语音分析等,并且其技术推广和应用的速度超过人们预期,比如 Google 的广告系统已经开始使用深度学习盈利,Twitter 也通过深度学习改善App 图片及视频内容服务体验。那具体何为深度学习呢?深度学习是怎么应用在上述的各个领域呢,下面结合自身在语音识别的若干年经验,谈谈深度学习在语音识别中的具体应用。

 

0. 背景

 

         “深度学习”的概念在上个世纪便被提出,但Hinton、Lecun等人在2006年发表的论文让“深度学习”重新焕发光彩,并使得相关的学术成果在实际应用中表现良好。它的灵感来自对人脑神经的研究,因此也称为深度神经网络“DNN”。这里的“深度”并非指算法有内涵,而是指神经网络层数多,因此也称为多层结构学习算法(这几种命名不完全对等,具体的差别涉及到学派)。实际中的“深度神经网络”算法与大脑神经结构差别极大,因此深度神经网络被称为端到端的机器学习算法或者多层联结算法或许更好些(联结主义流派的说法)。

           基于深度神经网络算法的重大影响工作的出现,是在2012年之后。比如Krizhevsky、Hinton等用深度学习大幅度提高了图片分类的准确率,奠定了图像分类模型“AlexNet”的地位;Dahl等大幅度提升了语音识别的准确率。

            声学模型以及语言模型就像人的左右大脑一样,没有他们,语音识别系统就是一个空壳,毫无作用。

 

1. 深度学习与AM

     1.1 深度学习在AM中的应用与现状

 

         传统基于HMM的hybrid框架,例如:GMM-HMM,CD-DNN-HMM依然是工业界应用的主流技术,并且各种训练算法以及工具都很成熟,例HTK,Kaldi,Sphinx,并且在很多工业界都有应用。

         目前学术研究的重点逐渐转向End-To-End模型训练。其中比较成熟的训练方法是基于CTC准则的训练。文献报告结果显示[21],LSTM-CTC模型识别准确度高于HMM-LSTM模型,识别速度更快。

基于Attention机制的End-To-End模型训练成为研究热点[22],也是Google,Microsoft等目前的研究热点领域。但是目前据文献报告,识别准确度差于LSTM-CTC模型。

         CNN技术重新得到重视[19][20],作为End-To-End中特征提取的重要一环。

 

    1.2 基于FSMN的AM

 

         FSMN[18],是由科大讯飞提出的一种基于DNN改进型网络结构。在DNN的隐藏层中引入延时结构,将t-N~t-1时刻的隐藏层历史信息作为下一层的输入,从而引入了语音序列的历史信息,同时避免了RNN训练BPTT带来的问题,如:梯度消逝,计算复杂度高等。

 

图1 FSMN结构

         这种结构的设计是来源于Oppenheim的数字信号处理的部分[23],用无限长的脉冲响应滤波器(IIR)来模拟近似高阶的有限脉冲响应滤波器(FIR)。因为RNN中的Recurrent层可以看作一阶的IIR,它可以精确的被高阶的FIR来近似模拟。在这种全连接的结构的基础上再加上一些记忆单元,就如在FIR中延时单元一样,这样可以在前向计算的时候比纯粹的RNN更加高效并稳定。正因为该记忆单元的存在,它可以将更长的上下文信息压缩为一个固定长度的向量,这样可以使模型能够学到更多前后依赖的重要信息。

 

\

图2 Recurrent layer 和 IIR

         FSMN另外一点创新的地方在于引入了Attention机制。核心思想在于模仿人类的思考行为,因为人类在思考问题的时候,一般会先考虑他经历过的,或者听过的事,另外聪明的人类也会根据已有的经验来预测未来将要发生的事,结合这两者,作出的决定将更加正确,更加有实效性。因此在FSMN中,也引入了Lookback以及Lookahead思想,但是两者对当前的作用大小是不同的,因此需要计算二者的系数,这个系数就称为Attention Coefficient。具体公式如下:

 

                 

 

其中,

 

是Attention函数的参数,详细信息可以参考该论文[18],另外Recurrent的计算公式如下:                                                                                                          

 

其中N1和N2分别表示Lookback以及Lookahead的阶数,

表示attention系数,可以很清晰的看出,该层所学习到的内容由历史以及将来组成。

训练的过程,跟大多数NN一样,都是SGD准则,使用mini-batch,同时用GPU加速,过程不在赘述。

实验结果如下表所示:

         

表1 FSMN与DNN,LSTM的对比

其中基线DNN模型是根据论文[24][25]训练得到的,整体依然采用的CD-DNN-HMM框架。在状态对齐的训练过程中,依然采用标准的GMM-HMM框架,MLE准则。预训练依然采用RBM策略。在DNN训练的过程中,依然采用CE准则,BP更新误差,网络结构是6x2048,输入特征是FB,每帧123维,上下窗长为11,DNN1的激活函数是sigmoid,DNN2采用的是ReLU。

         另外LSTM模型是根据论文[25][26][27]训练得到的,其中cell数为2048,projection节点数为512,输入依然是123维的FB特征,延迟5帧输出,BPTT为16,minibatch为64,另外BLSTM是双向的模型,BLSTM比LSTM多了3个hidden层,以及2048个cell,minibatch改为16,其他都一致。

         FSMN模型,其中sFSMN表示scalar FSMN,vFSMN表示vectorized FSMN,sFSMN的hidden层数为6,每层2048个节点,激活函数为ReLU,输入为123维FB特征,上下窗为3,vFSMN中多了lookback以及lookahead参数,试验中设为50。

从实验结果来看,vFSMN的结果最优,比BLSTM绝对好0.3个点,另外训练的速度是BLSTM的3倍。

 

2. 深度学习与LM

     2.1 基于Recurrent Neural Network的LM

 

         在讨论RnnLM之前,不得不提现在依然处于统治地位的Ngram模型,Ngram是基于马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词。

假设下一个词的出现依赖它前面的一个词,则有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)=p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)

假设下一个词的出现依赖它前面的两个词,则有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2)

        纵观Ngram的历史,主要在机器翻译,语音识别,拼写纠错,自动文摘等方面应用的很广泛,并取得了很好的效果,可是它本身也有一定的缺陷,比如数据稀疏性问题不能很好的解决,折扣平滑不够鲁棒,另外一个是严格的基于N阶的马尔可夫假设,限制了对更长历史的记忆。

RNN模型是将每个词语映射到一个Compact Contiuous Vector Space里,并且使用Recurrent Connections 将过去更长时间的历史连接起来,从而影响现在的输出,这样更贴近实际。

        RNN的结构一般是3层,输入层,隐藏层和输出层,其中输入与输出层的维数是和词典里词的个数是一致的,隐藏层一般根据实际需要,可以设置为512或1024等,有时为了加速,还加入了Class层,即根据输入的词语先预测该词所属的类,然后在预测在该类里面的词的概率大小,这样可以减少矩阵运算。在论文[1][2][3]中还提出了OOS Nodes也是为了减少矩阵运算量,加快迭代。具体结构如下图所示:

                                                                  

图3 RNN 结构

         另外,在RNN训练的过程中用到了BPTT算法[4],因为隐含层经过不断的迭代,保留了N个隐含层的最新数据,根据微分链式法则,误差需要一直传递下去                                                                                                                                        

图4 BPTT 迭代

另外误差准则,论文[5]中提到的有Cross Entropy

                                                             


Variance Regularisation

                                                             


以及Noise Contrastive Estimation

                                                            


         根据论文[5]的结果所示,从ppl以及wer的角度对比以上三种准则的效果如下表所示:

                                                     

表 2三种准则在50-best的rescoring的结果

         其中选用的训练集为Fisher和AMI[8],总共大小14M,Rnn输入层的节点数为33K,隐含层的节点数为512,输出层为22K,选取常用词汇构成,BPTT参数为5,即只往下传递5层,总共迭代10次。

另外与传统的Ngram对比结果如下:

                                                      

表3 与ngram对比的结果

其中3g,4g是用相同的语料,采用通用的工具srilm来训练的,CRNN是基于Class的RNNLM[6][7]工具训练的,FRNN是采用CUED-RNNLM[5]工具训练的,都是基于CE准则。从表格中可以看出,FRNN的效果最好。

 

2.2 基于Long Short Term Memory的LM

 

         从RNN的结构以及训练的过程来看,RNN的确比Ngram看到的历史更长,利用的信息更多,另外在输入层与隐含层之间的矩阵通过训练后,每一列可以表示one-hot对应的词向量,利用词向量的方式,可以减少数据稀疏性的影响,因为Ngram对未出现的词语是用很硬的折扣平滑方式来分配概率的,这样做存在缺陷。

         更加细致的分析RNN的结构时,会发现,对于任意的连续的输入,都结合上一次的历史,进行相同的操作,也就是不管遇到什么样的词(高频的,低频的,处于不同上下文的),都同样的学习相关的历史,而没有选择对它有重要影响的信息进行学习,导致没有区分性与侧重点,这跟我们生活很像,在生活中,我们并不是对待所有的事物,花同样的精力去学习,肯定是有所侧重,只会花更大的精力学习对自己有重要影响的事,即选择性的学习。

         LSTM[9][13]即是在这样的思想的驱动下出现的。它比RNN在结构上了多了几个门的概念,即输入门,输出门,遗忘门,分别控制对应的输入输出,以及决定着是否需要遗忘,结构如下:

                                                            

图5 LSTM 神经元结构图

 

与RNN结构对比,即是将原始hidden层替换为LSTM层,整体结构如下图所示:

                                                           

图6 基于LSTM的RNN的整体结构

 

         由于多了几个门,在训练阶段即多了几个矩阵相乘的运输量,而且是每次迭代都会产生这种运算量,跟上面的RNN训练过程类似,但是在速度上慢了很多。

训练过程中,权重的更新一般是按如下的公式:

                                                              

F是目标方程,一般情况下是根据最大似然准则来设定的,

是学习率,可以在训练的过程中控制学习的速率,从而控制模型收敛的速率。误差反向传播依然用的是BPTT[10][11][12]的算法,以及SGD的策略,与RNN一致。在这里面学习率调节,直接影响着模型的优劣,以及模型是否收敛等,根据论文[9]所示,在训练开始阶段,可以设置大一些,经过几轮迭代,可以根据在验证集上的ppl的变化幅度,来相应的降低学习率[14]。

       NN语言模型一般是用于Lattice Decoding和Rescoring,一般情况下,Lattice结构是由前缀树构成,在Lattice上每个Node的输出都是唯一的,才可以采用NN语言模型解码,另外结合Beam Pruning,以及Acoustic LM look ahead等算法,详细内容可以参考论文[9][15][16][17]

下表是论文[9]中实验用到的数据集:

                                                    

表4 实验用到的数据集

 

与Kneser-Ney-Smothed 5gram模型,以及rnnlm 工具训练出的模型在Dev以及Test上的效果对比如下:

                                                    

表5 各个模型下的ppl的对比

 

其中LSTM 的Hidden层节点数是300,Class层为1000,整个词典大小为200K,从结果中,可以看出,LSTM模型的效果要比RNN[17]好10个点以上。
       最后由于本人水平有限,在理解剖析论文细节时,难免有不恰当之处,望各位专家多多指正。

 

3. 参考文献

[1] J. Park, X. Liu, M.J.F. Gales, and P.C. Woodland, “Improved neural network based language modelling and adaptation”,Proc. Interspeech, 2010.

[2] H. Le, I. Oparin, A. Allauzen, J. Gauvain, and F. Yvon, “Struc-tured output layer neural network language models for speech recognition”, IEEE Trans Audio, Speech, and Language Pro-cessing, vol. 21, no. 1, pp. 197–206, 2013.

[3] X. Liu, Y. Wang, X. Chen, M.J.F. Gales, and P.C. Woodland,“Efficient lattice rescoring using recurrent neural network lan-guage models”, Proc. ICASSP, 2014.

[4] D.E. Rumelhart, G.E. Hinton, and R.J. Williams, Learningrepresentations by back-propagating errors, MIT Press, Cam-bridge, MA, USA, 1988.

[5] T. Mikolov, S. Kombrink, L. Burget, J.H. Cernocky, and S.Khudanpur, “Cued-rnnlm—an open-source toolkit for efficient traning and evaluation of recurrent neural network language models”, Proc. ICASSP, 2011.

[6] T. Mikolov, S. Kombrink, A. Deoras, L. Burget, and J. Cer-nocky, “Recurrent neural network language modeling toolkit”,Proc. ASRU Workshop, 2011.

[7] X. Chen, Y. Wang, X. Liu, M.J.F. Gales, and P.C. Woodland,“Efficient training of recurrent neural network language mod-els using spliced sentence bunch”, Proc. Interspeech, 2014.

[8] I. McCowan, J. Carletta, W. Kraaij, S. Ashby, S. Bourban, M.Flynn, M. Guillemot, T. Hain, J. Kadlec, V. Karaiskos, M. Kro-nenthal, G. Lathoud, M. Lincoln, A. Lisowska, W. Post, D.Reidsma, and P. Wellner, “The AMI meeting corpus: A pre-announcement,” Machine learning for multimodal interaction,pp. 28–39. Springer, 2006.

[9] Martin Sundermeyer, Ralf Schl ̈uter, Hermann Ney,“rwthlm – The RWTH Aachen University Neural Network Language Modeling Toolkit”, Proc. ICASSP, 2016.

[10] Rumelhart, D. E., Hinton, G. E., Williams, R. J., “Learning In-ternal Representations by Error Propagation”, in: McClelland,J. L., Rumelhart, D. E., PDP Research Group, The, “Parallel Dis-tributed Processing”, The MIT Press, 1986, pp. 318–362.

[11] Werbos, Paul J., “Backpropagation Through Time: What It Doesand How to Do It”, Proceedings of the IEEE 1990, Vol. 78, No. 10,pp.1550–1560

[12] Williams, R. J., Zipser, D., “Gradient-Based Learning Algorithmsfor Recurrent Networks and Their Computational Complexity”,in: Chauvain, Y., Rumelhart, D. E., “Backpropagation: The-ory, Architectures, and Applications”, Psychology Press, 1995,pp. 433–486

[13] Graves, A., Mohamed, G., Hinton, G., “Speech Recognition with Deep Recurrent Neural Networks”, Proc. of ICASSP 2013, pp.6645–6649

[14] Hinton, G., “Neural Networks for Machine Learning”, Online Course at coursera.org, Lecture 6, 2012

[15] Auli, M., Galley, M., Quirk, C., and Zweig, G., “Joint Lan-guage and Translation Modeling with Recurrent Neural Net-works”, Proc. of EMNLP 2013, pp. 1044–1054

[16] Sundermeyer, M., T ̈uske, Z., Schl ̈uter, R., and Ney, H., “Lattice Decoding and Rescoring with Long-Span Neural Network Lan-guage Models”, Interspeech 2014, accepted for publication

[17] Mikolov, T., Deoras, A., Kombrink, S., Burget, L., and Cˇernock ́y,J. H., “Empirical Evaluation and Combination of Advanced Lan-guage Modeling Techniques”, Proc. of Interspeech 2011, pp. 605–608

[18] Shiliang Zhang, Cong Liu, Hui Jiang, Si Wei, Lirong Dai, Yu Hu,” Feedforward Sequential Memory Networks: A New Structure to Learn Long-term Dependency”, arXiv:1512.08301v2 [cs.NE] 5 Jan 2016

[19]F. Seide, G. Li, and D. Yu, “Conversational speech transcription using context-dependent deep neural networks,” in Proc. Interspeech,2011.

[20]Kanishka Rao, etc., Flat Start Training of CD-CTC-SMBR LSTM RNN Acoustic Models, ICASSP 2016

[21]Tara Sainath,etc.,Convolutional, Long Short-Term Memory, Fully Connected Deep Neural Networks,ICASSP 2015

[22]Bahdanau, D., Cho, K., and Bengio, Y. Neural machine translation by jointly learning to align and translate. arXiv preprint arXiv:1409.0473, 2014.

[23]Oppenheim, A. V., Schafer, R. W., Buck, J. R., and et al. Discrete-time signal processing, volume 2. Prentice-hall Englewood Cliffs, 1989.

[24]Dahl, G.E., Yu, D., Deng, L., and Acero, A. Contextdependent pre-trained deep neural networks for largevocabulary speech recognition. IEEE Transactions on Audio, Speech, and Language Processing, 20(1):30–42, 2012.

[25] Hochreiter, S. and Schmidhuber, J. Long short-term memory. Neural computation, 9(8):1735–1780, 1997.

[26] Sak, H., Senior, A., and Beaufays, F. Long short-term memory based recurrent neural network architectures for large vocabulary speech recognition. arXiv:1402.1128, 2014.

[27]Sainath, T.N., Mohamed, A., Kingsbury, B., and Ramabhadran, B. Deep convolutional neural networks for LVCSR. In Proceedings of IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), pp. 8614–8618, 2013.

阅读原文请点击

2018-12-24 10:16:11 a493823882 阅读数 2472
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

转自知乎

作者:王赟 Maigo
链接:https://www.zhihu.com/question/35833334/answer/67944671
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

语音识别系统的目的,是把语音转换成文字。具体来说,是输入一段语音信号,要找一个文字序列(由词或字组成),使得它与语音信号的匹配程度最高。这个匹配程度,一般是用概率表示的。用X表示语音信号,W表示文字序列,则要求解的是下面这个问题:
W^* = \arg \max_W P(W|X)

一般认为,语音是由文字产生的(可以理解成人们先想好要说的词,再把它们的音发出来),所以上式中条件概率的顺序就比较别扭了。没关系,我们有贝叶斯公式,可以把条件和结论拧过来:
W^* = \arg \max_W \frac{P(X|W) P(W)}{P(X)} = \arg \max_W P(X|W) P(W)
第二步省略分母是因为我们要优化的是W,而P(X)不含W,是常数。

上面这个方程,就是语音识别里最核心的公式。可以这样形象地理解它:我们要找的W,需要使得P(W)P(X|W)都大。P(W)表示一个文字序列本身的概率,也就是这一串词或字本身有多“像话”;P(X|W)表示给定文字后语音信号的概率,即这句话有多大的可能发成这串音。计算这两项的值,就是语言模型声学模型各自的任务。

====================

先说语言模型(language model)。语言模型一般利用链式法则,把一个句子的概率拆解成其中每个词的概率之积。设W是由w_1, w_2, \ldots, w_n组成的,则P(W)可以拆成:
P(W) = P(w_1) P(w_2|w_1) P(w_3|w_1,w_2) \ldots P(w_n|w_1,w_2,\ldots,w_{n-1})
每一项都是在已知之前所有词的条件下,当前词的概率。

不过,当条件太长的时候,概率就不好估计了,所以最常见的做法是认为每个词的概率分布只依赖于历史中最后的若干个词。这样的语言模型称为n-gram模型,在n-gram模型中,每个词的概率分布只依赖于前面n-1个词。例如在bigram(bi-是2的前缀)模型中,P(W)是拆成下面这种形式的:
P(W) = P(w_1) P(w_2|w_1) P(w_3|w_2) \ldots P(w_n|w_{n-1})
n-gram模型中的n越大,需要的训练数据就越多。一般的语音识别系统可以做到trigram(n=3);Google似乎可以做到n=7。

为了利用到历史中比较久远的信息,人们还创造了许多种其它的语言模型,例如基于神经网络的语言模型。由于训练数据量的限制,这些模型单独使用时性能一般并不好,需要跟n-gram模型结合使用。

====================

再说声学模型(acoustic model)。声学模型的任务是计算P(X|W),即给定文字后,发出这段语音的概率。首先第一个问题就是:怎么才能知道每个单词应该发什么音呢?这就需要另一个模块,叫作词典(lexicon),它的作用就是把单词串转换成音素串。词典一般认为是跟声学模型、语言模型并列的模块。词典中会遇到一词多音的问题,但这里就不节外生枝了。

有了词典的帮助,声学模型就知道给定的文字串该依次发哪些音了。不过,为了计算语音与音素串的匹配程度,还需要知道每个音素的起止时间。这是通过动态规划算法来进行的,利用动态规则算法,可以高效地找到音素的分界点,使得每一段语音与音素的匹配程度(用概率表示)之积最大。实际使用的算法称为Viterbi算法,它不仅仅考虑了每一段语音与音素的匹配程度,还考虑了在各个音素之间转换的概率;后者是通过隐马尔可夫模型(HMM)估计出来的。
(实际系统中使用的是比音素更小的单位,不过原理是一样的,也不展开了)

在求音素分界点的过程中,以及在有了分界点后计算P(X|W)时,声学模型都需要知道怎样计算一个音素与一段语音信号的匹配程度。要做这件事,需要找到一种合适的表示语音信号的方法。一般是把语音信号分成许多帧,对于每一帧,通过傅里叶变换等一系列操作,把它转换成一个特征向量。最常用的特征是MFCC,具体提取过程可以参见语音识别技术中提取的声音特征的参数具体指什么? - 频谱分析。从训练数据中,我们可以提取出大量的特征向量,以及它们对应的音素;利用这些数据,就可以训练从特征到音素的分类器。前些年最常用的分类器是高斯混合模型(GMM),它的大致原理是估计出每个音素的特征向量的分布,然后在识别阶段,计算每一帧的特征向量x_t由相应音素s_i产生的概率P(x_t|s_i),把每一帧的概率相乘,就得到P(X|W)。现在,神经网络渐渐火了起来,它可以直接给出P(s_i|x_t),用贝叶斯公式可以转换成P(x_t|s_i),再相乘得到P(X|W)

====================

从上面的叙述来看,求文字串、计算语言模型概率、求音素串、求音素分界点、计算声学模型概率几个步骤似乎是依次进行的。其实不然,因为文字串、音素分界点都有非常多种可能,枚举是不现实的。实际中,这几个步骤同时进行并互相制约,随时砍掉不够优的可能,最终在可接受的时间内求出最优解W^* = \arg \max_W P(W|X)

2017-02-17 21:52:06 quheDiegooo 阅读数 11734
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

在上一章语音识别过程中提到的P(O|)称做观测最大释然,由声学模型计算可得,本章就主要描述HMM+GMM来计算最大释然的过程。

首先回顾一下:在解码过程中


P(O|)由声学模型训练得到,

P(O|)是W的似然函数,结合之前讲述的声学特征也就是说,在给定的W情况,使得当前的特征向量(MFCC)的概率最大,结合HMM的概念,也就是说在在t时刻给定状态qi 的前提下,求输出O的概率,即p(ot|qi) ,即矩阵B,状态对应的是word,phone或者subphone,在LVCSR中对应的是subphone

在解码阶段,在固定观测向量ot 的前提下,我们需要计算每一个HMM状态可能产生的概率,然后找到最大可能的状态(subphone)序列,所以训练过程就是计算观测似然矩阵B的过程。

理想的方式计算MFCC的时候,可以把输入的帧映射为一些离散的量化符号方便计算,如下图所示


然后这么计算似然是有问题的,因为输入音频是连续的,特征基本变化很大的,很难进行比较好的聚类,因此提出连续空间的概率密度函数(PDF),最常用的计算声学似然的方式是高斯混合模型,即GMM模型(当然SVM,CRF,NN也可以)。

高斯分布也是一种正态分布,函数如下所示


不同的均值,方差下,对应的高斯分布如下所示:


离散情况下,均值,方差计算如下所示:

 


当高斯函数用来当做概率密度函数时,曲线下的面积和应该为1,如下所示,灰色区域面积为0.341



我们可以用单GMM pdf来估测一个特定的HMM状态j,产生一个单一维度的声学特征向量O的概率,(假设

ot 服从正态分布),换句话说,就是用对一维特征来说,一元高斯来代表观测似然函数bj (ot )  ,

假设HMM状态j 对应的均值方式是μj 和σ2j  ,那么计算似然  bj (ot ) 可以通过Gaussian PDF来计算,如下所示:


有了以上公式,我们就可以来进行HMM decoding了

然而如何计算均值和方差呢,按理来说可以通过如下公式进行计算


然而,状态是HMM隐藏状态,我们不知道Ot是由哪个状态产生的,

但是我们可以通过HMM中t时刻在状态i的概率来按比例分配,即把每个Ot分配给每个可能的状态i。

ξ(i) 记做在t时刻状态i产生Ot的概率,

那么通过Baum-Welch 迭代算法进行计算,如下所示:


也叫作HMM前向-后向(Baum-Welch)训练。

以上讨论的是一维特征,在实际中,MFCC是39维特征,因此我们使用了多元高斯模型,

多元高斯分布函数如下所示:


协方差计算公式如下:


则,高斯概率似然函数(o如下所示:


因为对角协方差计算量更小,所以可以简化为对角协方差

可以表述为:在t时刻,状态j产生声学特征向量Ot的似然函数可以表述为对角协方差多元高斯,

上述公式可以简化成如下公式



ξ(i) 记做t时刻,状态i产生Ot的似然对应均值方差为:


以上的前提声学特征符合正态分布,但是实际倒谱特征MFCC不是正态分布,因此我们可以改进为

加权的混合多远高斯模型,即GMM,对应函数公式如下所示:


对应的输出似然函数b j (ot 如下所示:


把ξtm(j)记做t时刻,状态j,在m元 混合模型情况下产生声学特征Ot的概率,公式如下


对应均值方差,同样可以由Baum-Welch 迭代算出来,公式如下:


在实际计算中,一个句子的似然是一串概率相乘,导致概率数值非常低,如.00000001 = 10容易下溢出,而且不方便计算,,所以常常用log来计算,则上述输出似然函数(o)可以改写如下所示


重写可得:


其中C为:


C为常数,可以再decoding之前提前计算出来,节省计算时间

以上就是GMM在训练声学模型中的应用。

接下来会写HMM和GMM结合训练声学模型的实践,敬请期待!









2016-06-29 23:12:01 zjm750617105 阅读数 25936
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

本文主要受参考自: http://blog.csdn.net/by21010/article/details/51506292  以及: https://www.zhihu.com/question/35833334

最近看essen源码,感觉对于ASR 的一下之前的比较基础的算法很生疏, 在知乎上看到这个链接,感觉讲的比较通俗易懂,拿来再理解一下。

decoder是根据字典, 声学模型和语音模型,将输入的语音特征失量序列转化为字符序列。

声学模型是对声学、语音学、环境的变量、说话人性别、 口音等的差异的知识表示, 而语言模型是对一组字序列构成的知识表示。


声学模型用lstm+ctc训练,得到语音特征到音素的映射;  语言模型用SRILM工具做LM 的训练得到 3-gram and 4-gram, 是词与词、词与句子的映射,  字典是字词对应的音素index集合,是字词 和 音素之间的映射

‘’’

haibing注: 所谓声学模型就是把语音的声学特征分类对应到(解码)音素或字词这样的单元  语言模型接着把字词解码成一个完整的句子

‘’‘


先说语言模型: 

语言模型表示某一字序列发生的概率,一般采用链式法则,把一个句子的概率拆解成器中的每个词的概率之积。设W是由w1, w2,...,wn组成的,则P(W)可以拆成(由条件概率公式和乘法公式):

P(W) = P(w1)P(w2/w1)P(w3/w1,w2)...P(wn/w1,w2,..wn-1),  每一项都是在之前所有词的概率条件下,当前词的概率。

由马尔卡夫模型的思想,最常见的做法就是用N-元文法,即假定某一个字的输出只与前面N-1个字出现的概率有关系, 这种语言模型叫做 n-gram模型(一般n取3, 即t rigram),  这时候我们就可以这么表示:

 P(W) = P(w1)P(w2|w1)P(w3|w1,w2)P(w4| w1,w2,w3)...P(wn/wn-1,wn-2,...,w1)   #条件太长的时候,概率就不好估计了,三元文法只取前两个词

         = P(w1)P(w2|w1)P(w3|w1,w2)P(w4| w2,w3)...P(wn/wn-1,wn-2) 

对于其中的每一项条件概率都可以用贝叶斯公式求出, 在所有的语料中统计出相邻的字发生的概率,再统计出单个字出现的概率, 代入即可。 

‘’‘

wang yun ( https://www.zhihu.com/people/maigo )注: 

做一下解释, 这个地方的n-gram是根据字符串序列建立的,所以一个n-gram就相当于词组, 必然会有 一些词组没有出现过,但是也存在发生的概率,所以需要算法生成这些生僻词组的概率。

直观的将: n大了之后主要的问题是许多n-gram在训练数据中没有出现过。如果一个n-gram整体没有出现过,但去掉一个词后得到的(n-1)-gram出现过,那么估计出的概率就是0;如果连这个(n-1)-gram都没有出现过,那么概率就无法估计了。常用的解决的办法就是:smoothing(eg: Good-Turing smoothing)和 fall back to lower-order n-grams(采用更小的n-gram)。 见《数学之美》

’‘’

再说声学模型: 

声学模型的任务是计算P(X/W), 即给定文字之后发出这段语音的概率(最后利用贝叶斯,求P(X/W)是使用)。 首先第一问题: 怎么才能知道每个单词发什么音呢? 这就需要另外一个模块,叫做词典,看eesen的源码在数据准备阶段就是先求出词对应音素的dict, 它的作用就是把单词串转化成音素串,然后再求的语言模型和 训练声学模型(用lstm+ctc 训练声学模型).

有了dict的帮助,声学模型就知道给定的文字串该依次发哪些音了。不过为了计算语音跟音素串的匹配程度,还需要知道每个音素的起止时间。 这是利用动归来进行的,可以高效的找到音素的分界点,使得没一段语音与音素的匹配程度(用概率表示)之积最大。实际使用的算法称为viterbi算法,它不仅仅考虑了每一段语音和音素的匹配程度,还考虑了各个音素之间转换的概率(转换概率通过HMM估计) 实际中使用的比音素更小的单位,原理一样(不是很确定,值得是一帧数据(25ms)吗,一帧不到不到一个音素的长度?)

在求音素分界点的过程中,以及在有了分界点后计算P(X|W)时,声学模型都需要知道怎样计算一个音素与一段语音信号的匹配程度。要做这件事,需要找到一种合适的表示语音信号的方法。一般是把语音信号分成许多帧,对于每一帧,通过傅里叶变换等一系列操作,把它转换成一个特征向量。最常用的特征是MFCC,从训练数据中,我们可以提取出大量的特征向量,以及它们对应的音素;利用这些数据,就可以训练从特征到音素的分类器。前些年最常用的分类器是高斯混合模型(GMM),它的大致原理是估计出每个音素的特征向量的分布,然后在识别阶段,计算每一帧的特征向量x_t由相应音素s_i产生的概率P(x_t|s_i),把每一帧的概率相乘,就得到P(X|W)。现在,神经网络渐渐火了起来,它可以直接给出P(s_i|x_t),用贝叶斯公式可以转换成P(x_t|s_i),再相乘得到P(X|W)

整体思路:
具体来说就是输入一段语音信号,要找到一个文字序列(由字或者词组成),是的它与语音信号的匹配程度最高。这个匹配程度,一般都是用概率来表示的,用X表示语音信号,用W表示文字序列,则要解的是下面这个问题:W^* = \arg \max_W P(W|X)
但是一般语音是由文字产生的,已知文字才能发出语音,所以对于上面的条件概率公式我们想要已知结果求该条件下发生概率,这时候自然而然就想到贝叶斯公式:
W^* = \arg \max_W \frac{P(X|W) P(W)}{P(X)} = \arg \max_W P(X|W) P(W) 由于我们要优化W, P(X) 可以看作常数,可以省略分母。

由上边的步骤来看,求文字串、计算语言模型概率、求音素串、求音素分界点、计算声学模型概率几个步骤似乎是依次进行的。其实不然,在实际编码过程中,因为文字串、音素分界点都有非常多种可能,枚举是不现实的。实际中,这几个步骤同时进行并互相制约,随时砍掉不够优的可能,最终在可接受的时间内求出最优解: 
W* = argmaxP(W|X)



2019-10-19 11:33:50 hnzwx888 阅读数 37
  • 云从科技:详解CNN-pFSMN模型以及在语音识别中的应用

    近日,云从科技在语音识别技术上取得重大突破,在全球最大的开源语音识别数据集Librispeech上刷新了世界纪录,错词率(Worderrorrate,WER)降到了2.97%,将Librispeech的WER指标提升了25%,大幅刷新原先记录。本视频课程讲解了:大规模词汇连续语音识别,LVCSR前沿与最新进展,和CNN-pFSMN声学模型。

    1134 人正在学习 去看看 CSDN讲师

本文搭建一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉字。

该系统实现了基于深度框架的语音识别中的声学模型和语言模型建模,其中声学模型包括CNN-CTC、GRU-CTC、CNN-RNN-CTC,语言模型包含transformer、CBHG。
数据集采用了目前能找到的所有中文免费数据,包括:thchs-30、aishell、primewords、st-cmd四个数据集,训练集总计大约450个小时。

项目地址:https://github.com/audier/DeepSpeechRecognition

为了方便同学们自己做实验,写了实践版的tutorial:

  • 声学模型:https://blog.csdn.net/chinatelecom08/article/details/85013535
  • 基于transformer的语言模型:https://blog.csdn.net/chinatelecom08/article/details/85051817
  • 基于CBHG的语言模型:https://blog.csdn.net/chinatelecom08/article/details/85048019

文章目录

1. 声学模型
GRU-CTC
DFCNN
DFSMN
2. 语言模型
n-gram
CBHG
transformer
3. 数据集
4. 配置


1. 声学模型

声学模型目前开源了部分示例模型,后期将不定期更新一些模型。

GRU-CTC

我们使用 GRU-CTC的结构搭建了第一个声学模型,该模型在项目的gru_ctc.py文件中。
利用循环神经网络可以利用语音上下文相关的信息,得到更加准确地信息,而GUR又能选择性的保留需要的长时信息,使用双向rnn又能够充分的利用上下文信号。
但该方法缺点是一句话说完之后才能进行识别,且训练相对cnn较慢。该模型使用python/keras进行搭建,本文系统都使用python搭建。

网络结构如下:
   

def _model_init(self):
        self.inputs = Input(name='the_inputs', shape=(None, 200, 1))
        x = Reshape((-1, 200))(self.inputs)
        x = dense(512, x)
        x = dense(512, x)
        x = bi_gru(512, x)
        x = bi_gru(512, x)
        x = bi_gru(512, x)
        x = dense(512, x)
        self.outputs = dense(self.vocab_size, x, activation='softmax')
        self.model = Model(inputs=self.inputs, outputs=self.outputs)
        self.model.summary()

DFCNN

由于两个原因在使用GRU作为语音识别的时候我们会遇到问题。

  • 一方面是我们常常使用双向循环神经网络才能取得更好的识别效果,这样会影响解码实时性。
  • 另一方面随着网络结构复杂性增加,双向GRU的参数是相同节点数全连接层的6倍,这样会导致训练速度非常缓慢。

科大讯飞提出了一种使用深度卷积神经网络来对时频图进行识别的方法,就是DFCNN。
论文地址:http://xueshu.baidu.com/usercenter/paper/show?paperid=be5348048dd263aced0f2bdc75a535e8&site=xueshu_se

利用CNN参数共享机制,可以将参数数量下降几个数量级别,且深层次的卷积和池化层能够充分考虑语音信号的上下文信息,且可以在较短的时间内就可以得到识别结果,具有较好的实时性。
该模型在cnn_ctc.py中,实验中是所有网络结果最好的模型,目前能够取得较好的泛化能力。其网络结构如下:

DFCNN

def cnn_cell(size, x, pool=True):
    x = norm(conv2d(size)(x))
    x = norm(conv2d(size)(x))
    if pool:
        x = maxpool(x)
    return x

class Am():
    def _model_init(self):
        self.inputs = Input(name='the_inputs', shape=(None, 200, 1))
        self.h1 = cnn_cell(32, self.inputs)
        self.h2 = cnn_cell(64, self.h1)
        self.h3 = cnn_cell(128, self.h2)
        self.h4 = cnn_cell(128, self.h3, pool=False)
        self.h5 = cnn_cell(128, self.h4, pool=False)
        # 200 / 8 * 128 = 3200
        self.h6 = Reshape((-1, 3200))(self.h5)
        self.h7 = dense(256)(self.h6)
        self.outputs = dense(self.vocab_size, activation='softmax')(self.h7)
        self.model = Model(inputs=self.inputs, outputs=self.outputs)
        self.model.summary()

DFSMN

而前馈记忆神经网络也也解决了双向GRU的参数过多和实时性较差的缺点,它利用一个记忆模块,包含了上下几帧信息,能够得到不输于双向GRU-CTC的识别结果,阿里最新的开源系统就是基于DFSMN的声学模型,只不过在kaldi的框架上实现的。我们将考虑使用DFSMN+CTC的结构在python上实现。该网络实质上是用一个特殊的CNN就可以取得相同的效果,我们将CNN的宽设置为memory size,将高度设置为feature dim,将channel设置为hidden units,这样一个cnn的层就可以模仿fsmn的实现了。
结构如下:

DFSMN


2. 语言模型

n-gram

n元语法是一个非常经典的语言模型,这里不过多介绍啦。
如果想要通过语料来训练一个n-gram的模型,可以参考我的小实验的实现方法。

CBHG

该想法来自于一个大神搞输入法的项目,下面部分也引用此处:搜喵出入法
他是利用该模型建立一个按键到汉字的作用,本文对其结构和数据处理部分稍作改动,作为语言模型。

拼音输入的本质上就是一个序列到序列的模型:输入拼音序列,输出汉字序列。所以天然适合用在诸如机器翻译的seq2seq模型上。

模型初始输入是一个随机采样的拼音字母的character embedding,经过一个CBHG的模型,输出是五千个汉字对应的label。
这里使用的CBHG模块是state-of-art的seq2seq模型,用在Google的机器翻译和语音合成中,该模型放在cbhg.py中,结构如下:
图片来自 Tacotron: Towards End-to-End Speech Synthesis

CBHG
该模型训练实验结果如下,实际上,后续和transformer的比较中,该模型无论是收敛速度还是识别效果上都是很难和transformer比较。

请输入测试拼音:ta1 mei2 you3 duo1 shao3 hao2 yan2 zhuang4 yu3 dan4 ta1 que4 ba3 ai4 qin1 ren2 ai4 jia1 ting2 ai4 zu3 guo2 ai4 jun1 dui4 wan2 mei3 de tong3 yi1 le qi3 lai2
她没有多少豪言壮语但她却把爱亲人爱家庭爱祖国爱军队完美地统一了起来

请输入测试拼音:chu2 cai2 zheng4 bo1 gei3 liang3 qian1 san1 bai3 wan4 yuan2 jiao4 yu4 zi1 jin1 wai4 hai2 bo1 chu1 zhuan1 kuan3 si4 qian1 wu3 bai3 qi1 shi2 wan4 yuan2 xin1 jian4 zhong1 xiao3 xue2
除财政拨给两千三百万元教太资金外还拨出专款四千五百七十万元新建中小学

请输入测试拼音:ke3 shi4 chang2 chang2 you3 ren2 gao4 su4 yao2 xian1 sheng1 shuo1 kan4 jian4 er4 xiao3 jie3 zai4 ka1 fei1 guan3 li3 he2 wang2 jun4 ye4 wo4 zhe shou3 yi1 zuo4 zuo4 shang4 ji3 ge4 zhong1 tou2
可是常常有人告诉姚先生说看见二小姐在咖啡馆里和王俊业握着族一坐坐上几个钟头

transformer

新增基于transformer结构的语言模型transformer.py,该模型已经被证明有强于其他框架的语言表达能力。

  • 论文地址:https://arxiv.org/abs/1706.03762。
  • tutorial:https://blog.csdn.net/chinatelecom08/article/details/85051817

建议使用transformer作为语言模型,该模型是自然语言处理这两年最火的模型,今年的bert就是使用的该结构。本文最近更新系统使用的语言模型就是transformer。

 the  0 th example.
文本结果: lv4 shi4 yang2 chun1 yan1 jing3 da4 kuai4 wen2 zhang1 de di3 se4 si4 yue4 de lin2 luan2 geng4 shi4 lv4 de2 xian1 huo2 xiu4 mei4 shi1 yi4 ang4 ran2
原文结果: lv4 shi4 yang2 chun1 yan1 jing3 da4 kuai4 wen2 zhang1 de di3 se4 si4 yue4 de lin2 luan2 geng4 shi4 lv4 de2 xian1 huo2 xiu4 mei4 shi1 yi4 ang4 ran2
原文汉字: 绿是阳春烟景大块文章的底色四月的林峦更是绿得鲜活秀媚诗意盎然
识别结果: 绿是阳春烟景大块文章的底色四月的林峦更是绿得鲜活秀媚诗意盎然

 the  1 th example.
文本结果: ta1 jin3 ping2 yao1 bu4 de li4 liang4 zai4 yong3 dao4 shang4 xia4 fan1 teng2 yong3 dong4 she2 xing2 zhuang4 ru2 hai3 tun2 yi4 zhi2 yi3 yi1 tou2 de you1 shi4 ling3 xian1
原文结果: ta1 jin3 ping2 yao1 bu4 de li4 liang4 zai4 yong3 dao4 shang4 xia4 fan1 teng2 yong3 dong4 she2 xing2 zhuang4 ru2 hai3 tun2 yi4 zhi2 yi3 yi1 tou2 de you1 shi4 ling3 xian1
原文汉字: 他仅凭腰部的力量在泳道上下翻腾蛹动蛇行状如海豚一直以一头的优势领先
识别结果: 他仅凭腰部的力量在泳道上下翻腾蛹动蛇行状如海豚一直以一头的优势领先

 the  2 th example.
文本结果: pao4 yan3 da3 hao3 le zha4 yao4 zen3 me zhuang1 yue4 zheng4 cai2 yao3 le yao3 ya2 shu1 di4 tuo1 qu4 yi1 fu2 guang1 bang3 zi chong1 jin4 le shui3 cuan4 dong4
原文结果: pao4 yan3 da3 hao3 le zha4 yao4 zen3 me zhuang1 yue4 zheng4 cai2 yao3 le yao3 ya2 shu1 di4 tuo1 qu4 yi1 fu2 guang1 bang3 zi chong1 jin4 le shui3 cuan4 dong4
原文汉字: 炮眼打好了炸药怎么装岳正才咬了咬牙倏地脱去衣服光膀子冲进了水窜洞
识别结果: 炮眼打好了炸药怎么装岳正才咬了咬牙倏地脱去衣服光膀子冲进了水窜洞


3. 数据集

数据集采用了目前我能找到的所有中文免费数据,包括:thchs-30、aishell、primewords、st-cmd四个数据集,训练集总计大约450个小时,在之前实验过程中,使用thchs-30+aishell+st-cmd数据集对DFCNN声学模型进行训练,以64batch_size训练。
包括stc、primewords、Aishell、thchs30四个数据集,共计约430小时, 相关链接:http://www.openslr.org/resources.php

Name    train    dev    test
aishell    120098    14326    7176
primewords    40783    5046    5073
thchs-30    10000    893    2495
st-cmd    10000    600    2000
数据标签整理在data路径下,其中primewords、st-cmd目前未区分训练集测试集。

若需要使用所有数据集,只需解压到统一路径下,然后设置utils.py中datapath的路径即可。

4. 配置

本项目现已训练一个迷你的语音识别系统,将项目下载到本地上,下载thchs数据集并解压至data,运行test.py,不出意外能够进行识别,结果如下:

 the  0 th example.
文本结果: lv4 shi4 yang2 chun1 yan1 jing3 da4 kuai4 wen2 zhang1 de di3 se4 si4 yue4 de lin2 luan2 geng4 shi4 lv4 de2 xian1 huo2 xiu4 mei4 shi1 yi4 ang4 ran2
原文结果: lv4 shi4 yang2 chun1 yan1 jing3 da4 kuai4 wen2 zhang1 de di3 se4 si4 yue4 de lin2 luan2 geng4 shi4 lv4 de2 xian1 huo2 xiu4 mei4 shi1 yi4 ang4 ran2
原文汉字: 绿是阳春烟景大块文章的底色四月的林峦更是绿得鲜活秀媚诗意盎然
识别结果: 绿是阳春烟景大块文章的底色四月的林峦更是绿得鲜活秀媚诗意盎然

若自己建立模型则需要删除现有模型,重新配置参数训练。

与数据相关参数在utils.py中:

data_type: train, test, dev
data_path: 对应解压数据的路径
thchs30, aishell, prime, stcmd: 是否使用该数据集
batch_size: batch_size
data_length: 我自己做实验时写小一些看效果用的,正常使用设为None即可
shuffle:正常训练设为True,是否打乱训练顺序
def data_hparams():
    params = tf.contrib.training.HParams(
        # vocab
        data_type = 'train',
        data_path = 'data/',
        thchs30 = True,
        aishell = True,
        prime = False,
        stcmd = False,
        batch_size = 1,
        data_length = None,
        shuffle = False)
      return params

使用train.py文件进行模型的训练。

声学模型可选cnn-ctc、gru-ctc,只需修改导入路径即可:

from model_speech.cnn_ctc import Am, am_hparams

from model_speech.gru_ctc import Am, am_hparams

语言模型可选transformer和cbhg:

from model_language.transformer import Lm, lm_hparams

from model_language.cbhg import Lm, lm_hparams
————————————————
版权声明:本文为CSDN博主「Audior」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chinatelecom08/article/details/82557715

没有更多推荐了,返回首页