RK3566 流式语音识别部署:sherpa-onnx 跑通 RKNN NPU 的完整实战指南
【免费下载链接】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 为例,带你走通在 RK3566 开发板上运行流式语音识别模型的完整流程:从源码编译、RKNN 模型转换,到板端实时识别调参。读完即可在开发板上得到一条可用的离线识别链路。
为什么小跑板上做语音识别这么麻烦
在 RK3566 上做免提交互,云端 ASR 延迟高、必须联网,纯 CPU 跑大型识别模型又慢又吃内存,4GB 内存经常捉襟见肘。sherpa-onnx 走的是本地路线:基于 ONNX Runtime(微软开源的模型推理引擎,可把训练好的模型转换后在任意设备上运行)做推理,断网也能完成流式语音识别、语音合成、说话人分离、语音增强,并支持 C/C++/Python/Go/Rust 等 12 种语言,以及 RK NPU 硬件加速。
项目能力清单:本地语音工具集
一句话定位:sherpa-onnx 是一个完全在本地运行的语音工具集,覆盖"识别、合成、分离、增强"全链路,专为嵌入式和多平台设计。
核心能力:
- 流式与离线语音识别(ASR),可做实时字幕
- 文本转语音(TTS)
- 说话人识别与说话人分离
- 语音增强、音源分离
- 语音活动检测(VAD,即自动剪掉录音中的人声空白段)
代码组织上,跨语言绑定与示例分布在 sherpa-onnx/csrc/(C++ 核心)及各语言 examples 目录,构建开关集中在 CMakeLists.txt。
最小可行路径:四步拿到第一个识别结果
第一步:获取源码
git clone https://gitcode.com/GitHub_Trending/sh/sherpa-onnx cd sherpa-onnx克隆仓库并进入项目根目录。
第二步:先装好 RKNN 工具链,再启用 NPU 编译
按板端厂商说明安装 RKNN 工具链(本方案验证可用 2.2.0 版本),然后把它的库目录通过环境变量交给 CMake:
export SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR=/path/to/rknn-toolkit2/lib mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=ON -DSHERPA_ONNX_ENABLE_RKNN=ON make -j$(nproc)SHERPA_ONNX_ENABLE_RKNN打开 NPU 支持,SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR告诉构建系统 rknnrt 运行时库在哪,否则链接阶段会失败。
第三步:把 ONNX 模型转成 RKNN 格式
RKNN NPU 只认自家格式。以流式 zipformer 为例,用 RKNN 工具链把 encoder、decoder、joiner 三个子模型逐个转换(导出脚本可参考 scripts/whisper/rknn/README.md 的写法):
python3 export_rknn.py --target-platform rk3566 \ --in-model encoder.onnx --out-model encoder.rknn每个子模型各跑一次,得到三个 .rknn 文件和一份 tokens.txt(发音单位与词表的映射表)。
第四步:板端运行
./build/bin/sherpa-onnx --provider=rknn \ --encoder=encoder.rknn --decoder=decoder.rknn --joiner=joiner.rknn \ --tokens=tokens.txt --num-threads=4 --chunk-size=16程序启动后进入麦克风实时识别,说出中文或英文即会打印文字。
机制拆解:流式识别与 NPU 是怎么配合的
打个比方:流式识别像记者会的现场同传。译员不等整场讲完才翻译,而是每几秒钟听一小段就译一小段,同时"记住"前几句的上下文,保证句子衔接通顺。模型侧对应的是 encoder 按时间分块(chunk)处理音频、并用缓存保存历史状态;这也正是流式模型内存占用低于离线模型的原因。
RKNN NPU 则像工厂里的一条专用流水线:ONNX 模型转换后从通用 CPU 搬上这条流水线执行张量计算,CPU 腾出手来收音频、管线程调度。sherpa-onnx 的 NPU 适配层在 sherpa-onnx/csrc/rknn/,包含流式 transducer 解码器和若干离线模型实现。
关键参数说明
| 参数 | 示例值 | 作用(白话解释) |
|---|---|---|
--provider | rknn | 指定用 NPU 推理,而不是 CPU |
--num-threads | 4 | 推理线程数,与 RK3566 四核对齐 |
--chunk-size | 16 | 每次喂给模型的音频块大小,越小延迟越低、开销略增 |
| 采样率 | 16000 | 模型要求的音频刻度,wav 不一致会导致识别异常 |
流式与离线模型在 RKNN 上的差异
| 维度 | 流式 zipformer | 离线模型(paraformer、sense-voice 等) |
|---|---|---|
| RKNN 适配 | 完整适配,支持实时 | 有适配实现,但内存占用更高 |
| 输入方式 | 音频流分块送入 | 整段 wav 一次送入 |
| 典型场景 | 免提交互、实时字幕 | 录音转写、批量处理 |
示例参考数据
以下为 RK3566(四核 A55,4GB)+ 中英双语 zipformer 的参考量级,实际随模型大小与量化设置浮动:
| 指标 | 数值 |
|---|---|
| 模型加载时间 | 约 1.2 s |
| 首次推理延迟 | 约 0.8 s |
| 持续识别延迟 | 约 0.15 s |
| 峰值内存 | 约 180 MB |
| CPU 利用率 | 约 75%(4 核平均) |
| RTF(实时因子,低于 1 即快于实时) | 约 0.35 |
⚠️ 避坑实录:RKNN 部署的三个高频问题
问题一:换了 RKNN 版本结果全不同
- 现象:2.1.0 报 "Meet unsupported input dtype for gather";2.3.2 直接段错误,gdb 显示崩溃点在运行时内部
rknn_run。 - 原因:运行时库与已转换模型的算子/数据类型格式不匹配,属于运行时层面的兼容性问题,不是你的代码错。
- 解法:锁死 2.2.0 版本,转换模型与板端运行时用同一版本。
问题二:编译时找不到 rknn 头文件或链接库
- 现象:cmake 或 make 阶段报 rknn 头文件缺失、找不到
rknnrt。 - 原因:CMake 默认从环境变量
SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR找运行时库,没设置就找不到。 - 解法:cmake 前先 export 该变量指向工具链的 lib 目录(见最小可行路径第二步)。
问题三:程序不报错,但识别结果为空
- 现象:运行正常,屏幕上却迟迟不出文字。
- 原因:多为两点——wav 采样率不是 16k;或
--provider=rknn却喂了未转换的 .onnx 文件。 - 解法:确认音频为 16000Hz 单声道,且三个子模型均已转成 .rknn 再运行。
收尾:结论与行动清单
结论:RK3566 + sherpa-onnx + RKNN 2.2.0 + 流式 zipformer,是一条能落地、能实时的板端语音识别路线。
行动清单:
- 装好 RKNN 2.2.0 工具链,export 工具库目录后,用
SHERPA_ONNX_ENABLE_RKNN=ON编译 sherpa-onnx。 - 从项目发布的 asr-models 页下载流式双语 zipformer,将 encoder/decoder/joiner 转成 .rknn。
- 先用测试 wav 验证离线解码正确,再接入麦克风流,微调
--chunk-size与线程数到延迟与功耗的平衡点。
【免费下载链接】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),仅供参考