2019-03-13 16:31:16 weiqiwu1986 阅读数 4277

噪声问题一直是语音识别的一个老大难的问题,在理想的实验室的环境下,识别效果已经非常好了,之前听很多音频算法工程师抱怨,在给识别做降噪时,经常发现WER不降反升,降低了识别率,有点莫名其妙,又无处下手。

  刚好,前段时间调到了AIlab部门,有机会接触这块,改善语音识别的噪声问题,虽然在此之前,询问过同行业的朋友,单通道近场下,基本没有太大作用,有时反而起到反作用,但是自己还是想亲身实践一下,至少找到这些方法失效的原因,看看是否在这些失败的原因里面,改进下思路,可能有新的发现;同时去Ailab,顺带把深度学习降噪实践一把,就算在ASR没有效果,以后还能用在语音通信这个领域。

  任务的要求是保证声学模型不变动的情况下,即不重新训练声学模型,即单纯利用降噪来改善那些环境恶劣的样本,同时保证不干扰纯净语音或者弱噪声的语音场景,所以非常具有挑战性。

  为了赶项目,用自己非常熟悉的各种传统的降噪方法:包括最小值跟踪噪声估计,MCRA, IMCRA,等各种噪声估计方法,以及开源项目 webrtc NS, AFE(ETSI ES 202 050 Advanced DSR Front-end Codec, two stages of Wiener filtering),剩下的任务就是调参,经过很多次努力,基本没有什么效果,相反WER还会有1%点左右的增加。

分析对比了降噪和没有降噪的识别文本对比和频谱分析,总结了以下这些原因,希望对后面的人有些参考意义:

  1.DNN本身就有很强的抗噪性,在弱噪声和纯净语音下,基本都不是问题。

通常场景下,这点噪声,用线上数据或者刻意加噪训练,是完全可以吸收掉的,只有在20db以下,含噪样本的频谱特征和纯净样本的频谱特征差异太大,用模型学习收敛就不太好,这时需要降噪前端。

  2.降噪对于纯净语音或者弱噪声环境下,不可避免的对语音有所损伤,只有在恶劣的环境下,会起到非常明显的作用。

传统降噪是基于统计意义上面的一个处理,难以做到瞬时噪声的精准估计,这个本身就是一个近似的,粗略模糊化的一个处理,即不可避免的对噪声欠估计或者过估计,本身难把握,保真语音,只去噪,如果噪声水平很弱,这个降噪也没有什么用或者说没有明显作用,去噪力度大了,又会破坏语音。可以预见,根据测试集进行调参,就像是在绳子上面玩杂技。

我们的测试样本集,90%的样本都在在20db以上,只有200来条的样子,环境比较恶劣。所以通常起来反作用。

  3.降噪里面的很多平滑处理,是有利于改善听感的,但是频谱也变得模糊,这些特征是否能落到正确的类别空间里面,也是存在疑问的。所以在前端降噪的基础上,再过一遍声学模型重新训练,应该是有所作用的,但是训练一个声学模型都要10来天,损失太大,也不满足任务要求。

  4. 传统降噪,通常噪声初始化会利用初始的前几帧,而如果开头是语音,那就会失真很明显。

  5.估计出噪声水平,在SNR低的情况下降噪,SNR高时,不处理或者进行弱处理,在中间水平,进行软处理,这个思路似乎可以行的通。

  6.用基于声学特征的传统降噪方法,尝试过,在测试集里面,有不到1%的WER降低。

  7.到底用什么量来指导降噪过程?既然降噪没法做好很好的跟踪,处理的很理想。即不可能处理的很干净,同时不能保证语音分量不会被损伤,即降噪和保证语音分量是个相互矛盾,同时也是一个权衡问题。那其实换个角度,降噪主要是改善了声学特征,让原来受噪声影响错分类的音素落到正确的音素类别,即降低CE。那么应该直接将降噪和CE做个关联,用CE指导降噪过程参数的自适应变化,在一个有代表性的数据集里面,有统计意义上的效果,可能不一定能改善听感,处理的很干净,但是在整体意义上,有能改善识别的。所以说语音去噪模块必须要和声学前端联合起来优化,目标是将去噪后的数据投影到声学模块接受的数据空间,而不是改善听感,即优化的目标是降低声学模型的CE,或者说是降低整条链路的wer,所以用降噪网络的LOSS除了本身的损失量,还应绑定CE的LOSS自适应去训练学习是比较合理的方案。也可以将降噪网络看成和声学模型是一个大网络,为CE服务,当然,这不一定是降噪网络,也可以是传统的自适应降噪方法,但是如果是基于kaldi开发,里面涉及到的工程量是很大的。

  8.在整个语音识别体系中,由于声学模型的强抗噪性,所以单通道下的前端降噪似乎没有什么意义,1%左右的wer的改变,基本不影响整个大局,所以想要搞识别这块的朋友,应该先把重要的声学模型,语言模型,解码器,搞完之后,再来撸撸这块,因为即便没有单独的前端,整个识别大多数场景都是OK的,恶劣的场景比较少,一般场景大不了扩增各种带噪数据训练,大不了扩增各种带噪数据,也是可以的。

