端侧语音前处理实战:Silero VAD 断句 + GTCRN 降噪,把嘈杂语音洗干净
做端侧语音应用,很多人的第一步就是上 ASR,结果识别率怎么调都上不去。问题往往不在识别模型,而在送进去的音频:地铁里的风噪、办公室的人声、麦克风底噪,都会让识别率断崖式下跌。更糟的是整段录音里大量是静音,直接喂给 ASR 既浪费算力,又容易触发幻觉,静音段被模型硬生生编出文字。
一条靠谱的端侧语音流水线长这样:
麦克风采集 → 回声消除(AEC,双向通话才需要)→ 语音增强降噪(SE)→ 语音活动检测(VAD)断句 → ASR → 后处理
本文只攻两个最容易落地、收益最大的环节:降噪和 VAD 断句。选的两个模型都极小,合起来能塞进手机 App 里离线跑。
Silero VAD:端侧断句的事实标准
Silero VAD 是 Silero 团队开源的预训练语音活动检测器,MIT 许可。截至 2026-10-05,最新版本为 v6.2.3(2026-09-23 发布),PyPI 包名 silero-vad。
它适合端侧的几个硬指标:
- JIT 模型文件约 2MB,单核 CPU 处理一个 30ms 音频块不到 1ms;换成 ONNX 推理还能再快 4-5 倍
- 支持 8kHz 和 16kHz 两种采样率
- 训练语料覆盖 6000+ 语言,带不同底噪的音频也能用
- 官方提供了 C++、Go、Java、C#、Rust、ONNX Runtime Web(浏览器)以及 ExecuTorch 的现成示例,端侧不用自己造轮子
安装(要用 ONNX 推理就带上 extra):
|
|
离线整段检测,三行就够:
|
|
如果是实时麦克风流,就用 VADIterator 逐块喂数据,它只在状态翻转时回调:
|
|
threshold 是判定语音的概率阈值,嘈杂环境调到 0.6 以上能少误触发;min_silence_duration_ms 决定断句灵敏度,值越小断得越碎。
GTCRN:48K 参数的降噪模型
VAD 只能“切”,不能“洗”。要降噪,端侧首选 GTCRN(Grouped Temporal Convolutional Recurrent Network),它是 ICASSP 2024 论文《A Speech Enhancement Model Requiring Ultralow Computational Resources》的官方实现,MIT 许可,仓库到 2026 年仍在更新。
核心卖点是又小又好:
- 48.2K 参数、33.0 MMACs/秒。注意论文里原写的是 23.7K/39.6,作者后来把不可学习的 ERB 滤波器组也计入参数量,并把低频段映射从矩阵乘法换成拼接,更新为 48.2K/33.0
- 在 VCTK-DEMAND 上 PESQ 2.87、SI-SNR 18.83,不仅大幅超过同量级的 RNNoise(PESQ 2.29),甚至压过参数大 36 倍的 DeepFilterNet(1.8M 参数,PESQ 2.81)
- DNS3 盲测:DNSMOS-P.808 达 3.44,优于 RNNoise 的 3.15
三个轻量模型横向对比(数据来自 GTCRN 官方 README,截至 2026-10 未变):
- RNNoise(2018):0.06M 参数,PESQ 2.29,够轻但糊
- DeepFilterNet(2022):1.80M 参数,PESQ 2.81,质量好但重
- GTCRN(2024):0.05M 参数,PESQ 2.87,又小又好
官方预训练模型放在仓库 checkpoints/(DNS3 与 VCTK-DEMAND 各一个),推理就是一段 STFT 加网络加 ISTFT:
|
|
stream/ 目录里还提供了转好的流式 ONNX 模型(gtcrn.onnx 约 352KB),纯 CPU 推理。官方实测在 12 代 i5-12400 上实时因子(RTF)只有 0.07,即处理 1 秒音频只要 70ms。
不想自己拼轮子的话,sherpa-onnx 从 2025-03 起已集成 GTCRN(PR #1977),它在 Android、iOS、桌面都有绑定,可以直接接进现有语音链路。作者后续还出了改进版 UL-UNAS(2025-03,arXiv:2503.00340)和面向低信噪比的双通道 H-GTCRN,想再压一层可以看看。
端侧推理框架怎么选
两个模型都能导出成 ONNX,选型就不必绑死某一家:
- ONNX Runtime Mobile:跨 Android、iOS、桌面,算子兼容性最好,配合 NNAPI 或 CoreML 执行后端还能吃到部分加速,推荐作为默认
- sherpa-onnx:语音全家桶(ASR 加 VAD 加 SE),GTCRN 已内置,不想自己拼流水线就选它
- Core ML、ExecuTorch、TFLite:想榨干苹果神经引擎或 Android 端性能时用。Silero VAD 官方就有 ExecuTorch 示例,GTCRN 需要自己转换
落到实际项目,一个稳妥组合是:Android 用 ONNX Runtime 加 NNAPI,VAD 和降噪共用同一套 ONNX;iOS 用 ONNX Runtime 加 CoreML 后端,或把 VAD 换成系统自带的 AVAudioEngine 语音处理。
完整流水线:先降噪,再断句
把两个模型串起来时顺序很关键:先降噪再 VAD。因为 VAD 在干净信号上判得更准。底噪大的话,VAD 会把噪声段误判成语音,白切出一堆没用的段。
|
|
收益是双份的:识别率因为降噪上去了,算力因为跳过静音段省下来了。
小结
端侧语音想做好,前处理比换更大的 ASR 模型更划算。Silero VAD 负责“哪里有人说话”,2MB 模型单核 1ms 一块;GTCRN 负责“把噪声洗掉”,48.2K 参数就能拿到接近 1.8M 参数 DeepFilterNet 的效果。两者都是 MIT 许可、都有 ONNX 版本、都能离线跑,是当前端侧语音流水线里性价比很高的组合。
文中版本与性能数据截至 2026-10-05 核实:Silero VAD v6.2.3、GTCRN ICASSP 2024 官方实现(48.2K 参数 / 33.0 MMACs)。