拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Transformer在语音去噪中的应用:模型演进与工程实践

Transformer在语音去噪中的应用:模型演进与工程实践

语音去噪这块,我坚持做下来也有六七年了。从最传统的谱减法、维纳滤波,到后来CNN、RNN,再到现在满屏都是Transformer相关的论文,技术更迭确实快得让人喘不过气。最近我在集中整理一批基于Transformer的语音去噪深度学习模型论文,顺手把里面的共性和差异做了个总结,这篇内容就是从我的阅读笔记里整理出来的。

这篇内容比较适合三类人看:一是刚入门语音增强、想系统了解模型演进路线的同学;二是手里有去噪需求、正在纠结选哪个模型落地的朋友;三是想理解Transformer为什么能拿来降噪、以及它和CNN/RNN到底差在哪的爱好者。我不会只罗列论文标题,而是把模型背后的设计动机、结构上的共同点、训练时容易踩的坑都拆开讲,最后再分享一些我实际训练和调优时的经验。

1. 语音去噪到底在解决什么问题

1.1 任务本质和评价指标

语音去噪,学术上一般叫语音增强(Speech Enhancement),目标是从带噪语音里恢复出干净的语音信号。噪声可能是马路上的车流声、空调的嗡嗡声、餐厅里的多人说话背景声,也可能是混响带来的晚期反射声。这个问题本质上是一个信号重建问题:输入是“干净语音+噪声”的混合,我们要把噪声那一部分剥离掉,同时尽可能保留原始语音的细节、音色和可懂度。

衡量去噪效果,业界常用的指标有三个,这里先简单说一下,后面讲论文时会频繁提到。

  • PESQ(语音质量感知评估):范围大概是-0.5到4.5,分数越高越好,它主要反映人耳感知到的语音质量。
  • STOI(短时客观可懂度):范围0到1,越接近1说明语音越容易听懂,这个指标对语音可懂度的刻画很敏感。
  • SI-SDR(尺度不变信噪比):单位是dB,越高说明增强后的语音和干净语音在波形层面越接近。

如果做实时系统,还要额外关心RTF(实时系数),也就是处理1秒音频需要多少秒的计算时间。RTF小于1才能做到实时。这三个指标和RTF基本就是论文对比阶段最常出现的四个数字。

1.2 传统算法为什么会被深度学习取代

在深度学习普及之前,主流的去噪方法是谱减法、维纳滤波和基于统计模型的MMSE估计器。这些方法有个共同的假设:噪声是平稳的,或者可以通过语音间隙估计出来。但现实世界的噪声往往是非平稳的,比如街道上突然响起的鸣笛、键盘敲击声,这些方法处理起来就很吃力,容易出现残留的“音乐噪声”,听起来刺耳不自然。

深度学习方法进入之后,思路变成了“学习一个从带噪语音到干净语音的映射”。最早是拿全连接网络去预测幅度谱的增益,后来CNN能捕捉局部时频特征,RNN/LSTM能建模时间上的长程依赖,效果越来越好。但真正让我觉得领域开始质变的,还是Transformer出现之后,它把“全局建模”这个能力带到了语音增强里。

我在整理论文时发现一个明显的趋势:早期语音增强模型大多围绕“局部感受野”做文章,而现在越来越多工作选择Transformer作为主干,或者把Transformer和卷积、循环网络结合。这个转变不是偶然的,下面我从原理角度拆一拆。

2. 为什么Transformer会进入语音去噪

2.1 CNN和RNN的瓶颈在哪里

CNN在语音增强里确实很能打,特别是时域卷积网络(TCN)和空洞卷积出现后,模型的感受野可以做得很大。但大感受野往往要靠很深的网络或者很大的空洞率来堆,否则只能看到局部上下文。而语音信号有一个特点:一个音素的发音长度不固定,说话的快慢也会拉伸或压缩时间维度的依赖范围。想用固定卷积核去覆盖所有可能的长短依赖,本质上效率很低。

RNN和LSTM可以处理变长时间依赖,但它们的问题也很明显:计算是顺序的,无法并行。训练长语音时,时间步一多,反向传播的路径很长,容易出现梯度消失或梯度爆炸。虽然LSTM缓解了一部分,但训练效率和并行性还是差强人意。

Transformer走的是另一条路:它用自注意力机制直接计算任意两个位置之间的相关性,不依赖距离,所以可以并行地看到全局上下文。在语音里去理解这句话的含义就是:第50帧的语音可能和第200帧有强相关性,Transformer一次计算就能建模这个关系,不需要中间隔一大堆卷积层。

2.2 自注意力如何建模语音的“上下文”

自注意力机制用一句话概括:每个位置都会和其他位置做相似度计算,然后按相似度加权汇总信息。放到语音去噪里,这就变成了一个很自然的“上下文聚合”过程。

