ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

rknn_model_zoo 实战:在 Rockchip NPU 上部署 OpenAI Whisper 语音识别(RKNN 转换、Python/C++ Demo 全流程)

rknn_model_zoo 实战:在 Rockchip NPU 上部署 OpenAI Whisper 语音识别(RKNN 转换、Python/C++ Demo 全流程) 示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载导读本文以 rknn_model_zoo 仓库中的 examples/whisper/README.md 为主线完整讲解如何将 OpenAI 的开源语音识别模型 Whisperencoder decoder 结构从 ONNX 转换为 RKNN 模型并在 RK3562、RK3566、RK3568、RK3576、RK3588、RV1126B 等 Rockchip NPU 平台上运行。读完本文你将掌握 Whisper 的 20 秒/30 秒输入模型导出、RKNN 模型转换参数、Python 端到端推理脚本用法以及 Android/Linux 上 C Demo 的编译、推送与运行方法。1. 示例背景Whisper 是什么Whisper 是 OpenAI 发布的一个通用语音识别ASR模型基于大规模多语种音频数据集训练而成同时具备多语种语音识别、语音翻译、语种识别等多种能力。本示例使用的模型源自 OpenAI 官方 whisper 开源项目。在 rknn_model_zoo 中Whisper 示例采用经典的Encoder-Decoder 双模型结构将 Whisper 拆分为两个独立的 ONNX 子模型再分别转换为 RKNNwhisper_encoder_base_20s.onnx编码器负责把 20 秒音频对应的 log-mel 频谱特征编码为高层语义特征whisper_decoder_base_20s.onnx解码器负责基于编码输出与 token 序列逐字自回归地生成识别文本。仓库中该示例的完整目录结构如下examples/whisper/ ├── cpp/ # C 端rknpu2 推理实现 预处理/后处理 ├── model/ # 模型下载脚本、mel 滤波器、词表与测试音频 ├── python/ # convert.py / export_onnx.py / whisper.py ├── README.md # 本文主体文档 └── export_onnx.md # ONNX 导出指南2. 当前支持平台本示例支持的 NPU 平台包括RK3562、RK3566、RK3568、RK3576、RK3588、RV1126B。在后续所有转换与运行命令中TARGET_PLATFORM均需从上述平台中选择。3. 预训练模型获取3.1 直接下载已导出的 ONNX 模型示例默认提供base规模、20 秒输入长度的预导出 ONNX 模型whisper_encoder_base_20s.onnxwhisper_decoder_base_20s.onnx在 examples/whisper/model/download_model.sh 中可以看到下载方式进入 model 目录执行脚本即可cd model ./download_model.sh脚本本质是两条wget命令分别下载 encoder 与 decoder 两个 ONNX 文件到当前目录。3.2 自行导出 ONNX 模型详见 export_onnx.md若需要使用不同模型规模tiny/base/medium或不同输入时长请参考仓库内的 examples/whisper/export_onnx.md 指南自行导出。3.2.1 导出 20 秒输入长度的模型第一步安装与 OpenAI 官方版本对齐的依赖并修改安装包源码需安装openai-whisper20231117pip install openai-whisper20231117 # 1. 修改 whisper/audio.py例如 ~/python3.8/site-packages/whisper/audio.py中的 CHUNK_LENGTH CHUNK_LENGTH 30 -- CHUNK_LENGTH 20 # 2. 修改 whisper/model.py 中的 positional_embedding 相关代码 assert x.shape[1:] self.positional_embedding.shape, incorrect audio shape -- # assert x.shape[1:] self.positional_embedding.shape, incorrect audio shape x (x self.positional_embedding).to(x.dtype) -- x (x self.positional_embedding[-x.shape[1]:,:]).to(x.dtype)第二步执行导出脚本cd python python export_onnx.py --model_type MODEL_TYPE --n_mels N_MELS(optional) # 例如 python export_onnx.py --model_type base --n_mels 80参数说明MODEL_TYPE指定模型规模如tiny、base、mediumN_MELS可选指定 mel 滤波器数量如80、128默认80。注意small与large规模的模型当前尚不支持导出。3.2.2 导出原始 30 秒输入长度的模型若不修改源码保持默认CHUNK_LENGTH 30直接运行导出脚本即可得到 30 秒输入的模型pip install openai-whisper20231117 cd python python export_onnx.py --model_type MODEL_TYPE --n_mels N_MELS(optional)从 examples/whisper/python/export_onnx.py 的源码可以看到导出流程先whisper.load_model(model_type)加载官方模型再用torch.onnx.export分别导出 encoder输入名x输出名out与 decoder输入名tokens、audio输出名outopset 固定为 12最后通过onnxsim.simplify对两个模型做简化产物分别保存为../model/whisper_encoder_{type}.onnx与../model/whisper_decoder_{type}.onnx。4. 转换为 RKNN 模型4.1 转换命令进入python目录使用 examples/whisper/python/convert.py 将 ONNX 模型转换为 RKNN 模型cd python python convert.py onnx_model TARGET_PLATFORM dtype(optional) output_rknn_path(optional) # 例如 python convert.py ../model/whisper_encoder_base_20s.onnx rk3588 # 输出模型将保存在 ../model/whisper_encoder_base_20s.rknn python convert.py ../model/whisper_decoder_base_20s.onnx rk3588 # 输出模型将保存在 ../model/whisper_decoder_base_20s.rknn4.2 参数说明onnx_model指定 ONNX 模型路径TARGET_PLATFORM指定 NPU 平台名称可选范围见第 2 节支持平台列表dtype可选取值为i8或fp。i8表示执行 INT8 量化fp表示不量化浮点默认fpoutput_rknn_path可选指定 RKNN 模型保存路径默认保存在与 ONNX 模型相同的目录源码中即model_path.replace(.onnx, .rknn)。4.3 转换流程的源码级解析从 convert.py 可以看到转换的完整调用链RKNN(verboseFalse)创建工具对象 →rknn.config(target_platformplatform)配置目标平台 →rknn.load_onnx(modelmodel_path)加载 ONNX →rknn.build(do_quantizationdo_quant)构建 RKNN 模型do_quant由 dtype 是否为i8/u8决定→rknn.export_rknn(output_path)导出 →rknn.release()释放资源。整个过程与 rknn-toolkit2 的标准工作流一致。值得说明的是虽然 README 的 dtype 说明只写了i8/fp但 convert.py 的参数校验同时接受u8与i8一样触发量化使用时应以实际源码为准。由于 Whisper 为生成式模型示例默认关闭量化DEFAULT_QUANT False以保证识别精度浮点模型对 NPU 显存与带宽的占用也更大部署时需结合板卡资源评估。5. Python Demo 推理5.1 用法在python目录下运行 examples/whisper/python/whisper.pycd python # 使用 ONNX 模型推理CPU python whisper.py --encoder_model_path onnx_model --decoder_model_path onnx_model --task TASK --audio_path AUDIO_PATH # 例如 python whisper.py --encoder_model_path ../model/whisper_encoder_base_20s.onnx --decoder_model_path ../model/whisper_decoder_base_20s.onnx --task en --audio_path ../model/test_en.wav # 使用 RKNN 模型推理NPU python whisper.py --encoder_model_path rknn_model --decoder_model_path rknn_model --task TASK --audio_path AUDIO_PATH --target TARGET_PLATFORM # 例如 python whisper.py --encoder_model_path ../model/whisper_encoder_base_20s.rknn --decoder_model_path ../model/whisper_decoder_base_20s.rknn --task en --audio_path ../model/test_en.wav --target rk35885.2 参数说明TARGET_PLATFORM指定 NPU 平台名称范围见支持平台列表命令行默认值为rk3588onnx_model / rknn_model指定模型路径脚本会根据文件后缀.rknn或.onnx自动选择推理后端TASK指定识别任务如en英语识别、zh中文识别。目前仅支持这两种其他取值会打印提示并退出AUDIO_PATH指定音频文件路径。5.3 推理流程的源码级解析whisper.py 的核心处理链路如下音频读取与预处理soundfile读取音频后ensure_channels将多声道转为单声道对通道取均值ensure_sample_rate用scipy.signal.resample将任意采样率统一重采样到 16000 Hzlog-mel 频谱计算log_mel_spectrogram使用torch.stftN_FFT400、HOP_LENGTH160、hann 窗计算短时傅里叶变换再与 examples/whisper/model/mel_80_filters.txt 中的 80 维 mel 滤波器做矩阵乘法最后做log10归一化clamp 到 1e-10裁剪到最大值减 8再平移缩放到 (0,1) 区间填充/裁剪pad_or_trim将 mel 特征统一对齐到N_MELS × MAX_LENGTH20 秒 × 100 帧超出部分截断、不足部分补零Encoder 推理run_encoder根据模型类型调用rknn.inference或onnxruntime.runDecoder 自回归解码run_decoder以[sot, task_code, no_timestamps, ...]作为起始 token 序列如50258为 sot、50259/50260分别为 en/zh 任务码、50364为 timestamp 起点、50257为 eot 结束符循环调用_decode取out_decoder[0, -1].argmax()得到下一个 token对照 examples/whisper/model/vocab_en.txt 或 examples/whisper/model/vocab_zh.txt 词表拼出文本直到命中结束符为止中文任务task_code50260还需要对结果做 base64 解码base64_decode才能得到可读汉字资源释放release_model对 RKNN 模型调用release()对 ONNX 会话直接del。6. Android Demo6.1 编译构建回到 rknn_model_zoo 根目录设置 Android NDK 路径后调用仓库顶层的构建脚本# 回到 rknn_model_zoo 根目录 cd ../../ export ANDROID_NDK_PATHandroid_ndk_path ./build-android.sh -t TARGET_PLATFORM -a ARCH -d whisper # 例如 ./build-android.sh -t rk3588 -a arm64-v8a -d whisper参数说明android_ndk_path指定 Android NDK 路径TARGET_PLATFORM指定 NPU 平台名称见支持平台列表ARCH指定设备系统架构可通过以下命令查询# 查询架构日志中应显示 [arm64-v8a 或 armeabi-v7a] adb shell cat /proc/version6.2 推送 demo 文件到设备设备通过 USB 连接后将构建产物推送到设备adb root adb remount adb push install/TARGET_PLATFORM_android_ARCH/rknn_whisper_demo/ /data/6.3 运行 demoadb shell cd /data/rknn_whisper_demo export LD_LIBRARY_PATH./lib ./rknn_whisper_demo model/whisper_encoder_base_20s.rknn model/whisper_decoder_base_20s.rknn en model/test_en.wav程序接收 5 个命令行参数encoder_path decoder_path task audio_path第 0 个为可执行文件名本身对应上面的 encoder 模型、decoder 模型、任务类型en/zh与音频路径。7. Linux DemoLinux 编译工具链推荐使用gcc-linaro-6.3.1(aarch64)/gcc-arm-8.3(armhf)/armhf-uclibcgnueabihf(armhf for RV1106/RV1103 系列)。使用其他版本可能遇到 C demo 编译失败的问题。详细的编译环境搭建请参考 docs/Compilation_Environment_Setup_Guide.md。7.1 编译构建# 回到 rknn_model_zoo 根目录 cd ../../ # 若编译时找不到 GCC_COMPILER请手动设置其路径 (可选) export GCC_COMPILERGCC_COMPILER_PATH ./build-linux.sh -t TARGET_PLATFORM -a ARCH -d whisper # 例如 ./build-linux.sh -t rk3588 -a aarch64 -d whisper参数说明GCC_COMPILER_PATHGCC_COMPILER 路径TARGET_PLATFORMNPU 平台名称见支持平台列表ARCH设备系统架构查询方式# 查询架构对于 Linux日志中应显示 [aarch64 或 armhf] adb shell cat /proc/version7.2 推送 demo 文件到设备若设备通过 USB 连接直接推送adb push install/TARGET_PLATFORM_linux_ARCH/rknn_whisper_demo/ /data/对于其他开发板使用scp或其他方式将install/TARGET_PLATFORM_linux_ARCH/rknn_whisper_demo/下的所有文件拷贝到设备/data目录。7.3 运行 demoadb shell cd /data/rknn_whisper_demo export LD_LIBRARY_PATH./lib ./rknn_whisper_demo model/whisper_encoder_base_20s.rknn model/whisper_decoder_base_20s.rknn en model/test_en.wav8. C 端实现原理源码级解析C demo 的主体在 examples/whisper/cpp/main.cc 与 examples/whisper/cpp/process.cc 中整体流程与 Python 版一一对应音频读取read_audio读取音频双声道时convert_channels转单声道采样率非 16000 时resample_audio重采样相关工具函数位于 utils/audio_utils.c预加载资源read_mel_filters读取 examples/whisper/model/mel_80_filters.txtread_vocab按index token格式解析词表模型初始化init_whisper_model依次对 encoder、decoder 调用rknn_init、rknn_query(RKNN_QUERY_IN_OUT_NUM)、rknn_query(RKNN_QUERY_INPUT_ATTR / OUTPUT_ATTR)并打印各张量的维度、格式、类型与量化参数见 examples/whisper/cpp/rknpu2/whisper.cc音频预处理audio_preprocess用 Hann 窗 FFTW3 计算 STFT再与 mel 滤波器做矩阵乘法ENABLE_NEON开启时使用 ARM NEON 指令集加速否则回退到 OpenCVgemm最后clamp_and_log_max做与 Python 版一致的 log 归一化推理与解码inference_whisper_model在 NPU 上执行 encoder 推理随后以自回归方式逐 token 执行 decoder 推理argmax选取最大概率 token按词表拼接文本中文任务同样做 base64 解码性能统计程序结束时会打印Real Time Factor (RTF)即推理耗时与音频时长的比值音频时长按CHUNK_LENGTH20 秒封顶用于评估实时性见 main.cc。8.1 关键宏定义更换模型时必须同步修改examples/whisper/cpp/process.h 中集中定义了与模型强耦合的常量更换模型规模或输入长度时必须同步调整#define VOCAB_NUM 51865 #define MAX_TOKENS 12 #define SAMPLE_RATE 16000 #define N_FFT 400 #define HOP_LENGTH 160 #define CHUNK_LENGTH 20 #define MAX_AUDIO_LENGTH CHUNK_LENGTH * SAMPLE_RATE // 20 秒 × 16000 #define N_MELS 80 #define MELS_FILTERS_SIZE 201 // N_FFT / 2 1 #define ENCODER_INPUT_SIZE CHUNK_LENGTH * 100 #define ENCODER_OUTPUT_SIZE CHUNK_LENGTH * 50 * 512 // 384/512/1024 分别对应 tiny/base/medium #define DECODER_INPUT_SIZE ENCODER_OUTPUT_SIZE根据 export_onnx.md 中的 Special NotesCHUNK_LENGTH需根据模型的输入时长20 秒或 30 秒修改Python 版whisper.py中的CHUNK_LENGTH同理ENCODER_OUTPUT_SIZE需根据模型规模修改tiny/base/medium分别对应384/512/1024。9. 预期结果运行 demo 后程序会打印识别出的文本。英文任务TASK_FOR_EN与中文任务TASK_FOR_ZH的参考输出如下# TASK_FOR_EN Whisper output: Mr. Quilter is the apostle of the middle classes, and we are glad to welcome his gospel. # TASK_FOR_ZH Whisper output: 对我做了介绍,我想说的是大家如果对我的研究感兴趣注意不同平台、不同版本的工具链与驱动可能导致结果略有差异。10. 常见问题与注意事项模型与代码常量不匹配无论是 Python 还是 C demoCHUNK_LENGTH输入时长与ENCODER_OUTPUT_SIZE模型规模对应的编码维度必须与实际导出的 ONNX/RKNN 模型一致否则推理会失败或输出错误结果量化精度风险示例默认以浮点fp方式转换。若希望压缩模型体积、提升 NPU 推理速度而使用i8量化需自行评估识别精度下降是否可接受中文解码依赖 base64中文识别的原始输出是 base64 编码的文本Python 与 C demo 均已内置base64_decode处理直接使用示例代码即可音频要求demo 会自动处理采样率与声道数但为保证识别效果建议输入清晰、无背景噪音的 16 kHz 单声道语音。11. 总结通过本文可以完整走通一条 Whisper 在 Rockchip NPU 上的部署链路从官方 whisper 模型导出 20 秒/30 秒 ONNX 子模型encoder/decoder经 rknn-toolkit2 的config → load_onnx → build → export_rknn转换为 RKNN 模型再到 Python 端到端推理、Android/Linux 上的 C Demo 编译运行。核心要点是理解 Whisper 的编码器-解码器结构在 NPU 上的拆分方式以及输入时长、模型规模与代码常量的对齐关系。仓库内 examples/whisper/README.md 与 examples/whisper/export_onnx.md 是后续查阅的一手资料源码 examples/whisper/python/whisper.py 与 examples/whisper/cpp/process.cc 则是调试与二次开发的最佳参考。赞分享示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载相关推荐RKNN 部署 PP-YOLOE 全流程实战指南模型导出、量化转换与 C/Python 双端 Demorknn_model_zooRKNN 部署 PP YOLOE 全流程实战指南模型导出、量化转换与 C/Python 双端 Demorknn_model_zoo PP YOLOE 是百示例工程人工智能嵌入式边缘计算计算机视觉模型优化rknn_model_zoo 实战YOLOv5 实例分割模型在 RKNN 平台的转换与部署全流程rknn_model_zoo 实战YOLOv5 实例分割模型在 RKNN 平台的转换与部署全流程 导读 本文以 rknn_model_zoo 仓库中的 exa示例工程人工智能嵌入式边缘计算计算机视觉模型优化PaddleSeg 在 Rockchip RKNPU2 上的 FastDeploy 部署实战模型转换、C/Python 推理全流程PaddleSeg 在 Rockchip RKNPU2 上的 FastDeploy 部署实战模型转换、C/Python 推理全流程 本文基于 Paddle人工智能计算机视觉预训练上一篇AI NovelGenerator如何用AI创作完整的长篇小说下一篇如何理解Revit软件授权机制与开源替代方案的技术实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表