我们的线上数据,影响识别的因素排序是口语化,方言,短词,其次才是噪声,另外,少量混响,语速,音量,也是影响因素之一,以上是自己的一点片面之言,希望对大家有参考意义,少走弯路。

 

2018-08-07 10:28:53 audio_algorithm 阅读数 1365

一、语音识别简介

    语音识别的一般框架一般包含几个部分:声学模型、语音模型、以及词典。语音信号(波形)经过前级处理(包括降噪,语音增强,人声检测等)后,提取特征,送入解码模块,进行解析得到识别结果。而解码模块则由 声学模型、语言模型映射、链接组成的网络。目前主流的语音模型一般采用 n-gram 语言模型,声学模型采样隐马尔科夫模型(HMM),这些模型都需要经过预先训练得到。

    上图框架中,发音字典是指系统所能处理的单词的集合,并标明了其发音。通过发音字典得到声学模型的建模单元和语言模型建模单元间的映射关系,从而把声学模型和语言模型连接起来,组成一个搜索的状态空间用于解码器进行解码工作。

二、语音识别开源项目

                                           

    CMU Sphinix,显而易见,从它的名字就能看出来是卡内基梅隆大学的产物。它已经以某些形式存在了 20 年了,现在它在 Github(C (https://github.com/cmusphinx/pocketsphinx) 版本和 Java (https://github.com/cmusphinx/sphinx4) 版本)和 SourceForge (https://sourceforge.net/projects/cmusphinx/) 上都开源了,而且两个平台上都有活动。Github 上的 Java 版本和 C 版本都只有一个贡献者,但是这并不影响此项目的历史真实性(在 SourceForge repo 上有 9 个管理人员还有很多开发者)

    Kaldi 从 2009 年的研讨会起就有它的学术根基了,现在已经在 GitHub (https://github.com/kaldi-asr/kaldi) 上开源,有 121 名贡献者。HTK 始于 1989 年的剑桥大学,已经商用一段时间了,但是现在它的版权又回到了剑桥大学并且已经不是开源软件了。它的版本更新于 2015 年 12 月,先前发布于 2009 年。Julius (http://julius.osdn.jp/en_index.php) 起源于 1997 年,最后一个主要版本发布于 2016 年 9 月,有些活跃的 Github repo 包含三个贡献者,现在已经不大可能反应真实情况了。ISIP 是第一个型的开源语音识别系统,源于密西西比州立大学。它主要发展于 1996 到 1999 年间,最后版本发布于 2011 年,但是这个项目在 Github 出现前就已经不复存在了。

三、PocketSphinx编译运行

3.1.准备

操作系统:windows 7 64Bit SP1

编译器:Viual Studio 2013

pocketsphinx版本:5prealpha

在Sphinx官网下有如下几个下载目录:

  • Pocketsphinx — lightweight recognizer library written in C  (C语言开发的轻量级语音识别引擎)
  • Sphinxtrain — acoustic model training tools (声学模型训练工具)
  • Sphinxbase — support library required by Pocketsphinx and Sphinxtrain (Pocketsphinx和Sphinxtrain的基础类库 )
  • Sphinx4 — adjustable, modifiable recognizer written in Java (Java语言开发的可调节、可修改的语音识别引擎)

这里我们下载Pocketsphinx和Sphinxbase,下载地址:

   https://sourceforge.net/projects/cmusphinx/files/sphinxbase/5prealpha/

   https://sourceforge.net/projects/cmusphinx/files/pocketsphinx/5prealpha/

3.2.编译

1)pocketsphinx依赖于sphinxbase,因此需要先编译sphinxbase。

使用VS2013打开sphinxbase.sln,直接点击生成解决方案即可

 

输出结果

 

2)使用VS2013打开pocketsphinx.sln,直接点击生成解决方案,结果报错了。。。

 

将sphinxbase的头文件目录以及.lib文件目录加入工程中,看错误估计是路径不对,继续编译就通过了。

至此,pocketsphinx的编译工作结束了

 

3.3.运行

将sphinxbase.dll复制到pocketsphinx运行目录下,不然会报缺少DLL的错误。

 

如果有麦克风可以运行一下命令:

pocketsphinx_continuous.exe -inmic yes -hmm model\en-us\en-us -lm model\en-us\en-us.lm.bin -dict model\en-us\cmudict-en-us.dict

 

也可以用文件来运行:

pocketsphinx_continuous.exe -infile C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\test\data\speech61-70968-0017.wav  -backtrace yes -hmm C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\model\en-us\en-us -lm C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\model\en-us\en-us.lm.bin -dict C:\Users\Administrator\Desktop\pocketsphinx-5prealpha-win32\pocketsphinx\model\en-us\cmudict-en-us.dict

运行结果:

截图中倒数第7行,即为识别结果,输入音频文件的原句如下:

   I COULD NOT SEE MY BOY INJURED EXCELLENCE FOR BUT DOING HIS DUTY AS ONE OF CUMBERLAND'S SONS

四 、模型的获取

1、在线生成语言模型和词典的工具 http://www.speech.cs.cmu.edu/tools/lmtool-new.html 

2、已经训练好的模型下载地址:https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/

  其中Mandarin为中文普通话,下载下来之后我们可以看到
  声学模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
  语言模型:zh_broadcastnews_64000_utf8.DMP
  拼音字典:zh_broadcastnews_utf8.dic


zh_broadcastnews_ptm256_8000目录结构
├── feat.params   //HMM模型的特征参数
├── mdef   //模型定义文件(为每个即将进行训练的HMM的每一状态定义一个独特的数字标识)
├── means  //混合高斯模型的均值
├── mixture_weights   //混合权重
├── noisedict    //噪声也就是非语音字典
├── sendump  //用来从声学模型中获取mixture_weights文件的?
├── transition_matrices  //HMM模型的状态转移矩阵
└── variances  //混合高斯模型的方差

其他的中文声学模型还有tdt_sc_8k,该模型可以在pocketsphinx-0.8-win32中找到。

2019-05-10 15:15:36 weixin_40870272 阅读数 221

“民以食为天”,厨房作为家居生活的一部分,承载了人们的一日三餐,因为也被称为“住宅的心脏”。据研究报告显示,厨电行业已连续4年成为家电中增长最迅速的品类之一,市场增速明显高于传统大家电行业。
而作为解决厨房油烟的利器,油烟机已成为现代家庭厨房的必备品。在消费升级的驱动之下,油烟机也正在朝着智能化方向发展,比如语音交互、远程控制、自动感应等。
对于语音交互,大家都知道,油烟机属于强噪声设备,包括当前流行的大吸力油烟机,运行时本体产生的风机噪声就可高达70dB以上,还不包括人声、炒菜声等,由此带来的复杂强噪声环境对语音识别功能提出了更高的要求:必须在有其他强噪声干扰的环境下,实现对用户指令的精准识别。

下图是搭载启英泰伦CI1006语音芯片的语音模块在油烟机上的应用:

在油烟机语音识别方案设计中,只需将启英泰伦的语音识别模块与油烟机主控模块通过串口进行通信,再外加麦克风和扬声器,即可实现语音识别功能。工作流程是:人发出语音指令,通过麦克风将语音输入,语音识别模块进行识别,串口发送语音指令到油烟机主机控制器,控制器根据收到的信息开启不同的工作模式并反馈给语音识别模块进行相应语音播报。整个系统实现非常轻巧便捷。
油烟机语音模块和语音方案框图

下图是在油烟机真实噪声环境下做的测试,截取的测试过程中部分音频降噪前后的波形及语谱图。从图中可以看出,通过特有的强降噪抑制算法能有效抑制油烟机的大吸力噪声,在保证语音失真度的同时具有良好的噪声抑制效果。
油烟机大吸力噪声环境下降噪前后的波形及语谱图

消费升级促进传统产业智能化升级,通过智能语音设备为产品赋能,继迎合了人工智能发展大趋势,又提高了产品竞争力和增值空间。总体来说,基于CI1006芯片的油烟机强降噪语音识别方案会带给用户一个高性价比、高体验感的选择。

2019-06-02 20:05:59 Magical_Bubble 阅读数 663

在上一篇博客基于GMMs-HMMs的语音识别原理中,介绍了第一代较为成熟的GMMs-HMMs语音识别模型。但随着神经网络技术的发展,后面又出现了基于DNN-HMMs的语音识别模型,一句话概括就是用DNN代替之前的GMMs,有更好的建模能力。这篇博客将详细介绍它的原理。

PS:假设读者已经有了GMMs-HMMs模型的基础(没有的话,请移步笔者的上一篇博客),这里只详细介绍两个模型之间不同的部分,以及其对比。并且,博客中对于DNN的部分只涉及到模型的介绍,至于其训练要用到的梯度下降、反向传播等算法,这里将不会涉及细节,毕竟处在深度学习时代,这些东西早应烂熟于心。

一. DNN-HMMs原理

1.1 整体思路

重温一下语音识别模型希望最大化的概率:P(SX)=P(XS)P(S)P(S|X) = P(X|S)P(S)XX 是输入的语音特征,SS 是识别出的句子,P(S)P(S) 是语言模型,P(XS)P(X|S) 则是GMMs-HMMs和DNN-HMMs要进行建模的部分。

之前GMMs-HMMs对于 P(XS)P(X|S) 的建模可以展开成类似为:

P(XS)=P(x1s1)P(s1s1)P(x2s1)P(s2s1)P(x3s2)P(s3s2)P(x4s3)....P(X|S) = P(x1|s1) P(s1|s1) P(x2|s1) P(s2|s1) P(x3|s2) P(s3|s2) P(x4|s3)....

其中的 ss 为HMM状态,xx 为输入的帧,P(sjsi)P(s_j|s_i)是HMM的转移概率,P(xs)P(x|s)则是GMM要建模的输出概率。

区别来了! 在DNN-HMMs模型中,P(xs)P(x|s)是用DNN来建模。

DNN模型在这里并不是去直接构建P(xs)P(x|s)这样一个生成模型,而是将其转化为:

P(xs)=P(sx)P(s)P(x)P(sx)P(s)P(x|s) = \frac{P(s|x)}{P(s)} P(x) \approx \frac{P(s|x)}{P(s)}

这里的P(x)P(x)xx 固定时,对最终的建模没有影响,因此可以将其舍去;P(s)P(s)为状态 ss 的先验概率,可以通过统计得出。

这样就将DNN的建模,从生成模型P(xs)P(x|s)转化为判别模型P(sx)P(s|x)

对判别模型P(sx)P(s|x)的建模,白话解释就是,输入的某个帧 xx 属于状态 ss 的概率。如果将输入帧看成一幅图片,状态看成类别,那可不就是分类模型?再加上用DNN建模,那就是一个典型的基于深度学习的分类模型,建模每个输入帧属于各个状态的概率。

这里有一个问题就是,DNN的训练需要 labellabel,即要提前标注好每个输入帧是属于哪个状态的。这个 labellabel 要怎么获取?比较常用的办法是先用 (X,S)(X, S) 训练一个GMMs-HMMs的语音识别模型 P(XS)P(X|S),然后进行维特比译码,得到能使当前句子生成概率最大的状态序列argmaxstate sequenceP(XS)argmax_{state\ sequence} P(X|S) 作为当前 XX 的逐帧状态标注。

举个例子,比如训练好的GMMs-HMMs模型一共有 NN 个HMM状态,那么对于输入的每一帧,其状态labellabel就是对应 NN 个状态中的一个,DNN对于每帧的输出也就希望是 NN 个(NN 分类)。

总结一下,一句话概括基于DNN-HMMs的语音识别模型的整体思路为:

用DNN学习出分类模型P(sx)P(s|x),而后通过P(sx)P(s)\frac{P(s|x)}{P(s)}转为HMMs需要的输出概率分布(替换掉GMMs),结合HMMs构建出完整的语音识别模型。

1.2 训练和识别流程

这里先给出DNN-HMMs模型的整体训练和识别流程,结合前面的整体思路,便于读者从宏观上把握整个模型的精髓。

PS:笔者一开始学习的时候,看到的教程基本上都是上来就讲各种DNN模型,看完了过后也不知道到底输入是啥,输出是啥,用来干什么的?这里就以“结果导向”,先把整个流程呈现出来,然后再详细介绍里面的细节。

DNN-HMMs模型的整体训练和识别流程可以概括为:

  1. 用所有的训练数据(X,S)(X, S),训练GMMs-HMMs模型,并根据维特比译码算法为每个 XX 标注其对应的最优状态序列state sequence=argmaxstate sequenceP(XS)state\ sequence = argmax_{state\ sequence} P(X|S),每一帧对应一个状态标注,设为(x,state)(x, state)
  2. 用上一步中标注好的(x,state)(x, state),训练DNN模型,输入为“当前帧”(可以包含其左右的上下文),输出为HMM中 NN 个状态的分数,并用交叉熵损失进行优化,这里还有一些tricks可以用,比如SDT、SAT等。
  3. 根据上一步训练出的DNN,重新估计HMM的转移概率参数,而后再重新进行状态标注,再训练DNN,…,如此往复,直到收敛
  4. 训练好DNN和HMMs之后,识别流程就与GMMs-HMMs一样了。

二. DNN模型详细介绍

前面已经从宏观上把握了DNN-HMMs模型是怎么运作的,那么这里就着重讲一些主流的DNN模型,包括FFDNN、CDDNN、TDNN、RNN等,以及一些训练中可以使用的trick等。

2.1 常用的DNN模型

再唠叨一遍DNN模型的输入和输出是啥,防止前面说的不清楚。DNN模型的输入是音频帧特征 XRTDX \in \R^{T * D},其中 TT 是序列(帧)长度,DD 是输入特征维度;输出是每一帧在HMM的 NN 个状态上的分数 YRTNY \in \R^{T * N};标签是每一帧对应的状态 labelRTlabel \in \R^{T}。可以看成是一个序列标注的任务。

2.1.1 FFDNN

FFDNN(Feed-Forward DNN)是一个最简单的前馈DNN模型,它的结构图长下面这个样子:

这是对于某一“帧”(含上下文)建模的例子,输入是除了当前帧 tt 之外,还包括 t4t+4t-4 \to t+4帧的信息,将它们concat在一起作为当前帧的表示(这也是DNN为啥比GMM好的原因之一,可以同时考虑输入的上下文信息!),送入DNN网络,中间经过一系列的全连接层,顶层的输出为当前帧所属的183个HMM状态的分数。

对于每一个含有上下文信息的帧,都是使用同一个DNN来建模。那实际上整合一下,可以发现,整个FFDNN实际上相当于在第一层是一个kernel=9, stride=1的1D卷积,后面是一系列的全连接层,输出层的维度为183维,需要取Softmax,而后与标注的one-hot向量进行交叉熵计算。

2.1.2 CDDNN

CDDNN(Context-Dependent DNN)可以说是对FFDNN的一个延伸,它在输出层,映射到的是Context-Dependent的音素状态,比如用三音素进行HMM建模的各状态,示意图如下:

它与FFDNN的网络结构是一样的,只是在最顶层的维度变为了上下文音素(比如三音素)的HMM状态。

2.1.3 TDNN

TDNN(Time-Delay NN)其实是卷积网络CNN的前身(但很有意思的是,CNN大火了这么久,笔者在接触语音的时候,才听说了TDNN的存在,真是造化弄人~),它的模型结构为:

就是CNN的操作,感受野会随着层数的加深而变大。但如果是这种密集卷积的话,其弊端就是参数多,而且计算也慢!所以可以用降采样或者空洞卷积来进行改进,比如下面的这个降采样的TDNN:

它与前面未进行降采样的TDNN最大的不同,在于中间计算的时候没有同时对连续的一段进行计算,而是只挑了头尾两个状态进行计算。比如密集卷积的标识为[2,2][-2, 2],则代表对 t2t+2t-2 \to t+2 的5个帧进行卷积,而降采样的卷积标识为{2,2}\{-2, 2\},表示仅对 t2t-2t+2t+2 这2个帧进行卷积。可以发现参数量和计算量都下来了。

2.1.4 RNN

这类模型就不用多说了吧。。LSTM、GRU之类的,简直如雷贯耳。不懂LSTM的读者可以移步http://colah.github.io/posts/2015-08-Understanding-LSTMs。总之是一种很好的对序列建模的方式,还可以用双向的。为了保持完整性,放一张RNN的整体示意图吧:

2.2 训练的Tricks

在对于DNN的训练过程中,有一些tricks很好用。比如预训练初始化、SDT(Sequence Discriminative Training,序列判别性训练)、SAT(Speaker Adaption Training,说话人适应性训练)等。下面简单介绍一下:

2.2.1 预训练初始化

这个方法感觉比较老了,至少笔者对于网络的初始化从来没用过这个方式。它是用一层一层训练DBN(Deep Belief Network,深度信念网络)的方式(一种生成模型),来得到一个较为合理的参数初始化。具体的细节,笔者也没有过于细究,还请见谅,若有推荐的相关教程相关,欢迎回复~

2.2.2 SDT

这个其实不仅仅可以用于DNN的训练中,也同样能用到GMMs-HMMs模型的训练中。

回顾一下,之前在训练模型的时候,不管是GMMs-HMMs,还是DNN-HMMs,都是希望能最大化似然概率:(MLE,最大似然估计)

FMLE=u=1UlogPλ(XuWu)F_{MLE} = \sum_{u=1}^U log P_\lambda (X_u | W_u)

其实最原始的一种方式是希望能最大化条件似然概率:(MMIE,最大互信息估计)

FMMIE=u=1UlogPλ(WuXu)=u=1UlogPλ(XuWu)P(Wu)wPλ(Xuw)P(w)F_{MMIE} = \sum_{u=1}^U log P_\lambda (W_u | X_u) = \sum_{u=1}^U log \frac{P_\lambda (X_u | W_u) P(W_u)}{\sum_{w'} P_\lambda (X_u | w') P(w')}

其中分子部分是当前句子生成当前音频的概率,分母部分是所有可能的句子生成当前音频的概率,那么最大化 FMMIEF_{MMIE} 就是希望能最大化分子,最小化分母,即希望不仅能使真正的groudtruth的句子,生成当前音频的概率更大,也同时希望使那些非groudtruth的句子生成当前音频的概率更小。这就叫判别性训练,分类就是一种判别性训练,它希望真正的类别概率更大,其他类别概率更小。

实际上对于分母的估计非常困难,因为可能的句子空间实在是太庞大了,这里实际上就要用到近似,用训练好的模型先生成lattice(词图,包含所有最可能被当前模型识别出来的句子们),然后在这个有限集合上面计算,比如下面这种:

PS:有一种方式不需要先生成词图,叫LF-MMI(Lattice-Free MMI),它是对这种方式的改进,计算更简单。笔者没细究细节,感兴趣的读者可以去搜论文"Purely sequence-trained models for ASR based on lattice-free MMI",或移至文末的传送门~

还有一种更为直接的序列训练方式,是希望能直接对最关心的评估指标进行优化,比如PER(Phone Error Rate),这时希望优化的是:(MPE,最小音素错误)

FMPE=u=1UlogWPλ(Xu,W)P(W)A(W,Wu)WPλ(XuW)P(W)F_{MPE} = \sum_{u=1}^U log \frac{\sum_W P_\lambda (X_u, W) P(W) A(W, W_u)}{\sum_{W'} P_\lambda (X_u | W') P(W')}

其中的 A(W,Wu)A(W, W_u) 表示任意一个句子 WW 与真实句子 WuW_u 之间音素的正确率(1 - PER,用编辑距离计算),这个公式是用A(W,Wu)A(W, W_u)对之前的FMMIEF_{MMIE}做一个加权平均,直接在PER上进行优化,希望能找到具有最小PER的句子。

后面介绍的两种FMMIEF_{MMIE}FMPEF_{MPE}都是SDT的一种方式,当然也可以根据别的需求设计类似的方式,这些训练都要在交叉熵训练之后进行训练,感觉像是finetune。

2.2.3 SAT

SAT是说话人适应性训练,同样不仅局限于DNN模型的训练中。

在识别过程中,不同的人说话口音、风格以及人类本身的发声道的不同,都会导致不同人识别的难度不一样。那么这里就需要进行一个说话人自适应性的训练。

可以有如下几个层面的适应性训练:

  1. 模型相关,比如MAP(最大后验适应,针对GMM模型)、MLLR(最大似然线性回归,针对GMM模型)和LHUC(学习隐层状态贡献,针对NN)等
  2. 说话人归一化,比如cMLLR(限制MLLR)等
  3. 说话人建模,比如i-vectors等

下面简单介绍其中的一些(更多细节请移至文末的传送门):

  1. MAP

这是一个对已经训练好的GMM参数,根据不同的说话人,进行重新估计的方式:

原先的参数估计为:

μmj=nγjm(n)xnnγjm(n)\mu_{mj} = \frac{\sum_n \gamma_{jm}(n) x_n}{\sum_n \gamma_{jm}(n)}

现在的参数估计为:

μ^=τμ0+nγ(n)xnτ+nγ(n)\hat \mu = \frac{\tau \mu_0 + \sum_n \gamma (n) x_n}{\tau + \sum_n \gamma(n)}

其中的τ\tau是调节说话人数据估计的权重

  1. MLLR

上面的MAP方式有一个弊端就是,如果某个说话人的数据比较少,则进行参数重估的GMM就不完全,只能对少数的GMM进行参数重估。所以可以用线性变化的方式,共享所有GMM之间的线性权重:

μ^=Aμ+b\hat \mu = A \mu + b

然后用说话人数据的最大似然概率进行估计即可。当然,对于方差也可以进行变换和重新估计。

  1. cMLLR

这是对MLLR的一种改进,用相同的线性参数同时对GMM中的均值和方差进行变换,所以称为限制MLLR:

μ^=Aμb\hat \mu = A'\mu - b'

Σ^=AΣAT\hat \Sigma = A'\Sigma {A'}^T

其实这个在对参数重新估计的过程中,就相当于是先对说话人数据进行如下变换,然后直接估计均值和方差:

x=Ax+b,A=A1,b=Abx = Ax + b, A' = A^{-1}, b' = Ab

  1. LHUC

针对神经网络的,就有很多种方式了,比如在输入层加一个变换层,用于将说话人相关的网络变换成说话人无关的网络,如下图:

在训练阶段,网络可以一起训练,在适应阶段,就把上面的部分固定,然后根据说话人的数据finetune下面的变换网络。

LHUC(Learning Hidden Unit Contribution)是另外一种,如下图:

这里就是在每个hidden unit上都乘上一个可学习的说话人相关的幅值。

  1. i-vectors

是一种固定维度的可以代表说话人的向量(通常是40~100维),通过训练得到,方式为:

  • 先训练GMM模型,得到均值μ0\mu_0
  • 然后对均值进行适应性变换,μs=μ0+Mλs\mu_s = \mu_0 + M \lambda_s
  • 用EM算法,估计λs\lambda_sMM
  • λs\lambda_s就是学习出的i-vectors向量。

传送门

  1. Neural network acoustic models 1: Introduction
  2. Neural network acoustic models 2: Hybrid HMM/DNN systems
  3. Neural network acoustic models 3: Context-dependent DNNs and TDNNs
  4. Neural Networks for Acoustic Modelling 4: LSTM acoustic models; Sequence discriminative training
  5. Lattice-free MMI
  6. Speaker Adaptation

都是爱丁堡大学的讲义,讲得很详细~

语音增强

阅读数 7694

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