一、前言
语音增强,经过近50年的研究发展,涌现出了很多优秀的降噪算法,从最简单的谱减法,到维纳滤波,再到子空间的方法以及基于统计模型的MMSE估计器,传统的数字信号处理的方法让语音降噪在20世纪90年代左右达到了一个高峰。自此以后,对于语音降噪的研究在很长一段时间内处于平缓的发展状态,很多的研究都是基于之前提出的方法基础上进行改进,比如加入听觉感知特性、改善噪声估计的跟踪速度、估计准确度等。在此期间,也不乏有研究者从其它领域吸取了一些东西,用来做语音增强,比如HMM(隐马尔科夫模型)降噪方法、NMF(非负矩阵分解)降噪方法、神经网络降噪方法等,这些方法归结起来,不同于传统数字信号处理之处在于它们都采用了类似机器学习训练的方法来实现降噪模型的构建。因此,学术界有人将语音增强的研究分成了两大分支:无监督的语音增强方法和有监督的语音增强方法。现阶段的研究风向更加偏向于有监督的语音增强方法,势头最热的当属神经网络降噪的研究。
2013年算是神经网络降噪方法的一个转折点,Deliang Wang 教授将神经网络和听觉掩蔽(mask)的方法结合用于降噪,取得了十分不错的效果,使得利用神经网络进行语音增强的研究似乎又看到了新的希望,于是近五年以来,神经网络降噪的文章大量地涌现出来。当然,不只是汪教授本人嗅到了新的研究气息,几乎是同一年(2014年左右),中科大的徐勇博士发表了一篇基于深层神经网络进行对数功率谱映射的实验性文章,自此让深度学习语音增强的研究也分成了两支:基于mask的方法和基于谱映射的方法。现在看来,两种方法各有千秋,但是基于谱映射的方法更加简单,上手更快,因此,目前有关深度学习语音增强的文章中,谱映射的方法大约占了70%,并且越来越多的研究者正在进入这个行列,毕竟从深度学习的其他领域(图像、语音识别、自然语言处理以及语音合成等)可以借鉴的东西太多了,拿过来一个新的模型,只要训练的得当,就可以取得不错的效果。这种套模型风气不知道是利是弊,我个人还是更倾向于去设计更适合语音增强领域的专用神经网络模型。
无论如何,研究者要勇于尝试,即使是不确定的、甚至可能是错的,也要去尝试,这就是一个研究者的工作。所以,我对基于深度学习的谱映射降噪算法进行了一些实验,并总结了一些我的实验结果。这里,我复现了徐勇博士于2014年发表在IEEE Signal Processing Letters 杂志上的文章(An Experimental Study on Speech Enhancement Based on Deep Neural Networks),当然考虑到一些工程的可实现性,以及从其他文章中借鉴的思想,我没有原封不动地复现,而是进行了适当的改动。
二、数据集的构建
这里采用TIMIT语音库和Noisex-92噪音库中的数据进行配制带噪语音,其中TIMIT语音库包含训练集和测试集语音,训练集语音被分成了8个文件夹(dr1-dr8),共462人,每人10句话;测试集语音也分成了8个文件夹(dr1-dr8),共248人,每人10句话。训练集和测试集的语音都是不同的,这里为了后面实验的验证集配制,我把TIMIT测试集人为分成了两部分:验证集(1680句话)和测试集(800句话)。Noisex-92噪声库中包含了很多种噪声,目前我能拿到的免费的Noisex-92噪声一共是15种:Babble,Cockpit1,Cockpit2,Cockpit3,Destroyer1,Destroyer2,Factory1,Factory2,HFchannel,Leopard,MachineGun,Pink,Tank,Volvo,White。每种噪声的音频长度是3分55秒,我把每个噪声音频的前60%和TIMIT训练集语音随机配制成不同信噪比的带噪语音训练集数据;每个噪声音频的中间20%和TIMIT验证集随机配制成不同信噪比的带噪语音验证集数据;最后20%和TIMIT测试集随机配制成带噪语音的测试集,这里的测试集带噪语音采用固定的5种信噪比,分别为:-5dB,0dB,5dB,10dB,15dB。也就是说,即使是同一类型的噪声,测试集语音中的噪声也是模型未见过的,但是它和训练噪声是符合同一分布的。
三、降噪模型的设计
神经网络降噪模型的构建,采用的是3层隐藏层的全连接神经网络结构,也叫作前馈神经网络(Feed-Forward Neural Network)。考虑到实时处理的需求,没有采用前后帧的信息,因此神经网络的输入层和输出层均为257个神经元,对应着一帧语音中进行512点FFT(这里,采用16k的采样率)处理所得到的对数功率谱的值。神经网络的结构如下图2-1所示。
3-1 前馈神经网络降噪模型结构
如图所示,神经网络的输入帧长为512点,帧移256点,对每一帧的时域采样点进行FFT变换,求得其功率谱后取对数,得到257维的log功率谱特征。提取的所有log功率谱特征,都进行标准化处理,将其均值归到0,方差归到1,这有利于梯度下降法更快地找到最小值。需要注意的是,提取的特征将会被随机打乱后喂给神经网络进行反向传播的优化,这是必须的,也是十分重要的一步。因为随机梯度下降只有在数据随机的情况下才能高效地工作,随机的数据有利于其避免卡在一些局部优值上。
另外,神经网络模型的隐藏层采用ReLU作为激活函数,并且采用Adam优化算法进行反向传播,自适应地调整梯度的步长,实现更高效的反向传播。为了保证网络模型的泛化能力,每层隐藏层都采用0.2的丢弃率和batch normalization的正则化方法。
四、实验结果
这里,训练集中只采用了4种噪声,分别为Babble, Factory1, Destroyer1和Destroyer2。训练时的学习率为0.0002,minibatch size 设为128,一直迭代到10次,Dev Loss就下降不下去了,此时的Train Loss = 0.439620,Dev Loss = 0.536509。下面给出了测试集中5dB噪声污染情况下的语音降噪效果。
(1)Babble 噪声:
4-1 5 dB Babble 噪声污染的降噪情况
(2)Factory1 噪声:
4-2 5 dB Factory1 噪声污染的降噪情况
(3)Destroyer1 噪声:
4-3 5 dB Destroyer1 噪声污染的降噪情况
(4)Destroyer2 噪声:
4-4 5 dB Destroyer2 噪声污染的降噪情况
总结:
FNN语音降噪模型在训练过的噪声类型情况下(Babble,Factory1,Destroyer1,Destroyer2),可以实现较好的降噪效果。但是,在其他未训练过的噪声类型情况下(Noisex-92 的其他11种噪声),虽然也具有一定的降噪效果,但是语音质量和语音可懂度的改善程度均没有训练过的噪声好。并且,我通过进一步实验发现,增加训练集的噪声种类,可以有效地改善模型的泛化能力。因此,如果训练集数据足够丰富,是可以让模型获得较全面的降噪效果。