我打个比方,你在嘈杂的餐厅里听朋友说话,大脑并不是只靠当前这一个字来判断内容的,而是会结合前面半句话、语调、口型变化等信息来“脑补”被噪声盖住的字。自注意力做的事情和这个很像:它会让每一帧的语音表示都去“看”其他帧的表示,把有用的信息聚合过来,从而把被噪声污染的部分修复出来。

但Transformer直接用在语音去噪上也有两个天然矛盾:一是语音频谱是二维结构,时间轴和频率轴的依赖性质完全不同;二是自注意力的计算量是序列长度的平方,语音一长就是几千帧,直接全局注意力会导致计算量爆炸。所以论文里大量的设计实际上都在解决“怎么把注意力用在合适的位置、用合适的粒度”。

2.3 从语音分离借来的“双路径”设计

我在读论文时发现,现在很多语音去噪的Transformer结构,源头其实在语音分离领域。SepFormer这篇论文提出了一个双路径(Dual-Path)结构:把输入序列切分成多个小块,先在每个小块内部使用Transformer建模局部依赖,再做一次全局的Transformer建模块与块之间的依赖。

这个设计漂亮地把计算复杂度从“帧数的平方”降到了“块内帧数的平方+块数的平方”。语音去噪领域很快就把这个思路吸收进来了,不过做了一些调整,因为去噪通常不需要分离出多个说话人,只需要估计一个目标语音即可。但“局部建模+全局建模”交替的思路,几乎成了现在基于Transformer的语音增强模型的标配。

3. 我读到的几类代表性Transformer模型

3.1 频域双阶段Transformer:小模型也能出效果

先说一篇我很喜欢的论文:TSTNN(Two-Stage Transformer for Speech Enhancement)。它的核心思路可以概括为“先在频率维度做注意力,再在时间维度做注意力”。

为什么要先频率再时间?因为语音的频带之间是有相关性的,一个元音的共振峰往往横跨多个频带,频率维度的注意力能把这些相关频带的信息聚合起来。做完频率维之后,再把序列转成时间维度,让模型去捕捉上下文语音的动态变化。整个模型不用CNN、不用RNN,几乎纯Transformer结构,参数量也非常小,特别适合对模型大小有要求的场景。

但这类“频域+幅度谱估计”的思路有个通用问题:它通常只估计幅度掩膜,相位直接用带噪语音的相位代替。这个假设在低信噪比场景下会拖后腿,因为相位被噪声破坏得很严重,直接用原相位会导致增强后的语音听起来不干净,有种“罐子音”。

3.2 时域Conformer:把波形直接端到端处理

另一类代表工作是CTS-Net,全称是Conformer-based Time-domain Speech Enhancement Network。它的做法在语音增强里相对激进:不把音频转成频谱,而是直接输入波形。

CTS-Net的设计里有一个关键组件:时间卷积网络合并多头自注意力,这就是Conformer结构。TCN负责提取局部波形特征,自注意力负责捕捉长距离的上下文依赖。这样做的好处是模型不会因为“直接使用带噪相位”而损失质量,因为它在时域端到端学习,能同时优化幅度和相位。

这类模型的效果通常比频域模型更自然,但缺点也明显:时域波形采样率较高(比如16kHz意味着每秒16000个采样点),输入序列长度非常长,训练显存和计算量都不小,对工程落地来说压力会大一些。

3.3 双分支和多分支融合的思路

第三类值得注意的工作是“双分支”结构设计。它们一般把模型拆成两个并行分支:一个分支处理幅度谱,另一个分支处理复数谱或者相位信息,最后在模型某个阶段做特征融合。

这个设计背后有一个很朴素的观察:幅度和相位本质上是一体的,但它们的失真模式不一样。幅度估计不准,人听起来会觉得音量忽大忽小;相位估计不准,语音会变“闷”或者发虚。如果把两个分支分开建模,再通过注意力机制融合,模型就有能力同时优化两个维度。和传统的复数卷积网络(比如DCCRN)相比,这类双分支结构在引入Transformer之后,建模长程依赖的能力更强,特别是对背景噪声变化大的场景,效果提升更明显。

3.4 模型对比与适用场景速查

我不建议一上来就看最新论文,而是建议先建立“模型分类”的概念,这样检索文献会快很多。下面这份对比是根据我总结的几类代表性结构整理出来的。

模型风格输入表示核心结构优点主要局限适合场景
频域双阶段Transformer幅度谱Transformer + 频率/时间双阶段注意力参数少、结构简单、训练快相位使用带噪语音,低信噪比上限受限轻量部署、快速验证、算力受限环境
时域Conformer原始波形TCN + 多头自注意力端到端学习幅度与相位,语音更自然序列长、显存和计算开销大离线高音质、对实时性要求不极端
双分支/复数谱Transformer幅度谱+复数谱并行分支 + 跨分支注意力同时兼顾幅度与相位,失真更低结构复杂、训练难度高追求高指标、复杂噪声场景
双路径Transformer风格时频嵌入序列块内自注意力+块间自注意力长序列建模高效,全局一致性好切块长度和块数需要调参长语音、非平稳噪声严重的场景

