语音增强 — DeepFilterNet3
使用 DeepFilterNet3 去除语音录音中的背景噪声。模型通过 CoreML 在 Neural Engine 上高效推理,而所有信号处理(STFT、ERB filterbank、deep filtering)则在 CPU 上通过 Accelerate/vDSP 运行。
与官方 DF3 对齐
DSP 全流程遵循 libdf:分析缩放为 1/960,归一化 alpha 为 0.99,深度滤波越界抽头补零,并正确处理 NumPy 的 C/Fortran 矩阵顺序。在固定的 20 段 VoiceBank-DEMAND 子集上,Swift 的 PESQ、STOI 和 SI-SDR 分别为 3.097、0.964 和 19.12 dB;官方 Python DF3 为 3.029、0.962 和 18.31 dB。
处理前/后示例
一段带噪语音经过 DeepFilterNet3 处理,便于在本地运行前先听 CoreML 降噪效果。
带噪输入
DeepFilterNet3 输出
架构
DeepFilterNet3 采用双解码器架构,将频谱包络增强与精细频谱细节恢复分离。
| 阶段 | 细节 |
|---|---|
| STFT | 通过 vDSP 进行短时傅立叶变换 |
| Encoder | 4 层 SepConv2d + SqueezedGRU |
| ERB Decoder | 在 ERB 频率子带上应用的 sigmoid mask |
| DF Decoder | 5-tap 复值滤波系数 |
| iSTFT | 逆 STFT,重建时域信号 |
ERB Decoder 在等效矩形带宽(ERB)尺度上估计增益掩码,负责宽频段的频谱整形。DF Decoder 为精细细节预测 5-tap 复值滤波系数,直接在频域中应用已学习的滤波器。
处理流水线
- STFT — 使用 vDSP 将带噪音频分解为时频表示
- ERB 特征 — 将 STFT bin 映射到 ERB 频率子带
- 神经网络 — Encoder 在 Neural Engine 上处理特征;ERB 与 DF 解码器预测增强参数
- ERB 掩码 — 应用 sigmoid 增益掩码,抑制频谱包络中的噪声
- Deep Filtering — 应用 5-tap 复值系数,恢复精细频谱细节
- iSTFT — 由增强后的频谱重建干净音频
模型
| 变体 | 大小 | 精度 |
|---|---|---|
| 默认 | ~2.2 MB | 8 位调色板权重,FP16 计算 |
CLI 使用
# Denoise audio (output to _denoised.wav)
.build/release/speech denoise noisy.wav
# Specify output file
.build/release/speech denoise noisy.wav -o clean.wav
# Use another compatible HuggingFace repository
.build/release/speech denoise noisy.wav --model owner/DeepFilterNet3-CoreML
选项
| 选项 | 说明 |
|---|---|
--output, -o | 输出文件路径(默认 <input>_denoised.wav) |
--model | 兼容的 HuggingFace 模型仓库 ID(默认:aufklarer/DeepFilterNet3-CoreML) |
重要
DeepFilterNet3 通过 CoreML 运行在 Neural Engine 上,而不是通过 MLX 运行在 GPU 上。这意味着它可以在其他 GPU 模型(ASR、TTS)运行时也高效工作。无需编译 metallib。
模型下载
| 模型 | 大小 | HuggingFace |
|---|---|---|
| DeepFilterNet3(CoreML,8 位调色板权重) | ~2.2 MB | aufklarer/DeepFilterNet3-CoreML |
与其他模型组合
语音增强作为其他模型的前处理步骤特别有用:
- 转写之前 — 在运行 ASR 前先降噪,可改善嘈杂录音的词错率
- 说话人嵌入之前 — 更干净的音频能得到更可靠的说话人嵌入向量
- 说话人分离之前 — 去噪可以改善分段精度
# Denoise then transcribe
.build/release/speech denoise noisy.wav -o clean.wav
.build/release/speech transcribe clean.wav
Swift API
import SpeechEnhancement
let model = try await SpeechEnhancer.fromPretrained()
let cleanAudio = try model.enhance(audio: noisySamples, sampleRate: 48000)
亦可在 Android 上使用;Linux 与 Windows 请使用 Speech Core(ONNX Runtime)。