语音修复 — Sidon
使用 Sidon 将带噪、混响或受限带宽的语音修复为干净的 48 kHz 音频——单个模型即可同时完成降噪、去混响和带宽扩展。它完全在设备端运行(Apple Silicon 上使用 CoreML,其他平台使用 ONNX Runtime)。由于它从已学习的表示中重建语音,而不仅仅是掩蔽噪声,因此特别适合用来准备声音克隆参考音频:它在清理录音的同时保留说话人的身份特征。
语音增强(DeepFilterNet3)是一个极小的实时噪声抑制器。Sidon 则是更重的生成式修复模型:它还会去除混响,并将高频细节重建到 48 kHz。实时去噪请用 DeepFilterNet3,离线清理参考音频与存档录音请用 Sidon。
架构
Sidon 是一个两阶段流水线:自监督特征预测器净化语音表示,然后由神经声码器从中重新合成出干净的波形。
| 阶段 | 细节 |
|---|---|
| 前端 | w2v-BERT 2.0 SeamlessM4T log-mel 特征(16 kHz → 160 维) |
| 预测器 | w2v-BERT 2.0(8 层),配合 LoRA 微调的净化头 → 净化后的特征 |
| 声码器 | DAC 解码器从净化后的特征重新合成 48 kHz 音频 |
该流水线为 16 kHz audio → features → predictor → DAC decoder → 48 kHz audio。总计约 246M 参数(193.6M 预测器 + 52.4M 声码器)。
处理流水线
- 特征提取 — 从 16 kHz 输入计算 w2v-BERT 2.0 log-mel 特征(Apple 上使用 Accelerate/vDSP,其他平台使用 C++)
- 预测器 — 经 LoRA 适配的 w2v-BERT 编码器将带噪/混响特征映射为干净特征
- 声码器 — DAC 解码器从净化后的特征重建干净的 48 kHz 波形
- 分块 — 较长音频以固定窗口(约 10 秒)处理,并在 48 kHz 时间轴上拼接
质量
在一段带混响的参考片段上,修复在保持说话人身份不变的同时提升了感知质量(无参考 MOS):
| 音频 | DNSMOS OVRL | UTMOS | 说话人余弦相似度 |
|---|---|---|---|
| 输入(带混响) | 2.90 | 2.99 | — |
| Sidon 修复后 | 3.29 | 3.40 | 0.79 |
最大的提升来自背景分数(混响被去除)。说话人相似度得以保留,这正是在清理克隆参考音频时最重要的。
模型变体
量化会压缩预测器;DAC 声码器保持较高精度(音频质量)。在 Apple 上,int8 使用 k-means 调色板量化;在 ONNX 上,int8 为逐通道仅权重量化。
| 格式 | 精度 | 包大小 |
|---|---|---|
| CoreML | int8(预测器)+ FP16(声码器) | ~407 MB |
| CoreML | FP16 | ~713 MB |
| ONNX | int8(预测器)+ FP16(声码器) | ~286 MB |
| ONNX | FP16 | ~470 MB |
| ONNX | FP32 | ~939 MB |
CLI 使用
# Restore audio (denoise + dereverb) to clean 48 kHz
.build/release/speech restore noisy.wav -o clean.wav
# Clean a voice-cloning reference before TTS
.build/release/speech speak "Hello world" --voice-sample ref.wav --clean-reference
无论输入采样率如何,Sidon 都会输出 48 kHz 音频(它会上采样并修复带宽)。它是一个离线修复模型——比 DeepFilterNet3 更重——最适合对文件而非实时流运行。
模型下载
| 模型 | 格式 | HuggingFace |
|---|---|---|
| Sidon (CoreML) | fp16 + int8 | aufklarer/Sidon-CoreML |
| Sidon (ONNX) | int8 + fp16 + fp32 | soniqo/Sidon-ONNX |
与其他模型组合
Sidon 作为前处理步骤最为有用:
- 声音克隆之前 — 清理带噪/混响的参考音频,让克隆继承的是声音本身,而不是房间的声学特征
- 转写之前 — 修复存档或远场录音,以提升 ASR 准确率
- 说话人嵌入之前 — 更干净的音频能得到更可靠的嵌入向量
Swift API
import SpeechRestoration
let restorer = try await SpeechRestorer.fromPretrained()
let cleanAudio = try restorer.restore(audio: noisySamples, sampleRate: 16000)
也可在 Android、Linux 与 Windows 上通过 Speech Core(ONNX Runtime)使用。基于 Sidon(MIT)构建。