资讯详情

资讯详情

深度学习语音降噪:从传统信号处理到端到端实战

1. 从传统信号处理到深度学习的范式转移1.1 为什么传统降噪方法在真实场景中频频翻车做语音降噪这行十几年我最大的感受就是传统信号处理那套东西在实验室里跑得漂漂亮亮一到真实环境就原形毕露。谱减法、维纳滤波、卡尔曼滤波这些经典算法本质上都建立在一个假设上——噪声是平稳的或者至少是慢变的。可现实中的噪声呢地铁进站的轰鸣、咖啡馆里忽大忽小的人声、键盘敲击的咔嗒声、窗外突然响起的鸣笛全都是非平稳的统计特性在毫秒级别上就变了。我早年做过一个车载语音通话的项目当时用的是基于最小均方误差的谱增益估计。在怠速状态下效果还行一旦车速上到八十以上风噪和胎噪混在一起降噪后的语音就变得断断续续像机器人说话。问题出在哪传统方法需要估计噪声的功率谱而估计本身就有延迟。当噪声突变时估计值跟不上变化要么降噪不足留下残留噪声要么过度抑制把语音也砍掉了。这个矛盾在传统框架下几乎无解因为你没法同时做到“快速跟踪”和“准确估计”。另一个致命伤是传统方法对相位信息的处理。大多数算法只修改幅度谱保留原始相位。但相位在语音感知中扮演着重要角色尤其是在低信噪比条件下。我试过用Griffin-Lim算法迭代重建相位计算量大不说实时性根本没法保证。这些局限性逼着整个行业去寻找新的出路。1.2 深度学习切入语音降噪的核心逻辑深度学习之所以能在这个领域掀起革命根本原因在于它把降噪问题从“基于规则的信号处理”变成了“基于数据的学习问题”。传统方法需要人工设计噪声估计器、增益函数、平滑策略每一步都依赖领域专家的先验知识。而深度神经网络直接端到端地学习从带噪语音到干净语音的映射中间的所有变换都由网络自己从数据中归纳出来。这个转变的意义在于网络可以学习到传统方法难以建模的非线性关系。比如人声和噪声在时频域上的重叠模式传统方法只能靠简单的统计模型去区分而卷积神经网络可以通过多层非线性变换捕捉到更细微的判别特征。我做过一个对比实验同样一段带噪语音谱减法降噪后的PESQ得分是1.8左右而一个简单的三层LSTM网络就能做到2.4差距非常明显。更重要的是深度学习模型可以融合多帧上下文信息。传统方法通常只处理当前帧或者有限几帧而网络可以看到前后几百毫秒甚至更长的上下文。这对于处理语音中的瞬态成分特别有用比如爆破音、摩擦音这些音素在时频域上变化剧烈传统方法很容易把它们当成噪声误杀而网络通过上下文可以判断出这是语音的一部分。1.3 从信号处理到数据驱动的思维转变我刚开始接触深度学习降噪时最大的思维障碍是以前我总想着怎么设计一个更好的滤波器现在要想的是怎么设计一个更好的损失函数。这个转变听起来简单实际上涉及到整个问题建模方式的改变。传统方法中我们关心的是信噪比、失真度这些信号层面的指标。但在深度学习框架下损失函数直接决定了网络优化的方向。早期大家用均方误差后来发现MSE倾向于过度平滑导致语音听起来发闷。于是有人提出用SI-SDR作为损失函数直接优化尺度不变的信噪比。再后来对抗损失、感知损失都被引入进来目的就是让降噪后的语音在主观听感上更自然。这个过程中我踩过一个大坑一开始用MSE训练模型在验证集上的loss降得很低但实际听感很差语音细节丢失严重。后来换成SI-SDR损失虽然loss曲线没那么好看但主观质量提升了一大截。这让我意识到在语音降噪任务中优化目标和感知质量之间不能简单划等号损失函数的设计需要结合人耳的听觉特性。2. 深度学习语音降噪的核心技术拆解2.1 主流网络架构的选型与对比目前语音降噪领域主流的网络架构大致可以分为几类基于CNN的、基于RNN的、基于Transformer的以及混合架构。每种架构都有其适用的场景和优缺点选型时需要根据具体需求来权衡。CNN的优势在于局部特征提取能力强计算效率高适合处理时频图这种具有局部相关性的数据。我早期做过一个基于全卷积网络的降噪模型输入是257维的幅度谱经过几层卷积和反卷积直接输出干净的幅度谱。这个模型参数量只有几十万在嵌入式设备上跑实时推理毫无压力。但CNN的局限在于感受野有限虽然可以通过堆叠层数或者使用空洞卷积来扩大感受野但对于长时依赖的建模能力还是偏弱。RNN特别是LSTM和GRU天生适合处理时序信号。语音帧之间的相关性很强RNN可以通过隐藏状态传递历史信息对语音的动态变化建模得更自然。我做过一个双向LSTM的降噪模型在离线场景下效果很好但双向结构意味着需要看到未来的帧实时场景下没法用。单向LSTM虽然可以实时但效果会打折扣。后来出现了因果卷积和流式Transformer才在实时性和性能之间找到了更好的平衡。Transformer这几年在语音领域火得不行它的自注意力机制可以捕捉任意距离的依赖关系而且并行计算效率高。但原始Transformer的计算复杂度是序列长度的平方对于长语音序列来说开销太大。于是有了各种改进版本比如限制注意力窗口的Local Transformer或者用卷积替代注意力的Conformer。我在一个会议场景的降噪项目中用过Conformer效果确实比LSTM好但推理速度慢了不少最后通过知识蒸馏压缩模型才满足实时性要求。架构类型优势劣势适用场景CNN计算高效局部特征强长时建模弱嵌入式实时降噪RNN/LSTM时序建模好流式友好并行度低训练慢实时通话降噪Transformer全局依赖强并行度高计算量大内存占用高离线高质量降噪混合架构兼顾效率与性能结构复杂调参困难通用场景2.2 时频域与端到端方法的取舍做语音降噪第一个要做的决策就是在时频域做还是直接端到端在时域做这个问题我纠结过很久两种路线都试过各有各的坑。时频域方法的流程很清晰先做短时傅里叶变换得到幅度谱和相位谱然后网络只处理幅度谱最后用原始相位或者估计的相位做逆变换重建语音。这种方法的优点是物理意义明确网络的学习目标就是干净语音的幅度谱训练稳定收敛快。而且时频域的稀疏性可以利用很多噪声在特定频带上能量很低网络很容易学会抑制。我早期的大部分项目都是走这条路线用对数功率谱作为输入特征配合一个几层的LSTM就能得到不错的效果。但时频域方法有个绕不开的问题相位。如果直接用带噪相位在低信噪比下重建的语音会有明显的金属感。如果估计相位又增加了网络的负担和训练难度。我试过用复数谱作为网络输入输出让网络同时学习幅度和相位但复数运算在神经网络中实现起来比较麻烦而且相位本身存在缠绕问题直接回归效果不好。端到端时域方法直接输入带噪波形输出干净波形跳过了时频变换。这种方法的优势是避免了相位问题网络可以学习到波形层面的细微结构。WaveNet、Conv-TasNet、Demucs这些模型都是这个思路。我复现过Conv-TasNet在干净数据集上效果确实好但训练时间比时频域方法长了好几倍而且对数据量的要求更高。另外端到端模型的可解释性差出了问题很难排查是哪个环节的错。我的经验是如果追求实时性和低资源部署时频域方法更稳妥如果追求极致音质且计算资源充足端到端方法值得尝试。折中的方案是用时频域做前端粗降噪再用端到端做后端精修但这样系统复杂度会上升。2.3 损失函数设计的门道与实战经验损失函数是深度学习降噪的灵魂选错了损失函数网络再深也白搭。我在这上面交了不少学费这里把经验教训都摊开说说。最常用的是均方误差直接优化网络输出和干净语音之间的欧氏距离。MSE的优点是梯度稳定训练容易收敛。但问题也很明显MSE对大幅值误差敏感对小幅值误差不敏感导致网络倾向于输出平均值语音听起来模糊、缺乏细节。我做过一个实验用MSE训练的模型在频谱图上看起来降噪很干净但听感上总觉得少了点什么后来对比才发现是高频细节被平滑掉了。SI-SDR损失直接优化尺度不变的信噪比对幅度缩放不敏感更关注波形的结构相似性。这个损失函数在时域方法中用得比较多我把它搬到时频域也试过效果比MSE好。但SI-SDR有个问题当信号能量很低时数值不稳定容易产生梯度爆炸。解决办法是加一个很小的epsilon或者对信号做归一化。对抗损失是另一个思路用一个判别器来判断输出是干净语音还是降噪后的语音生成器尽量骗过判别器。这种方法可以提升语音的自然度但训练不稳定容易模式崩溃。我试过用LSGAN的框架来做训练了三天三夜效果时好时坏最后放弃了。后来看到有论文用感知损失把预训练的语音识别模型或者声学模型的中间层特征拿来做损失这个思路我觉得很有前景因为它直接优化了语音的语义信息而不仅仅是波形相似度。实际项目中我通常会用组合损失主损失用SI-SDR或者MSE保证整体降噪效果辅以频谱收敛损失来约束频谱细节再加一个小的对抗损失提升自然度。权重需要根据验证集的主观评分来调没有固定公式只能多试。3. 从零搭建深度学习语音降噪系统的完整流程3.1 数据准备与预处理的关键细节数据是深度学习降噪的基石数据质量不行模型再牛也白搭。我见过太多人随便找几个公开数据集就开始训练结果模型在实际场景中完全不能用。这里说说我在数据准备上的经验。干净语音数据方面常用的有LibriSpeech、VCTK、AISHELL等。LibriSpeech是英文朗读语音音质干净但说话人风格比较单一。VCTK包含多种口音说话人更多样。AISHELL是中文数据集做中文降噪必备。我的建议是至少混合两三个数据集增加说话人和录音条件的多样性。如果做特定场景的降噪比如车载或者会议最好自己录一些目标场景的干净语音哪怕只有几小时对模型在目标域的表现提升也很明显。噪声数据方面DEMAND、ESC-50、MUSAN这些公开数据集覆盖了常见的环境噪声。但公开噪声库有个问题录音设备和场景跟你的目标场景可能不匹配。我做过一个地铁广播降噪的项目用DEMAND里的地铁噪声训练实际部署时发现效果一般因为DEMAND里的地铁噪声是在特定城市录的跟目标城市的地铁噪声频谱特性有差异。后来我们自己去目标地铁站录了几小时噪声重新训练后效果提升了一大截。数据预处理有几个关键步骤。首先是重采样所有数据统一到16kHz或者8kHz取决于你的应用场景。然后是分帧加窗通常帧长25ms帧移10ms窗函数用汉明窗。这里有个细节帧长和帧移的选择会影响时频分辨率。帧长越长频率分辨率越高但时间分辨率越低。对于语音降噪25ms是一个比较平衡的选择。如果处理的是音乐或者需要精细时间信息的场景可以缩短到10ms。信噪比的控制也很重要。训练时不能只用固定信噪比否则模型会过拟合到特定信噪比。我通常会在-5dB到20dB之间随机选择信噪比让模型适应不同的噪声强度。另外混合的时候要注意不能简单地把干净语音和噪声相加还要考虑房间冲激响应。如果训练数据是纯净的干信号而实际场景有混响模型在混响环境下的表现会大打折扣。解决办法是用图像方法或者实测的RIR对干净语音做卷积模拟混响效果。3.2 特征提取与网络输入的选择策略特征提取这一步选什么特征直接决定了网络的学习难度。我试过多种特征这里逐一分析。最直接的是原始波形端到端模型用这个。优点是信息无损缺点是维度高网络需要自己学习时频变换训练难度大。如果数据量不够端到端模型很难训好。短时傅里叶变换的幅度谱是最常用的特征。对数功率谱比线性幅度谱更符合人耳听觉特性而且动态范围压缩后更利于网络学习。我通常用257维的对数功率谱作为输入对应16kHz采样率、512点FFT。这个维度不算高网络容易处理。梅尔频谱是另一个选择它模拟了人耳的非线性频率感知维度可以降到80或者40。梅尔频谱的优点是压缩了高频信息减少了冗余但缺点是频率分辨率降低对于需要精细频谱处理的任务可能不够。我做过对比在语音增强任务上对数功率谱和梅尔频谱的效果差不多但梅尔频谱的计算量更小适合资源受限的场景。还有一类特征是复数谱同时包含幅度和相位信息。前面说过相位估计是个难题但直接把复数谱作为输入输出让网络自己学也是一种思路。我试过用复数卷积网络效果比只用幅度谱好但训练不稳定需要仔细调参。实际项目中我通常先用对数功率谱快速验证方案可行性如果效果不够再尝试更复杂的特征。特征的选择没有绝对的好坏关键看跟网络架构和任务需求的匹配度。3.3 模型训练中的超参数调优实录超参数调优是个体力活但有些经验可以少走弯路。学习率是最关键的我通常用Adam优化器初始学习率设1e-3然后根据验证集loss用ReduceLROnPlateau策略衰减。如果训练初期loss震荡厉害说明学习率太大降到1e-4试试。如果loss下降太慢可以适当提高但不要超过1e-2否则容易发散。批大小方面语音降噪任务通常用16到64。批大小太小梯度噪声大训练不稳定批大小太大内存吃不消而且可能陷入局部最优。我一般从32开始试根据显存调整。如果显存不够可以用梯度累积来模拟大批量。训练轮数没有固定值看验证集loss什么时候不再下降。通常50到100轮就够了。但要注意过拟合如果训练loss持续下降而验证loss开始上升就要早停。我通常会保存验证loss最低的模型而不是最后一轮的模型。正则化方面Dropout和权重衰减都常用。Dropout率一般设0.1到0.3太高会导致欠拟合。权重衰减用1e-5到1e-4。另外批归一化在CNN中很有效但在RNN中要慎用因为RNN的隐藏状态是动态的批归一化会破坏时序依赖。Layer归一化更适合RNN。还有一个容易被忽视的超参数是梯度裁剪。语音降噪任务中梯度爆炸时有发生尤其是用RNN的时候。我通常设梯度裁剪阈值为5或者10超过就缩放。这个操作简单但很管用能避免训练中途崩溃。4. 实战中的典型问题与排查技巧4.1 降噪后语音发闷、细节丢失怎么办这是最常见的问题几乎每个做降噪的人都会遇到。表现是降噪后的语音听起来像蒙了一层布高频细节没了辅音变得模糊。根本原因通常是过度抑制或者损失函数设计不当。排查思路是这样的先看频谱图对比干净语音和降噪后的频谱如果高频部分被大面积抑制说明网络学会了“一刀切”的降噪策略把高频都当成噪声了。这时候要检查训练数据中高频噪声的比例如果噪声主要集中在低频而网络还是把高频砍了那就是损失函数的问题。解决办法有几个。一是调整损失函数加入高频加权的频谱损失让网络更关注高频细节。二是用感知损失用预训练的模型提取特征约束降噪后的语音在特征空间上接近干净语音。三是在网络结构中增加高频分支专门处理高频信息。我试过第二种方法用开源的语音识别模型提取中间层特征作为辅助损失效果不错但计算开销会增加。还有一个容易被忽视的原因是相位估计不准。如果用的是带噪相位高频部分的相位误差更大重建后高频细节就会丢失。解决办法是估计相位或者用端到端方法绕过相位问题。4.2 残留噪声与语音失真的平衡术降噪强度不够残留噪声烦人降噪强度太大语音失真严重。这个平衡怎么找我的经验是不要追求绝对干净而是追求听感自然。实际操作中我会在损失函数里加一个控制降噪强度的权重。比如用MSE损失时给干净语音和噪声分别加权。如果更在意残留噪声就加大噪声部分的权重如果更在意语音保真度就加大语音部分的权重。这个权重需要根据主观听感来调没有标准答案。另一个技巧是用后处理。网络输出后不要直接作为最终结果而是做一个软掩蔽或者动态范围压缩。软掩蔽可以保留一部分噪声让语音听起来更自然。动态范围压缩可以提升低能量部分的清晰度同时避免高能量部分过冲。我通常会在网络后面加一个可学习的后处理模块让网络自己学怎么平衡。还有一个策略是分频带处理。低频部分人耳对失真更敏感降噪可以保守一些高频部分噪声更容易被察觉降噪可以激进一些。我试过用多个网络分别处理不同频带最后拼接效果比单网络好但计算量翻倍。4.3 实时部署中的延迟与算力优化实验室里效果再好部署到实际设备上跑不动也是白搭。实时降噪对延迟和算力有硬性要求这里说说我的优化经验。延迟方面主要来自帧长、帧移和网络的前向计算时间。帧长25ms意味着至少25ms的算法延迟加上帧移10ms总延迟至少35ms。如果网络还有因果卷积或者LSTM延迟会更大。对于实时通话端到端延迟最好控制在50ms以内否则会有明显的回声感。优化方法是缩短帧长到10ms用因果卷积替代非因果卷积用单向LSTM替代双向LSTM。算力优化方面模型压缩是主要手段。知识蒸馏是最常用的用一个大模型教一个小模型小模型参数量可以降到十分之一性能损失很小。我做过一个实验原始模型参数量2M蒸馏后200KPESQ只掉了0.1。量化是另一个手段把浮点参数转成8位整数推理速度可以提升2到3倍但要注意量化误差对降噪效果的影响。剪枝也可以把不重要的连接去掉但需要精细调参否则容易破坏模型性能。硬件加速方面如果设备有NPU或者DSP可以把模型部署上去比CPU快很多。但要注意框架兼容性不是所有模型都能直接转换。我通常先用ONNX导出模型再用厂商的工具链转换中间可能会遇到算子不支持的问题需要手动替换或者重写。问题类型典型表现排查方向解决手段语音发闷高频丢失辅音模糊检查频谱抑制情况调整损失函数加高频权重残留噪声背景噪声明显检查噪声估计和掩蔽加大降噪权重后处理语音失真断断续续机械感检查相位和过抑制估计相位软掩蔽实时性差延迟高卡顿检查帧长和模型复杂度模型压缩硬件加速5. 语音降噪技术的演进脉络与个人观察5.1 从传统方法到深度学习的几个关键转折点回顾这几十年的发展语音降噪经历了几个明显的转折。第一个转折是从固定滤波器到自适应滤波器代表是LMS和RLS算法让降噪系统能跟踪噪声的变化。第二个转折是从单麦克风到多麦克风波束形成技术利用空间信息来分离声源在会议和车载场景中效果显著。第三个转折就是深度学习带来的范式革命从基于规则到基于数据从手工设计到自动学习。我印象最深的是2015年前后深度学习开始在语音增强领域爆发。那之前大家还在调谱减法的参数那之后几乎所有人都在跑神经网络。这个转变来得很快很多传统信号处理的专家一开始不适应觉得神经网络是个黑盒子不可解释。但效果摆在那里不得不服。另一个转折是端到端方法的兴起。早期大家还在纠结时频域还是时域后来发现端到端可以绕过很多手工设计的环节虽然训练难度大但上限更高。现在主流的研究基本都是端到端或者混合方法纯时频域的方法越来越少见了。5.2 当前技术瓶颈与可能的突破方向虽然深度学习降噪已经取得了很大进展但还有几个瓶颈没解决。第一个是泛化能力。模型在训练集上表现很好换一个场景或者换一种噪声类型效果就可能大幅下降。根本原因是模型学到的是训练数据的分布而不是真正的降噪能力。解决办法可能需要元学习或者域自适应让模型能快速适应新场景。第二个是可解释性。神经网络是个黑盒子出了问题是哪个环节的错很难定位。传统方法虽然效果差但每一步都有明确的物理意义。如何在保持性能的同时提升可解释性是个值得研究的方向。第三个是极低信噪比下的降噪。当信噪比低于-10dB时语音几乎被噪声淹没现有的方法效果都很有限。人耳在这种情况下还能分辨出语音说明我们还有很大的提升空间。可能的方向是引入更多的先验知识比如语音产生模型、听觉感知模型或者用多模态信息比如结合唇动视觉信息来辅助降噪。5.3 给刚入行朋友的一些实在建议如果你刚入行想在这个方向做点东西我有几个建议。第一先把传统方法搞明白。虽然现在都用深度学习但传统方法里的很多思想比如噪声估计、增益函数、平滑策略在深度学习框架下依然有用。理解了这些你设计网络和损失函数时会更有方向。第二不要一上来就追求SOTA。先跑通一个简单的基线比如用LSTM做对数功率谱的映射把整个流程走一遍从数据准备到训练到评估到部署。这个过程会让你对问题的全貌有清晰的认识比直接复现复杂模型收获更大。第三重视数据。我见过太多人把时间花在调网络结构上却忽视了数据质量。实际上数据决定了模型的上限网络结构只是逼近这个上限。花时间收集和清洗数据比换一个更深的网络更有效。第四多听。降噪最终是给人听的客观指标只是参考。训练完模型后一定要自己听找不同的人听收集主观反馈。有时候指标提升了但听感反而变差这种情况很常见。耳朵才是最终的评判标准。最后保持耐心。语音降噪是个需要积累的方向没有捷径。我做了十几年还在不断学习新东西。这个领域变化很快但核心问题一直没变如何在去除噪声的同时保留语音的自然度和可懂度。抓住这个核心就不会迷失方向。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →