资讯详情

sherpa-onnx Dart 实战:用 DPDFNet 离线语音增强 API 给 ASR 前端降噪

📅 2026/9/14 14:43:41 | 华诺云谱 👁 阅读
sherpa-onnx Dart 实战:用 DPDFNet 离线语音增强 API 给 ASR 前端降噪
sherpa-onnx Dart 实战用 DPDFNet 离线语音增强 API 给 ASR 前端降噪【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx本文基于 sherpa-onnx 仓库中的 Dart DPDFNet 语音增强示例完整讲解如何用 Dart 的OfflineSpeechDenoiserAPI 加载 DPDFNet 降噪模型、处理本地 wav 文件并输出增强后的音频。读完你可以在 Dart/Flutter 项目中复现「带噪音频 → DPDFNet 降噪 → 干净音频」的离线处理链路理解attenuationLimitDb、numThreads、provider等关键配置项的含义与默认值并能将降噪输出直接作为下游 ASR 识别的前端。1. 示例定位与目录结构sherpa-onnx 的 Dart 绑定sherpa_onnx包在 dart-api-examples 目录下提供了多组可运行的命令行示例其中speech-enhancement-dpdfnet专门演示Dart 离线语音降噪 API 与 DPDFNet 模型的配合。该示例目录结构非常精简每个文件都对应一个明确的职责文件作用README.md模型选型说明与运行命令pubspec.yamlDart 依赖声明sherpa_onnx、argsbin/speech_enhancement_dpdfnet.dart降噪主程序入口run.sh一键脚本自动下载模型与测试音频后运行analysis_options.yamlDart 静态分析规则这是一个纯粹的离线offline示例整段音频一次性读入、一次性降噪、一次性写盘不涉及麦克风采集与流式分帧适合做语音增强效果验证、为 ASR 准备干净输入或作为嵌入式/服务端批处理的参考实现。2. DPDFNet 模型选型16 kHz 与 48 kHz 两条路线README 明确了 DPDFNet 模型家族的两类用途选型是配置这个示例的第一步16 kHz 模型dpdfnet_baseline.onnx、dpdfnet2.onnx、dpdfnet4.onnx、dpdfnet8.onnx。这类模型面向下游 ASR/语音识别场景——降噪后的 16 kHz 音频可以直接喂给 sherpa-onnx 的离线或流式识别模型48 kHz 高保真模型dpdfnet2_48khz_hr.onnx。如果目标是保留更宽的频带、输出增强后的听感音频应选该模型。模型可从两个来源获取sherpa-onnx 官方 Release 中的speech-enhancement-models发布页或 HuggingFace 上的Ceva-IP/DPDFNet模型仓库DPDFNet 由 Ceva 提供仓库内 C 实现头文件的版权标注也印证了这一点见 offline-speech-denoiser-dpdfnet-model-config.h 第 3 行。仓库自带的 run.sh 采用前一种来源当./dpdfnet_baseline.onnx或测试音频./inp_16k.wav不存在时自动从speech-enhancement-modelsRelease 下载这两个文件因此测试音频inp_16k.wav与模型出自同一发布页可直接配合使用。选型提示如果后续要接 ASR如 whisper、zipformer、paraformer 等 sherpa-onnx 支持的模型用 16 kHz 模型如果是纯音频修复/听感增强用dpdfnet2_48khz_hr.onnx。两者不能混用——输入采样率必须与模型训练采样率一致。3. 环境准备与依赖声明打开 pubspec.yaml核心依赖只有两项environment: sdk: 3.2.0 4.0.0 dependencies: sherpa_onnx: 1.13.7 # 官方发布的 Dart 绑定包 # sherpa_onnx: # path: ../../flutter/sherpa_onnx # 可选改用仓库内源码本地路径 args: ^2.5.0 # 命令行参数解析两个值得注意的点版本锁定与本地开发二选一示例默认使用 pub 上发布的sherpa_onnx 1.13.7注释掉的path: ../../flutter/sherpa_onnx则指向本仓库内的 flutter/sherpa_onnx Dart 包源码方便在修改绑定层C API、FFI时做联调。从源码结构看dart-api-examples下的各示例均复用了同一套 Dart 包实现。运行前提需要 Dart SDK 3.2.0 及以上sherpa_onnx包会通过dart pub get拉取各平台的原生库因此无需在本仓库内执行 C 编译。4. 运行示例三条命令完成降噪README 给出的标准运行流程是在dart-api-examples/speech-enhancement-dpdfnet/目录下执行dart pub get dart run ./bin/speech_enhancement_dpdfnet.dart --model ./dpdfnet_baseline.onnx --input-wav ./inp_16k.wav --output-wav ./enhanced-16k.wav程序通过 args 库解析三个必填命令行参数缺任何一个都会打印 usage 并以退出码 1 终止见 speech_enhancement_dpdfnet.dart参数含义示例值--modelDPDFNet ONNX 模型路径./dpdfnet_baseline.onnx--input-wav带噪输入音频wav16 kHz./inp_16k.wav--output-wav增强后音频输出路径./enhanced-16k.wav如果不想手动下载模型和测试音频直接执行 run.sh 即可它按「dart pub get→ 按需curl下载dpdfnet_baseline.onnx与inp_16k.wav→dart run主程序 →ls -lh *.wav查看产物」的顺序完成全部动作末尾的ls -lh *.wav让你直观对比原始音频与enhanced-16k.wav的文件大小。5. 主程序源码逐段解析主程序 bin/speech_enhancement_dpdfnet.dart 全文不足 60 行完整走通了「初始化绑定 → 构造配置 → 创建降噪器 → 读取 wav → 降噪 → 写 wav」的标准链路void main(ListString arguments) async { // 1. 异步加载原生绑定FFI所有 sherpa_onnx 调用前必须先执行 await sherpa_onnx.initBindingsAsync(); // 2. 解析 --model / --input-wav / --output-wav缺参则打印 usage 并退出 final parser ArgParser() ..addOption(model, help: Path to a DPDFNet onnx model) ..addOption(input-wav, help: Path to input.wav) ..addOption(output-wav, help: Path to output.wav); // ... final config sherpa_onnx.OfflineSpeechDenoiserConfig( model: sherpa_onnx.OfflineSpeechDenoiserModelConfig( gtcrn: const sherpa_onnx.OfflineSpeechDenoiserGtcrnModelConfig(), dpdfnet: sherpa_onnx.OfflineSpeechDenoiserDpdfNetModelConfig( model: model, // ONNX 模型路径 attenuationLimitDb: 12.0, // 衰减上限单位 dB ), numThreads: 1, // ONNX Runtime 线程数 debug: true, // 打开调试日志 provider: cpu, // 计算后端此处为 CPU ), ); // 3. 创建离线降噪器 final sd sherpa_onnx.OfflineSpeechDenoiser(config); // 4. 读入整段音频samples 为 Float32List已按 wav 头归一化 final waveData sherpa_onnx.readWave(inputWav); // 5. 一次性降噪返回 DenoisedAudiosamples sampleRate final denoised sd.run(samples: waveData.samples, sampleRate: waveData.sampleRate); sd.free(); // 及时释放底层 C 对象 // 6. 写出增强后的 wav sherpa_onnx.writeWave( filename: outputWav, samples: denoised.samples, sampleRate: denoised.sampleRate); print(Saved to $outputWav); }几个关键点结合绑定层源码说明initBindingsAsync()必须先于一切调用Dart 包通过 FFI 加载原生库异步初始化避免阻塞事件循环。gtcrn与dpdfnet二选一在 offline_speech_denoiser_config.dart 的注释中明确写了 Configure eithergtcrnordpdfnetfor typical use。示例中传入空的GtcrnModelConfig只是满足构造签名实际生效的是dpdfnet分支。想要 GTCRN 降噪可参考姊妹示例 dart-api-examples/speech-enhancement-gtcrn。sd.run()的入参与采样率samples是 32 位浮点 PCM 数组sampleRate直接取自 wav 文件头并由readWave解析。DPDFNet 16 kHz 模型要求输入为 16 kHz这也是 README 强调Use 16 kHz DPDFNet models的原因。free()不可省略OfflineSpeechDenoiser持有底层 C 实例与 ONNX 会话手动释放可避免长时间批处理下的内存累积。6. 关键参数深挖attenuationLimitDb与推理配置OfflineSpeechDenoiserDpdfNetModelConfig只有两个字段但在示例里只解释了modelattenuationLimitDb值得单独展开。Dart 侧定义见 offline_speech_denoiser_config.dartclass OfflineSpeechDenoiserDpdfNetModelConfig { const OfflineSpeechDenoiserDpdfNetModelConfig({ this.model , this.attenuationLimitDb 0.0, // 默认 0 }); // ... }对应到 C 底层配置 offline-speech-denoiser-dpdfnet-model-config.h注释给出了权威语义struct OfflineSpeechDenoiserDpdfNetModelConfig { std::string model; // Offline attenuation limit in dB. A value of 0 disables it. float attenuation_limit_db 0.0f; // ... };即这是一个以 dB 为单位的离线衰减上限取 0 表示关闭该限制。Dart 示例中显式设置为12.0意味着降噪过程对信号幅度的压制最多不超过 12 dB——这是对降噪器输出动态范围的一道安全阀防止过度降噪造成音量骤降。从源码结构看该参数最终会随配置传入 DPDFNet 推理实现参见 offline-speech-denoiser-dpdfnet-impl.h 所在的 C 实现层在 Dart 侧调整数值即可改变离线降噪的保守程度无需重新导出模型。外层OfflineSpeechDenoiserModelConfig的其余三个字段在示例中均为默认值见 offline_speech_denoiser_config.dart字段示例取值默认值说明numThreads11ONNX Runtime 推理线程数批处理吞吐场景可调大debugtruetrue调试日志开关生产环境建议改false降低噪声providercpucpu计算后端Dart 离线场景固定用 CPU7. 从降噪到 ASR在 sherpa-onnx 中的完整位置这个 Dart 示例并非孤立存在它是 sherpa-onnx 语音增强作为 ASR 前端这一标准管线中的第一环。同仓库中可观察到的完整生态同一模型的流式 Dart 版本dart-api-examples/streaming-speech-enhancement-dpdfnet 演示在线流式DPDFNet 降噪适合实时采集场景与本文的离线版互为补充C 参考实现c-api-examples/speech-enhancement-dpdfnet-c-api.c 与 cxx-api-examples/speech-enhancement-dpdfnet-cxx-api.cc 演示相同模型在 C/C 侧的调用方式参数语义与 Dart 一致降噪 识别组合仓库中大量vad-*、*-with-hr示例如 python-api-examples/simulate-streaming-sense-voice-microphone.py 所在目录下的组合示例表明enhanced-16k.wav这类降噪产物可直接作为offline-decode-files类 ASR 示例的输入用于验证降噪对识别准确率的提升。8. 小结与注意事项复现本示例时建议按以下清单操作进入dart-api-examples/speech-enhancement-dpdfnet/执行dart pub get或直接跑run.sh从speech-enhancement-modelsRelease 或 HuggingFaceCeva-IP/DPDFNet下载模型输入音频采样率须与模型匹配16 kHz 模型 ↔ 16 kHz 音频dpdfnet2_48khz_hr.onnx↔ 48 kHz 音频用--model / --input-wav / --output-wav三参数运行主程序得到enhanced-16k.wav需要控制降噪激进度时调整 speech_enhancement_dpdfnet.dart 中的attenuationLimitDb0 表示关闭限制示例默认 12 dB。需要注意的边界本示例演示的是离线整句降噪不支持麦克风流式输入流式需求请用streaming-speech-enhancement-dpdfnet示例sherpa_onnx包要求 Dart SDK ≥ 3.2.0若用本地path: ../../flutter/sherpa_onnx替换 pub 版本需要保证工作树中 flutter/sherpa_onnx 与示例版本pubspec 锁定 1.13.7的 API 兼容。【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。