资讯动态

sherpa-onnx 实战:将 Silero VAD v4 从 JIT 模型导出为 RKNN 并在 RK3588 上运行语音活动检测

发布时间:2026/9/15 19:22:47 来源:尧图企业网站定制
sherpa-onnx 实战将 Silero VAD v4 从 JIT 模型导出为 RKNN 并在 RK3588 上运行语音活动检测【免费下载链接】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 仓库中 scripts/silero_vad/v4 脚本集的技术指南完整讲解如何将 Silero VAD v4 的 PyTorch JIT 模型依次转换为 ONNX 与 RKNN 格式并在 RK3588 等 RKNPU 平台上完成板端验证。读完本文你将掌握 JIT → ONNX → RKNN 的完整转换链路、每个脚本的内部实现细节含模型输入输出形状与元数据约定以及 sherpa-onnx 在加载 RKNN 版 VAD 模型时所做的关键校验逻辑可直接照此流程在自己的 NPU 设备上复现语音活动检测VAD能力。背景为什么要把 Silero VAD v4 转成 RKNNSilero VAD 是一套轻量的语音活动检测Voice Activity Detection模型可在不连接互联网的情况下实时判断一段音频中是否包含人声。sherpa-onnx 官方文档与源码都围绕端侧离线推理这一目标组织生态VAD 常用于语音识别前的端点检测例如 sherpa-onnx-vad.cc、sherpa-onnx-vad-microphone.cc 等示例程序都会先运行 VAD 切出语音片段再送入 ASR 模型。在带有 NPU神经网络处理器的嵌入式板卡上把模型转换为瑞芯微Rockchip专有的 RKNN 格式可以将推理负载从 CPU 卸载到 NPU从而显著降低 CPU 占用与功耗。scripts/silero_vad/v4目录正是为这一目的准备的它提供了一套把 Silero VAD v4 从 JIT 模型一步步转换为 RKNN 的脚本。从源码结构看sherpa-onnx 为 RKNN 推理单独维护了实现目录 sherpa-onnx/csrc/rknn其中包含 silero-vad-model-rknn.cc 与 silero-vad-model-rknn.h说明 RKNN 版 Silero VAD 是项目正式支持的部署形态。脚本目录与环境准备本指南涉及的所有脚本都位于 scripts/silero_vad/v4 目录下脚本作用export-onnx.py将 JIT 模型导出为 ONNX并写入自定义元数据、用 onnxsim 简化test-onnx.py用 onnxruntime 在 CPU 上验证 ONNX 模型的 VAD 效果export-rknn.py将 ONNX 模型转换为指定目标平台的 RKNN 模型test-on-rk3588-board.py在 RK3588 板端使用 RKNNLite 加载并验证 RKNN 模型show.py打印 ONNX 模型的元数据与输入输出信息转换过程分为四步下载 JIT 模型 → 导出 ONNX → 用 onnxruntime 测试 → 转换为 RKNN。需要说明的依赖如下导出 ONNX 阶段需要 Python 环境中的torch、onnx、onnxsim以及onnxruntime用于后续测试转换 RKNN 阶段需要瑞芯微官方的rknn-toolkit2版本 2.1 经原仓库验证可用板端验证阶段需要rknn-toolkit-lite2rknn_toolkit_lite2-2.1.0-cp310-cp310-linux_aarch64.whl经原仓库验证可用、soundfile与numpy且必须在板卡Linux aarch64 NPU上执行。步骤一下载 Silero VAD v4 的 JIT 模型首先需要获取 Silero VAD v4 的 PyTorch JIT 格式模型silero_vad.jit。该文件由 Silero VAD 官方项目在 v4.0 版本中提供位于其官方仓库 v4.0 tag 的files目录下可使用wget直接下载wget silero-vad v4.0 官方文件地址/silero_vad.jit下载完成后确认文件大小正常ls -lh silero_vad.jit -rw-r--r-- 1 kuangfangjun root 1.4M Mar 30 11:04 silero_vad.jit该 JIT 文件约 1.4MB是后续所有转换步骤的输入。此文件需要与 export-onnx.py 放在同一目录下执行因为脚本默认从当前目录加载./silero_vad.jit。步骤二导出为 ONNX运行如下命令将 JIT 模型导出为 ONNX./export-onnx.py脚本会生成./m.onnx文件约 627KBls -lh m.onnx -rw-r--r-- 1 kuangfangjun root 627K Mar 30 11:13 m.onnx值得注意的是ONNX 文件627KB比原始 JIT 模型1.4MB更小原因是 ONNX 以精简的计算图描述代替了 PyTorch 运行时附带的完整执行环境。导出脚本的关键实现阅读 export-onnx.py 源码可以了解这次导出并非简单的格式搬运而是包含了几处针对 RKNN 平台的刻意改造1. 用 MyModule 重新包装模型第 26-83 行脚本将 JIT 模型包进自定义的MyModule把特征提取、自适应归一化、编码器、解码器的调用显式拆解为可导出的计算图。其中adaptive_normalization_forward第 31-56 行是移植重点# Note(fangjun): rknn uses fp16 by default, whose max value is 65504 # so we need to re-write the computation for spect0 # spect0 torch.log1p(torch.mul(spect, 1048576)) spect0 torch.log1p(spect) 13.86294原版计算torch.log1p(spect * 1048576)会产生超出 fp16 表示范围最大值 65504的中间值导致 RKNN 默认的 fp16 精度下数值溢出。因此作者将其改写为数学上等价的torch.log1p(spect) log(1048576)其中log(1048576) ≈ 13.86294从而把大数乘法拆成了加法避免了 fp16 溢出。这是整个转换链路中最关键的数值稳定性处理。2. 确定模型输入输出形状main()中第 90-92 行用随机张量指定了导出的输入形状x(1, 512)即每 512 个采样点16kHz 下为 32ms作为一帧输入h(2, 1, 64)LSTM 隐状态c(2, 1, 64)LSTM 细胞状态。三个输出分别为prob语音概率、next_h、next_c。这与 test-onnx.py 中OnnxModel.__call__的注释第 47-57 行完全一致也与 silero-vad-model-rknn.h 中WindowShift() 512的约定吻合——Silero VAD v4 每 512 个采样点滑动一次窗口。3. 写入自定义元数据第 105-111 行脚本向 ONNX 模型的metadata_props中写入了五条关键元数据meta_data { model_type: silero-vad-v4, sample_rate: 16000, version: 4, h_shape: 2,1,64, c_shape: 2,1,64, }这些元数据不是可有可无的装饰而是 sherpa-onnx 加载 RKNN 模型时的强制校验依据详见后文与 sherpa-onnx 的衔接一节。4. 用 onnxsim 简化模型最后脚本调用onnxsim.simplify()第 123 行对计算图做常量折叠与结构简化进一步压缩模型体积、去掉冗余节点最终覆盖保存m.onnx。步骤三在 CPU 上测试 ONNX 模型导出后先不要急着转 RKNN应先用 onnxruntime 在 CPU 上验证模型行为是否符合预期。首先下载一段测试音频原仓库使用 sherpa-onnx 发布的lei-jun-test.wav然后运行wget sherpa-onnx 模型发布文件地址/lei-jun-test.wav ./test-onnx.py --model ./m.onnx --wav ./lei-jun-test.wav测试脚本的工作原理test-onnx.py 内部实现了一个完整的流式 VAD 推理与后处理流程1. 音频预处理第 74-93 行用soundfile读取 WAV只取第一个声道并转为float32若采样率不是 16kHz则用librosa重采样到 16kHz。2. 逐帧推理第 95-107 行以 512 个采样点为窗口步长逐帧送入模型同时维护并回传h、c状态LSTM 是带记忆的状态模型相邻帧共享隐状态。每一帧得到语音概率p收集到probs列表中。3. 阈值判定与后处理第 109-146 行语音概率阈值threshold 0.5最短语音时长min_speech_duration 0.25 * sample_rate / window_size即 0.25 秒最短静音时长min_silence_duration同样为 0.25 秒。后处理先按阈值把每帧标记为语音/静音过滤掉不足 0.25 秒的毛刺语音段再对相邻语音段之间的静音间隔小于 0.25 秒的情况进行合并最终按start frame_index * window_size / sample_rate换算成秒打印出形如0.032 -- 3.456的语音起止时间。该先阈值、再最短时长过滤、最后合并相邻段的流程与 sherpa-onnx 中 voice-activity-detector.cc 的语音段管理逻辑在思路上是一致的。用 show.py 检查模型结构转换 RKNN 前还可以用 show.py 打印 ONNX 模型的元数据与输入输出签名确认导出结果正确./show.py其输出应包含该输出已内嵌在脚本文件头的注释中第 7-26 行[key: model_type value: silero-vad-v4 , key: sample_rate value: 16000 , key: version value: 4 , key: h_shape value: 2,1,64 , key: c_shape value: 2,1,64 ] NodeArg(namex, typetensor(float), shape[1, 512]) NodeArg(nameh, typetensor(float), shape[2, 1, 64]) NodeArg(namec, typetensor(float), shape[2, 1, 64]) ----- NodeArg(nameprob, typetensor(float), shape[1, 1]) NodeArg(namenext_h, typetensor(float), shape[2, 1, 64]) NodeArg(namenext_c, typetensor(float), shape[2, 1, 64])步骤四将 ONNX 转换为 RKNN测试通过后即可执行转换假设已安装 rknn-toolkit2原仓库验证版本为 2.1./export-rknn.py --in-model ./m.onnx --out-model m.rknn --target-platform rk3588生成约 2.2MB 的 RKNN 模型ls -lh m.rknn -rw-r--r-- 1 kuangfangjun root 2.2M Mar 30 11:19 m.rknn转换脚本的关键实现阅读 export-rknn.py 源码有以下几个值得注意的细节1. 目标平台白名单第 12-22 行脚本内置了支持的目标平台列表其中rv1103、rv1103b、rv1106、rk2118被注释禁用实际可用平台为rk3562、rk3566、rk3568、rk3576、rk3588。命令行参数--target-platform为必填项传入列表外的值会报错。2. 元数据随模型传递第 54-84 行、第 115-128 行get_meta_data()用 onnxruntime 读取 ONNX 的custom_metadata_map把所有keyvalue拼接成用分号分隔的字符串长度须小于 1024再通过rknn.config(..., custom_stringmeta)写入 RKNN 模型。这保证了转换后 RKNN 模型仍携带model_typesilero-vad-v4;sample_rate16000;...信息供下游加载时校验。3. 关闭量化与优化第 96-108 行rknn.config(optimization_level0)与rknn.build(do_quantizationFalse)表明该转换默认不做量化保持 fp32 精度这解释了为何 export-onnx.py 中要专门针对 fp16 溢出重写归一化计算——即便当前不做量化模型仍需兼容 RKNN 工具链在无量化条件下的 fp16 内部表示路径。4. 错误处理脚本在模型文件不存在、加载失败、构建失败、导出失败时都会给出明确的报错信息并退出。在 RK3588 板端验证 RKNN 模型RKNN 模型必须在带有对应 NPU 的板卡上运行。请将m.rknn与lei-jun-test.wav拷贝到 RK3588 板卡并安装rknn_toolkit_lite2在 Linux aarch64 NPU 环境然后执行python3 test-on-rk3588-board.pytest-on-rk3588-board.py 与 CPU 测试脚本保持了相同的 VAD 流程512 窗口、0.5 阈值、0.25 秒最短语音/静音时长差异仅在推理引擎使用RKNNLitefrom rknnlite.api import RKNNLite第 7 行加载 RKNN 模型init_runtime(core_maskRKNNLite.NPU_CORE_0)第 49 行将推理指定到第 0 号 NPU 核心逐帧调用model.inference(inputs[x, h, c])进行 NPU 推理并在每次调用后回传h、c状态第 73-74 行。如果环境中缺少rknnlite脚本会在顶部给出明确提示请将本脚本放在板卡Linux aarch64 NPU上运行并安装rknn_toolkit_lite2原仓库注明 2.1.0 版本已知可用。与 sherpa-onnx 的衔接RKNN 模型的元数据校验转换为 RKNN 格式后模型便可直接接入 sherpa-onnx 的 VAD 流程。sherpa-onnx 为 RKNN 后端实现了独立的 Silero VAD 模型类 SileroVadModelRknn它继承自VadModel抽象基类提供IsSpeech()、Compute()、Reset()等标准接口其中WindowShift()固定返回 512WindowSize()的注释明确说明对于 Silero VAD v4它就是 WindowShift()第 37-41 行。在 silero-vad-model-rknn.cc 中模型加载时会对前文写入的元数据做逐项强校验第 277-306 行附近model_type必须为silero-vad-v4sample_rate必须为16000version必须存在且等于4h_shape、c_shape会被解析成整数数组用于确认 LSTM 状态维度与导出时约定的2,1,64一致。也就是说export-onnx.py 中写入的 metadata 不仅是转换过程的附属产物更是 sherpa-onnx 正确加载与运行该 RKNN 模型的身份证。只要严格按本文的四步流程操作产出的m.rknn即可被 sherpa-onnx 的 RKNN 版 VAD 代码直接加载与仓库中已有的 VAD 示例如 sherpa-onnx-vad.cc配合完成语音活动检测。需要注意的是RKNN 推理要求编译 sherpa-onnx 时启用对应 RKNN 支持依赖rknn_api.h见 silero-vad-model-rknn.h 第 9 行且仅在目标 NPU 平台上运行。常见问题与注意事项fp16 溢出导出的 ONNX 若数值异常优先检查adaptive_normalization_forward是否使用了改写后的torch.log1p(spect) 13.86294形式这是针对 RKNN fp16 上限65504的必要处理。平台不匹配RKNN 模型与目标平台绑定--target-platform必须与最终运行的板卡芯片一致rk3562/rk3566/rk3568/rk3576/rk3588且必须处于白名单内。板端环境test-on-rk3588-board.py只能在板卡上运行rknn_toolkit_lite2与开发机上的rknn-toolkit2是两个不同的包不要混用。元数据完整性不要手动删除 ONNX/RKNN 模型中的自定义元数据否则 sherpa-onnx 加载时会因model_type、sample_rate、version、h_shape、c_shape校验失败而报错。量化当前脚本默认不量化do_quantizationFalse如需进一步压缩模型或提升推理速度可在理解精度影响的前提下自行开启量化实验。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价