一、RNNoise 简介(Overview)
RNNoise 是由 Jean-Marc Valin 提出的一个基于循环神经网络(RNN)的实时语音降噪算法。其主要特点如下:
-
开源,轻量,易嵌入(仅使用 float,C 实现)
-
支持 实时处理(低延迟)
-
不依赖任何专有模型或第三方框架
-
架构简单但效果强大,性能优于传统 Wiener Filter 或 Spectral Subtraction 方法
-
全频段48K处理,16BIT.
二、整体架构(System Architecture)
RNNoise 将整个处理流程分为两个主要部分:
-
信号预处理(Feature Extraction)
-
神经网络预测增益(GRU + Dense 层)
-
应用增益恢复语音(Gain Application)
-
流程:输入音频 → 分帧+窗函数 → FFT → 特征提取 → 神经网络 → 频带增益预测 → 应用增益 → iFFT → 重建音频
三、神经网络架构(GRU Network)
输入特征(42维)
↓
GRU (Gated Recurrent Unit) - 48 单元
↓
GRU (Gated Recurrent Unit) - 96 单元
↓
Dense - 48 单元
↓
输出:频带增益 (22 频带) ∈ [0, 1]
输出是一个长度为 22 的向量,对应于每个 Bark 频带的增益系数(在 [0, 1] 之间),即决定了当前帧在每个频段保留多少能量。
四、增益应用与语音重建(Gain Application)
处理流程:
-
将输出的 22 个频带增益,插值扩展为原始 FFT bin 数(例如 256 点 FFT → 129 bins)
-
对输入帧的复数频谱,逐频率乘以增益
-
使用逆 FFT(iFFT)重建时间域帧
-
使用重叠加窗(OLA)重叠恢复音频
五、推理效率(Real-Time Performance)
RNNoise 可以在极低资源的设备上运行:
-
CPU:一个 ARM Cortex-A53 核心即可实时运行
-
算力需求:小于 10 MFLOPS
-
延迟:仅 10ms(帧长)+ 10ms(窗口重叠)
六、实际效果与评价
特性 | 表现 |
---|---|
语音清晰度 | 高(不损伤原始语音) |
噪声抑制效果 | 中高(对稳定背景噪声效果显著) |
对突发噪声 | 一般(对瞬间杂音较弱) |
实时性 | 极高 |
嵌入适应性 | 优秀(适合嵌入式/前端设备) |
七、损失函数:
gamma =0.25
gain_loss:
e = pred_gain**gamma - target_gain**gamma
gain_loss = torch.mean((1 + 5. * vad) * mask(gain) * (e ** 2))
非线性损失:
用的是基于 gamma 的非线性差异度量 e = ĝ^γ - g^γ,这是许多语音增强论文中会采用的形式,接近对数域处理(如 γ=0.5 就是平方根)。
加权:
(1 + 5 * vad):语音段更重要,损失被放大 5 倍。
vad_loss:交叉熵损失
vad_loss = torch.mean(
torch.abs(2 * vad - 1) * (-vad * torch.log(0.01 + pred_vad) - (1 - vad) * torch.log(1.01 - pred_vad))
)
总的损失:
loss = gain_loss + 0.001 * vad_loss
参考:
https://github.com/xiph/rnnoise
https://arxiv.org/pdf/1709.08243