TTS(Text To Speech)系统在实验室环境下往往能产出相当自然的语音,可一旦应用到车载导航、智能音箱、客服外呼等真实场景,问题就暴露出来了:输出的语音里混着底噪、毛刺感明显、高频发闷,长时间收听容易疲劳。这些问题的本质是合成语音的信噪比不足。提升信噪比不是简单地加一个降噪滤波器就能解决的,而是要从训练数据、声学模型、声码器和后处理整条链路上系统性地做优化。本文将从噪声来源分析入手,逐层展开可落地的降噪与增强方案。

一、合成语音中的噪声从哪里来
要有效降噪,首先要弄清楚噪声的类型和成因。合成语音的噪声来源可以归为三大类:数据侧噪声、模型侧噪声和处理链路噪声。
数据侧噪声是最主要的来源。开源语音数据集(如部分爬取的 audiobook 数据)往往包含背景音乐、房间混响、麦克风底噪,模型在学习这些数据时会把噪声的统计规律一并建模进去,合成时就会随机冒出杂音。尤其是一些基于自回归注意力机制的模型,在长句合成时容易因为注意力漂移产生异常发音,这也是一种广义上的噪声。
模型侧噪声则来自声学模型与声码器的失配。例如声学模型输出的 mel 谱在高频段信息不足,声码器只能靠猜测补全,结果就是高频出现明显的金属感或沙沙声。此外,训练不充分、学习率过高导致的模型未收敛,也会让输出语音带有周期性的杂音。
处理链路噪声包括重采样引入的混叠、音频拼接处的爆音、以及线上传输编码(如低码率 OPUS)造成的失真。这类噪声虽然幅度不大,但叠加在人耳敏感频段时听感会明显变差。
二、数据层面:清洗训练数据是性价比最高的方案
在所有优化手段中,清洗训练数据的投入产出比最高。噪声一旦被模型学进去,后处理只能缓解、无法根除,所以宁可训练前多花时间筛数据。实际操作中一般采用多维度的自动打分加人工抽检的方式。
可以先用客观指标做粗筛:计算每条音频的信噪比估计(SNR)、剪峰率(clip ratio)、静音占比,再通过语音活性检测(VAD)去除首尾长静音。对于带背景音乐的音频,可以用歌唱人声分离模型(如基于 U-Net 的音乐源分离工具)先分离出干净人声。混响严重的语料,可以用去混响模型预处理,或者直接丢弃——混响是最难去除干净的污染类型。
下面是一段用 Python 做基础数据质检的示例代码:
import numpy as np
import soundfile as sf
def check_audio_quality(path, sr_target=22050):
wav, sr = sf.read(path)
# 剪峰检测:超出满量程的样本占比
clip_ratio = np.mean(np.abs(wav) >= 0.999)
# 能量检测:整体能量过低通常是空音频或底噪
rms = np.sqrt(np.mean(wav ** 2))
# 静音占比(粗略按能量阈值判断)
frame_len = int(sr * 0.025)
frames = len(wav) // frame_len
energy = np.array([
np.sqrt(np.mean(wav[i*frame_len:(i+1)*frame_len] ** 2))
for i in range(frames)
])
silence_ratio = np.mean(energy < 0.01)
return {
"clip_ratio": clip_ratio,
"rms": rms,
"silence_ratio": silence_ratio,
"pass": clip_ratio < 0.001 and rms > 0.02 and silence_ratio < 0.5
}
print(check_audio_quality("sample.wav"))
筛选之后的干净语料,还可以通过加噪做数据增强,反向提升模型的鲁棒性:随机混入不同信噪比(5dB 到 20dB)的白噪、粉噪和真实环境噪声,让声学模型学会在噪声条件下也能输出稳定的声学特征。但要注意,如果目标是产出高信噪比的合成语音,加噪训练只用于提升稳定性,最终推理时仍应以干净数据训练的模型为主。
三、模型与声码器层面:从源头减少合成伪影
声码器的选择对最终信噪比影响极大。传统的 Griffin-Lim 算法从 mel 谱恢复波形,相位信息靠迭代估计,天生带有金属感和相位噪声,现在基本只用于快速验证。神经声码器方面,WaveNet 类自回归模型质量最好但速度慢;HiFi-GAN 和 Vocos 这类基于 GAN 或纯卷积结构的模型在质量与速度之间取得了较好平衡,高频伪影明显少于早期方案,是当前的主流选择。
如果模型输出仍然存在高频毛刺,可以尝试两个改进方向。一是检查 mel 谱的分辨率设置,把 fft_size 和 hop_size 调整到与人声频谱细节匹配的程度(例如 22.05kHz 采样率下常用 1024/256),频率分辨率不足会直接导致高频信息丢失。二是在声码器训练时加入多分辨率判别器(如 HiFi-GAN 的 MPD 加 MSD 结构),对频谱细节的还原有显著帮助。
针对自回归模型的注意力漂移问题,一个实用技巧是在推理时限制注意力单调性,或者改用非自回归的 FastSpeech 类模型加流式声码器组合,从结构上消除长句杂音问题。此外,对合成结果做拼接合成时(如分句合成再拼接),务必在拼接点做交叉淡入淡出(crossfade),否则会产生明显的爆音。
import numpy as np
def crossfade_concat(wavs, sr, fade_ms=20):
"""多段合成语音拼接,拼接处做交叉淡化避免爆音"""
fade_len = int(sr * fade_ms / 1000)
result = wavs[0]
for wav in wavs[1:]:
fade_in = np.linspace(0, 1, fade_len)
fade_out = np.linspace(1, 0, fade_len)
result[-fade_len:] = result[-fade_len:] * fade_out + wav[:fade_len] * fade_in
result = np.concatenate([result, wav[fade_len:]])
return result
四、推理后处理:语音增强作为最后一道防线
即使前面各环节都做到了位,线上环境仍可能引入新的噪声(比如设备播放底噪、传输失真),此时在推理管线末端加一层语音增强模块是稳妥的做法。传统方法实现简单、计算量小,适合资源受限的场景。
谱减法是最经典的方法,假设噪声是平稳的,从带噪语音的幅度谱中减去估计的噪声谱。它计算便宜,但在低信噪比时会产生明显的音乐噪声。维纳滤波则是在最小均方误差准则下对信号做最优滤波,效果比谱减法平滑,但同样依赖噪声估计的准确性。两者的共同短板是只对稳态噪声有效,对非稳态噪声(键盘声、人声干扰)基本无能为力。
import numpy as np
from scipy.fft import rfft, irfft
def spectral_subtraction(wav, sr, noise_frames=10):
"""简单谱减法降噪示例"""
frame_len = 512
hop = 256
n_frames = (len(wav) - frame_len) // hop
# 加汉宁窗分帧
window = np.hanning(frame_len)
frames = np.array([
wav[i*hop:i*hop+frame_len] * window
for i in range(n_frames)
])
spectrum = rfft(frames, axis=1)
magnitude = np.abs(spectrum)
phase = spectrum / (magnitude + 1e-10)
# 用前若干帧估计噪声谱(假设开头为静音段)
noise_mag = np.mean(magnitude[:noise_frames], axis=0)
# 谱减并做谱底限制,避免过度削减产生音乐噪声
enhanced = np.maximum(magnitude - noise_mag, 0.05 * magnitude)
out_spec = enhanced * phase
frames_out = irfft(out_spec, axis=1)
# 重叠相加还原
output = np.zeros(len(wav))
for i in range(n_frames):
output[i*hop:i*hop+frame_len] += frames_out[i]
return output
深度学习降噪模型则是当前的主力方案。RNNoise 极其轻量,适合嵌入到实时合成链路;FullSubNet、DTLN 在中等算力下能处理非稳态噪声;追求极致效果可以用基于复数域频谱建模的模型,对相位同时做修正,还原度更高。要注意的是,TTS 输出的语音本身是干净语音,增强模块的强度要保守设置,过度降噪会把高频细节和齿音一起抹掉,声音发闷,反而降低 MOS 分。实践中通常把降噪强度系数设在 0.5 到 0.7 之间,并配合轻度的响度归一化一起使用。
五、效果评估与工程落地建议
评估合成语音质量需要主客观指标结合。客观指标常用 PESQ、STOI、SI-SNR 以及频谱距离,其中 SI-SNR 直接反映信噪比水平,适合做回归测试的自动化监控;但客观指标与人耳听感并不完全一致,最终定版前一定要做主观 MOS 评测,邀请多人对自然度、清晰度、噪感三个维度打分。
工程落地时有几点经验值得参考。第一,建立固定语料集做每日回归评测,任何模型或数据变更都跑一遍 SI-SNR 和 MOS 抽检,防止降噪优化引入新的退化。第二,后处理模块要与 TTS 解耦部署,方便单独迭代和回滚。第三,注意播放端的兼容性,部分低端设备的扬声器本身会放大高频毛刺,需要在下发前针对目标设备做均衡调整。第四,如果链路中有音频编码传输,优先选择 48kbps 以上的 OPUS 或 AAC,避免低码率编码抵消前面的降噪努力。
总结来看,提升 TTS 合成语音的信噪比是一条系统工程:数据清洗解决根源,声码器优化减少伪影,语音增强兜底线上问题,再配合完善的评估体系闭环验证。按这个顺序逐层投入,通常能在不大幅增加成本的前提下,把合成语音的听感提升一个明显档次。