噪声问题一直是语音识别的一个老大难的问题,在理想的实验室的环境下,识别效果已经很是好了,以前听不少音频算法工程师抱怨,在给识别作降噪时,常常发现WER不降反升,下降了识别率,有点莫名其妙,又无处下手。前端
恰好,前段时间调到了AIlab部门,有机会接触这块,改善语音识别的噪声问题,虽然在此以前,询问过同行业的朋友,单通道近场下,基本没有太大做用,有时反而起到副作用,可是本身仍是想亲身实践一下,至少找到这些方法失效的缘由,看看是否在这些失败的缘由里面,改进下思路,可能有新的发现;同时去Ailab,顺带把深度学习降噪实践一把,就算在ASR没有效果,之后还能用在语音通讯这个领域。web
任务的要求是保证声学模型不变更的状况下,即不从新训练声学模型,即单纯利用降噪来改善那些环境恶劣的样本,同时保证不干扰纯净语音或者弱噪声的语音场景,因此很是具备挑战性。算法
为了赶项目,用本身很是熟悉的各类传统的降噪方法:包括最小值跟踪噪声估计,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.降噪对于纯净语音或者弱噪声环境下,不可避免的对语音有所损伤,只有在恶劣的环境下,会起到很是明显的做用。spa
传统降噪是基于统计意义上面的一个处理,难以作到瞬时噪声的精准估计,这个自己就是一个近似的,粗略模糊化的一个处理,即不可避免的对噪声欠估计或者过估计,自己难把握,保真语音,只去噪,若是噪声水平很弱,这个降噪也没有什么用或者说没有明显做用,去噪力度大了,又会破坏语音。能够预见,根据测试集进行调参,就像是在绳子上面玩杂技。排序
咱们的测试样本集,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的,恶劣的场景比较少,通常场景大不了扩增各类带噪数据训练,也是能够的。
咱们的线上数据,影响识别的因素排序是口语化,方言,短词,其次才是噪声,另外,少许混响,语速,音量,也是影响因素之一,以上是本身的一点片面之言,但愿对你们有参考意义,少走弯路。