作者:xiph.org(原文链接)
翻译:刘通
原标题:RNNoise: Learning Noise Suppression
上图展示了降噪前和降噪后的频谱图。
这里是RNNoise
这个demo展示的是RNNoise项目,展现了如何用深度学习来进行噪声抑制。主要想法是将经典信号处理与深度学习相结合来创造一个又小又快的实时噪声抑制算法。对GPU的要求不高—可在Raspberry Pi上轻松运行。结果十分简单,并且比传统噪声抑制系统听起来要强很多。
噪声抑制
噪声抑制是话音处理领域中一个经久不衰的话题,可以追溯到上世纪70年代。正如它名称那样,作用是在对需要的话音造成最小失真的前提下,尽可能的将噪声从含噪信号中去除。
这是传统噪声抑制算法的概念图。语音活动性检测(VAD)模块检测信号什么时候包括语音,什么时候只包括噪声。这些被噪声谱估计模块用来寻找噪声的谱特性(每个频率上的功率多大)。然后,得知噪声是什么样的,并且将其从输入音频中提出来。
通过上图,噪声抑制看起来还挺简单的:从概念上讲只要三步就可以完成了。对,也不对。任何本科电子信息工程的学生都可以写出一个能工作的噪声抑制算法。困难的是如何能使其效果很好,并且能在任何时候都能运行,并且可以针对各种噪音。这需要非常仔细地调整算法中每个小部分,针对奇怪的信号制定许多特殊情况,并且还要进行大量的测试工作。经常会有奇怪的信号出现,导致程序出现错误,所以需要不断进行调试,并且出现问题总比你解决问题要更容易。这件事有50%是科学,另外一半是艺术。我之前用speexdsp库中的噪声抑制器做过这些,可以工作,但是不够好。
深度学习以及递归神经网络
深度学习是人工神经网络的一个新版本。尽管在上世纪60年代就出现了,但是近些年有一些新的进展:
1.我们现在知道如何使他们比两个隐藏层更加深度
2.我们知道如何使递归网络记住过去很长时间的模式
3.我们有足够的计算资源可是真正的进行训练
在这里递归神经网络(RNN)十分的重要,因为它可以对时间序列进行建模,而不是单独考虑输入和输出帧。这对噪声抑制是非常重要的,因为我们需要时间来对噪声产生一个良好的估计值。很长一段时间,因为它不能长时间的保存信息,以及当通过时间回溯时梯度下降过程非常低效的原因,RNN的性能都被严重限制了。在门控单元发明之后,这两个问题都解决了,门控单元有长短记忆网络(Long Short-Term Memory, LSTM),门控递归单元(Gated Recurrent Unit, GRU),以及它们的诸多变体。
RNNoise使用的是门控递归单元(GRU)因为它比LSTM的表现要稍微好一点,并且需要的资源(CPU和缓存)也要更少。跟普通的递归单元相比,GRU多了两个门。重设门用来控制状态(缓存)是否被用来参与新状态的计算,更新门用来让GRU可以将信息记忆很长一段时间,而这也是GRU比简单递归单元表现好的原因。
将简单递归单元与GRU相比。二者的区别在于GRU有两个门,r门和z门,这可以让它学习长期的模式。这两个门都是软开关,基于整个层的前一个状态和输入计算得到。当更新门z在左端时,这时状态可以在很长的一段时间内保持不变—直到一个条件使z门调到了右侧。
下一篇将要为您介绍实现方法。