电子说
噪声问题一直是语音识别的一个老大难的问题,在理想的实验室的环境下,识别效果已经非常好了,之前听很多音频算法工程师抱怨,在给识别做降噪时,经常发现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的,恶劣的场景比较少,一般场景大不了扩增各种带噪数据训练,也是可以的。
责任编辑:lq6
全部0条评论
快来发表一下你的评论吧 !