4. 训练Transformer去噪模型的实操要点

4.1 数据准备与合成策略

很多人以为语音去噪模型训练丢一堆带噪语音进去就行,实际上数据合成方式极大影响了模型上限。最常用的做法是“干净语音+噪声”按随机信噪比混合。我的习惯是把信噪比控制在-5dB到20dB之间做随机采样,这样模型既见过极嘈杂的“地狱难度”,也见过轻度噪声的场景,不容易偏向某一种噪声强度。

噪声库的选择上,主流是DNS Challenge的公开数据、MUSAN和Freesound。但我实际操作中会额外混合两类数据:一类是音乐噪声,因为语音和音乐在频谱上的重叠方式与人声背景不同,单独加进去能增加鲁棒性;另一类是带混响的语音,用简单的人工冲激响应做卷积,能模拟房间反射。如果不加混响,模型在真实房间里的表现会明显下降。

训练集中的干净语音也要做清洗。我见过不少新手直接拿网上爬的语音训练,结果里面自带底噪、剪辑爆音,模型学会了“清洁语音里的噪声”,越训练效果越怪。建议用域名标准的数据集,或者统一做静音检测和响度归一化。

4.2 特征、掩膜与损失函数的选择

Transformer去噪模型既可以吃频谱特征,也可以吃波形特征。频域模型通常把幅度谱的log域特征作为输入,训练目标是理想比值掩膜IRM或者复数理想比值掩膜cIRM。直接回归幅度谱有时也能做,但掩膜的方式让模型更专注于“增益调整”,收敛稳定性会更好一些。

损失函数是最影响听感的环节之一。我踩过的最深的一个坑是:只优化SI-SDR loss,波形层面的指标提升很快,但听感上会偶尔出现金属声和过增强。后来我改成多目标联合损失,用SI-SDR和multi-resolution STFT loss一起训练。STFT loss的作用是约束频域结构,能有效减少“频谱空洞”,让增强后的语音听起来更平滑自然。

一个可以参考的训练目标组合是:主损失用SI-SDR,副损失加multi-resolution STFT loss,权重可以按1:1到1:0.5之间调。加入L1 loss有时能让收敛更稳定,但权重不宜过大,否则模型会偏保守,降噪力度不够。

4.3 训练稳定性的三个关键细节

Transformer模型在语音增强任务上比CNN更容易出现训练震荡,我把它归结为三个容易被忽略的细节。

第一是学习率调度。Transformer类模型最好配合warmup策略,前几千步用很小的学习率让位置编码和注意力分布稳定下来,再逐步升到峰值。我一般用Noam方式调度,warmup步数设在4000到8000之间,batch比较大时可以适当缩短。

第二是梯度裁剪。自注意力计算过程中,序列越长梯度范数越容易突然飙升。梯度裁剪最大值设在1.0到5.0之间,能明显减少NaN出现。如果还出现NaN,优先检查数据里是否有异常音频或者输入特征有没有除零问题。

第三是LayerNorm的位置。现在的主流实践是pre-norm,也就是把LayerNorm放在自注意力之前,这样训练更稳定,但表达能力略低于post-norm。如果你发现模型“能训但效果上限不高”,可以尝试换成post-norm并配合更小的学习率,但这个组合对超参数敏感,新手建议先保持pre-norm。

5. 模型训练与部署中踩过的坑

5.1 不收敛、震荡和性能回退

第一个高频问题是模型完全不收敛。如果模式崩溃成“直接复制输入”,或者loss一直下不去,先别急着调结构,我一般按顺序排查:训练数据里干净语音和噪声是不是有重复、信噪比分布是不是太极端、学习率是不是太大、mask目标值有没有越界。80%的情况是数据或超参数的问题,跟模型结构无关。

第二个问题是训练到中期时loss开始震荡,甚至回退。这种情况大概率是学习率没有降下来,或者某个batch里的数据特别难。处理方法比较简单:降低峰值学习率、加大batch size、把特别难的样本按概率过滤掉。Transformer模型训练时对batch size比较敏感,batch太小会导致自注意力统计量不稳定,效果波动很大。

我还会在训练时开启EMA(指数移动平均),对参数做平滑处理。虽然会多占一份模型参数的内存,但推理时用EMA参数往往比直接用最后一轮参数的效果更稳,这在语音增强任务里尤其明显。

5.2 音乐噪声与语音失真的排查

