
示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载本文是 rknn_model_zoo 仓库中 examples/whisper/export_onnx.md 的完整技术指南系统讲解如何在 RKNN 开发流程中导出 OpenAI Whisper 语音识别模型的 ONNX 权重既包括将默认 30 秒输入长度改为 20 秒的关键源码修改也包括保持原始 30 秒长度的标准导出流程以及导出后 Python/C 两套 Demo 中必须同步修改的参数。读完本文你可以独立完成 whispertiny/base/medium三种模型 encoder/decoder 的 ONNX 导出、onnxsim 精简与后续 RKNN 转换部署。一、为什么需要单独导出 Whisper 的 ONNX 模型Whisper 是 OpenAI 开源的通用语音识别模型支持多语种语音识别、语音翻译与语种识别。在 rknn_model_zoo 的 Whisper 示例 中整个识别流程被拆分为两个可独立推理的 ONNX 模型encoder编码器将音频的 log-mel 频谱特征编码为语义向量导出脚本中其输入名为x输出名为outdecoder解码器接收 token 序列与 encoder 输出向量自回归地生成识别文本导出脚本中其输入名为tokens与audio输出名为out。导出工具位于 examples/whisper/python/export_onnx.py其核心逻辑是加载 OpenAI 官方 whisper 权重后分别对model.encoder与model.decoder调用torch.onnx.export并统一采用opset_version12最后用onnxsim对两个模型做常量折叠与图精简确保导出的 ONNX 更干净、更适合后续 RKNN 工具链解析。需要特别说明的是仓库官方脚本当前仅支持tiny、base、medium三种模型规格small与large暂不支持这是导出前需要确认的前提。二、环境准备安装指定版本的 openai-whisper导出脚本依赖 OpenAI 官方 Python 包仓库固定使用 2023-11-17 版本pip install openai-whisper20231117安装后whisper 的源码会落在 site-packages 中例如~/python3.8/site-packages/whisper/后续对audio.py与model.py的修改都在这个安装路径下进行。导出的 ONNX 模型默认保存到examples/whisper/model/目录命名规则为whisper_encoder_{MODEL_TYPE}.onnx与whisper_decoder_{MODEL_TYPE}.onnx。三、导出 20 秒输入长度的 ONNX 模型默认的 whisper 模型按 30 秒音频输入设计CHUNK_LENGTH 30而本示例的 RKNN Demo 默认按 20 秒处理因此需要先修改官方源码再执行导出脚本。3.1 修改官方源码第一步修改whisper/audio.py中的CHUNK_LENGTH在安装包路径如~/python3.8/site-packages/whisper/audio.py中找到音频分块长度定义CHUNK_LENGTH 30 # 修改为 CHUNK_LENGTH 20该常量决定了 log-mel 频谱的输入长度是模型输入尺寸的根基导出时生成数据、后续 Demo 的前处理都必须与它保持一致。第二步修改whisper/model.py中的位置编码逻辑model.py中原本对输入形状与位置编码形状做严格断言并把整张位置编码加到x上。改为 20 秒后输入序列变短需要放宽断言并改用切片索引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)self.positional_embedding[-x.shape[1]:, :]表示按当前输入的实际序列长度截取位置编码的后半段从而兼容任意短于完整长度的输入序列。3.2 执行导出命令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、mediumsmall/large暂不支持--n_mels否指定梅尔滤波器数量如80、128默认80从 export_onnx.py 源码可以看到导出前的数据生成流程为以sample_rate 16000生成1 × 40 × 16000的随机音频 → 经whisper.pad_or_trim裁剪/补齐 →whisper.log_mel_spectrogram(audio, n_melsn_mels)得到 mel 特征 → 送入model.encoder得到encoder_output同时以max_tokens 12生成随机 token 序列x_tokens作为 decoder 的输入。随后依次导出encodertorch.onnx.export(model.encoder, (x_mel), ..., input_names[x], output_names[out], opset_version12)decodertorch.onnx.export(model.decoder, (x_tokens, encoder_output), ..., input_names[tokens, audio], output_names[out], opset_version12)导出完成后脚本会对两个模型分别执行onnxsim.simplify并重新保存并打印保存路径。四、导出原始 30 秒输入长度的 ONNX 模型如果希望保持 whisper 原始的 30 秒输入设计例如与官方推理流程对齐则无需修改任何官方源码直接执行导出命令即可pip install openai-whisper20231117 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参数含义与上一节完全一致。注意这里默认的CHUNK_LENGTH仍为 30模型输入为 30 秒对应的特征尺寸后续 Python/C Demo 中的CHUNK_LENGTH也必须相应设为 30否则前处理与模型输入尺寸不匹配。五、导出后的关键参数与源码对应关系导出 ONNX 只是第一步真正决定推理正确性的是 Demo 侧一系列与输入长度、模型维度强相关的宏/常量。它们分散在 Python 与 C 两套实现中且与 export_onnx.py 导出的模型必须严格对齐。5.1 Python Demo 中的对齐参数在 examples/whisper/python/whisper.py 顶部定义了一组核心常量SAMPLE_RATE 16000 N_FFT 400 HOP_LENGTH 160 CHUNK_LENGTH 20 # 需与模型输入长度一致 N_SAMPLES CHUNK_LENGTH * SAMPLE_RATE MAX_LENGTH CHUNK_LENGTH * 100 N_MELS 80其中MAX_LENGTH CHUNK_LENGTH * 100 2000对应 log-mel 频谱的时间帧数即CHUNK_LENGTH / HOP_LENGTH * SAMPLE_RATE ≈ 20 / 160 * 16000 2000N_MELS 80对应频谱的梅尔维度。mel_filters()函数从 mel_80_filters.txt 读取80 × 201的梅尔滤波器矩阵其中 201 等于N_FFT / 2 1且源码中有assert n_mels in {80}即当前 Python Demo 只支持 n_mels80若导出时使用了 128需要相应适配滤波器文件。5.2 C Demo 中的对齐参数在 examples/whisper/cpp/process.h 中定义了 C 侧的宏其中两项在文档“Special Notes”中被明确要求按模型修改#define CHUNK_LENGTH 20 // 需与模型输入长度一致 #define ENCODER_OUTPUT_SIZE CHUNK_LENGTH * 50 * 512 // 384/512/1024 分别对应 tiny/base/mediumCHUNK_LENGTH音频分块长度必须与导出的模型输入长度一致20 秒模型配 2030 秒模型配 30ENCODER_OUTPUT_SIZEencoder 输出向量的总元素数其公式为CHUNK_LENGTH * 50 * d_model。d_model 为 transformer 隐藏维度tiny/base/medium分别对应384/512/1024即 base 模型为20 * 50 * 512 512000换成 medium 需改为20 * 50 * 1024。同一文件中还定义了MAX_AUDIO_LENGTH CHUNK_LENGTH * SAMPLE_RATE、ENCODER_INPUT_SIZE CHUNK_LENGTH * 100、N_MELS 80、MELS_FILTERS_SIZE 201、MAX_TOKENS 12、VOCAB_NUM 51865等共同约束着前处理与解码循环。5.3 解码循环与 token 常量在 C 的 process.cc 与 Python 的whisper.py中解码采用自回归方式从sot50258开始拼接任务 tokenen 为 50259、zh 为 50260与timestamp_begin50364后反复推理直至输出endoftext50257。中文字符在词表中以 base64 编码存放因此 C 侧实现了base64_decodePython 侧同样有对应的解码函数——这些逻辑与导出的 decoder 输入输出完全对应。六、从 ONNX 到 RKNN转换与 Demo 验证6.1 获取/转换模型仓库提供了官方转换脚本 examples/whisper/python/convert.pycd python python convert.py onnx_model TARGET_PLATFORM dtype(optional) output_rknn_path(optional) # 例如 python convert.py ../model/whisper_encoder_base_20s.onnx rk3588 python convert.py ../model/whisper_decoder_base_20s.onnx rk3588onnx_model导出的 ONNX 模型路径TARGET_PLATFORMNPU 平台名支持rk3562、rk3566、rk3568、rk3576、rk3588、rv1126bdtype(可选)i8/u8表示量化fp表示不量化默认fpoutput_rknn_path(可选)RKNN 模型保存路径默认与 ONNX 同目录。若想跳过手动导出仓库 model/download_model.sh 直接提供了 base 20 秒模型的 ONNX 下载脚本cd model ./download_model.sh6.2 运行 Python Demo 验证cd python # 使用 ONNX 模型推理 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 模型推理需指定目标平台 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 rk3588--task支持en英文识别与zh中文识别--target指定 NPU 平台--audio_path指向测试音频仓库自带 test_en.wav 与 test_zh.wav。运行后输出形如# 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: 对我做了介绍,我想说的是大家如果对我的研究感兴趣不同平台、工具与驱动版本下结果可能略有差异。C Demo 的编译、推板与运行步骤build-android.sh/build-linux.sh、./rknn_whisper_demo encoder.rknn decoder.rknn task audio可参见 examples/whisper/README.md。七、常见问题与排查要点导出后模型无法在 Demo 上跑通优先核对三处CHUNK_LENGTH官方audio.py、Pythonwhisper.py、Cprocess.h是否一致20 秒模型三处都应等于 20换了模型规格如 base → mediumC 侧ENCODER_OUTPUT_SIZE必须同步从512维改为1024维否则 decoder 输入尺寸不匹配n_mels非默认值当前 Python Demo 的mel_filters()有assert n_mels in {80}限制使用其他梅尔数导出时需同步替换 mel_80_filters.txt 并放开断言量化失败如需部署到 RKNN 上做i8量化可在convert.py中传入i8Whisper 属于较重的 Transformer 模型量化精度受平台与工具版本影响建议以实际识别结果为准模型规格限制small/large未被官方导出脚本覆盖如需使用需自行扩展export_onnx.py的导出逻辑。八、总结本指南完整覆盖了 export_onnx.md 的全部内容20 秒模型的官方源码两处修改audio.py的CHUNK_LENGTH与model.py的位置编码切片、30 秒模型的一键导出、--model_type与--n_mels参数说明以及导出后 Python/C Demo 中CHUNK_LENGTH与ENCODER_OUTPUT_SIZE的强制对齐要求。在此基础上结合 export_onnx.py、convert.py、whisper.py 与 process.h 等仓库源码进一步揭示了 encoder/decoder 的输入输出命名、opset 版本、onnxsim 精简、梅尔滤波器矩阵以及解码 token 常量等底层细节帮助你从“能导出”走向“能对齐、能部署、能排错”。赞分享示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载相关推荐rknn_model_zoo 的 PP-LiteSeg Paddle 转 ONNX 全流程指南从 PaddleSeg 模型导出到 RKNN NPU 部署rknn_model_zoo 的 PP LiteSeg Paddle 转 ONNX 全流程指南从 PaddleSeg 模型导出到 RKNN NPU 部署 导读示例工程人工智能嵌入式边缘计算计算机视觉模型优化sherpa-onnx Whisper 模型 RKNN 导出与 RK3588 板端部署实战sherpa onnx Whisper 模型 RKNN 导出与 RK3588 板端部署实战 本文基于 sherpa onnx 仓库中 scripts/whisp人工智能语音音频本地部署rknn_model_zoo 实战PP-OCRv4 识别模型从 Paddle 到 ONNX 的转换与 RKNN 部署指南rknn_model_zoo 实战PP OCRv4 识别模型从 Paddle 到 ONNX 的转换与 RKNN 部署指南 本文面向在 Rockchip RKN示例工程人工智能嵌入式边缘计算计算机视觉模型优化上一篇Analog测试策略Vitest、Storybook、Playwright全方位指南下一篇如何快速配置6款苹果平方字体跨平台字体统一终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考