增强后的语音出现音乐噪声,原理想起来并不复杂:模型把某些频段的能量估计成了噪声,在频谱上留下孤立的“小洞”,听感上就像背景有细微的吱吱声。这个问题在频域掩膜模型里比较常见,尤其是信噪比不高的时候。

排查思路主要有三条。第一,把训练目标从IRM改成cIRM,因为复数域的掩膜能保留相位信息,频谱结构更完整。第二,在训练时加入时域损失或STFT损失,强制模型生成平滑的频谱,而不是只追求某个指标。第三,检查模型是否对静音段噪声过度压制,如果静音段被压得太狠,会形成“忽静忽噪”的呼吸感。可以在静音段加一点噪声容忍,让输出有自然的环境底噪。

如果模型输出的语音发闷、发虚,大概率是高频信息丢得太多。可以尝试把输入特征从16kHz提升到48kHz采样率,或者引入高频和低频分开预测的“双子带”结构。这两个方案都会增加计算量,但对音质提升很明显。

5.3 实时推理与位置编码的取舍

离线模型部署到实时系统时会遇到一个很现实的问题:Transformer的自注意力是全局的,但实时场景只能看到当前帧和过去的帧,不能看到未来。解决方案一般是对注意力加因果掩码,让每一帧只能关注自己之前的内容。这样RTF会受一定影响,但延迟可控。

还有一个坑是位置编码。如果训练时把音频固定成2秒,推理时遇到3秒的音频,有些位置编码方案会表现很差。建议优先使用相对位置编码,比如旋转位置编码RoPE,它对变长输入的泛化性更好,而且对长序列相对位置的建模也比较合理。

我自己在部署时还发现,量化对Transformer去噪模型的影响比CNN大,尤其是多头注意力中softmax后的分布对数值精度比较敏感。int8量化后指标下降明显的话,可以退一步用layer-wise量化或者只量化部分卷积层,保留注意力的浮点精度。

我把典型问题和处理思路整理成一张表,方便排查时对照。

现象可能原因处理建议
训练不收敛学习率过高、数据分布异常降低峰值学习率,检查数据清洗与信噪比范围
loss震荡回退学习率未降到合理区间、batch太小增加warmup或降低峰值lr,增大batch size
输出有音乐噪声IRM造成频谱空洞、mask过于激进换cIRM目标,加入STFT多尺度损失
语音发闷发虚高频丢失、相位不准确尝试复数掩膜或双子带高频单独建模
变长输入效果骤降绝对位置编码泛化差改用RoPE等相对位置编码
推理RTF过高序列太长、注意力全局计算做因果改造、限制注意力窗口、尝试轻量模型

6. 选型建议与一点个人体会

6.1 按场景选型

如果你和我一样经常要在“效果”和“工程成本”之间做取舍,下面几个选型判断可以帮你省不少试错时间。

想要快速做一个能跑的语音去噪服务,且对时延有要求,优先选TSTNN这类轻量频域Transformer模型。它结构简单,训练资源要求不高,部署也不难。想要离线场景下的高音质增强,可以试试时域Conformer这类端到端模型,代价是显存和推理耗时都会上去。如果面对的是非常复杂的噪声环境,比如多人说话背景、突发噪声同时存在,建议上双分支或者复数域的Transformer模型,虽然训练难度高一些,但上限明显更高。

另外建议在项目早期就把评估方案定下来:PESQ和STOI这种客观指标只是参考,千万不要只盯指标,要留出足够时间做主观试听对比。我见过很多论文里指标漂亮但实际一听“塑料味”很重的模型,这在项目交付里是过不了关的。

6.2 我对未来趋势的观察

从论文里能明显感觉到,Transformer模型在语音去噪里正在和两个方向结合:一个是扩散模型,用扩散模型做语音修复的后处理,能把增强后的语音再“精修”一遍,听感自然很多,代价是速度慢;另一个是自监督预训练,先把模型在大量无标注音频上预训练,再用带噪、干净语音对做微调,在小数据集上也能训出不弱的效果。

轻量化也是绕不开的话题。很多论文都在尝试把大Transformer模型蒸馏到小模型上,或者用线性注意力替代softmax注意力来降低计算复杂度。对于做产业落地的人来说,关注这类工作比单纯刷指标更有实际价值。

6.3 最后分享一个小技巧

训练Transformer去噪模型时,我会在数据合成阶段加入“困难样本挖掘”。具体做法是:每轮训练先让模型对一些盲测样本做前向推理,找出误差最大的几条噪声类型,然后在下一轮的训练数据里提高这类噪声的出现比例。这个方法听起来简单,但对非平稳噪声的处理能力提升非常明显,算是我做语音增强以来性价比最高的训练技巧之一。

语音去噪这个方向做久了你会发现,模型结构固然重要,但真正决定上限的往往是数据和训练策略的细节。希望这篇总结能帮你少踩一些我已经踩过的坑。

返回列表