MNN 端侧语音推理框架 sherpa-mnn:语音能力全景、模型体系与 ONNX 转换实战

发布时间:2026/9/15 3:21:17
MNN 端侧语音推理框架 sherpa-mnn:语音能力全景、模型体系与 ONNX 转换实战 MNN 端侧语音推理框架 sherpa-mnn语音能力全景、模型体系与 ONNX 转换实战【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN导读本文围绕 sherpa-mnn基于新一代 Kaldi 生态的 sherpa-onnx 改造而来、将 onnxruntime 调用全部替换为 MNN 的端侧语音推理框架展开系统梳理其语音能力矩阵、平台与编程语言 API 支持范围、流式/非流式 ASR 预训练模型体系并结合仓库源码与构建脚本给出从 ONNX 模型到 MNN 模型的转换、编译与本地运行测试的完整实操方案。读完本文你将掌握sherpa-mnn 究竟能本地运行哪些语音任务、每种任务对应的源码模块与 API 示例在哪里、以及如何把一个 Zipformer/Whisper/SenseVoice 等 ONNX 模型量化转换后跑在 MNN 推理引擎上。说明本文主体骨架来自仓库内 README_ONNX.md能力与模型清单总览并结合 主 README 的构建流程与sherpa-mnn/csrc源码实现相互印证原文中指向外部站点的链接按规范以文字描述呈现仓库内部文件均以仓库根目录为起点的相对路径给出。一、sherpa-mnn 是什么onnxruntime 到 MNN 的一次完整替换按 主 README 的说明sherpa-mnn 是基于 sherpa-onnx 改造的工程核心动作是把其中对 onnxruntime 的调用全部替换为 MNN从而把新一代 Kaldi 社区积累的语音推理能力迁移到阿里巴巴开源的 MNN 推理引擎之上。这意味着它继承了 sherpa-onnx 庞大的功能面但底层推理统一走 MNN支持 CPU 与各移动端后端这也解释了为什么它可以直接消费由 MNN 的MNNConvert工具从 ONNX FP32 模型转换而来的.mnn模型在开启MNN_LOW_MEMORY编译的 MNN 库上运行经权重量化如 8bit、按 64 块量化的模型以降低模型体积与运行内存以同一套 C/C/Python/Java/Kotlin 等 API 覆盖从 Android/iOS 到 Linux/Windows 的全平台。从仓库源码结构可以印证这一改造的广度sherpa-mnn/csrc 下数百个.cc/.h文件几乎覆盖了原 sherpa-onnx 的全部功能模块ASR、TTS、VAD、KWS、说话人相关、音频打标、标点、语音增强等而推理封装统一收敛在 MNNUtils.cc 与 MNNUtils.hpp 中。二、语音能力矩阵11 类任务本地离线运行README_ONNX.md 首先给出的是功能支持矩阵以下四个表格为原文完整内容均表示本地locally运行、不依赖云端语音识别Speech recognition语音合成Speech synthesis✔️✔️说话人识别Speaker identification说话人分离Speaker diarization说话人验证Speaker verification✔️✔️✔️口语语种识别Spoken Language identification音频打标Audio tagging语音活动检测Voice activity detection✔️✔️✔️关键词唤醒Keyword spotting标点添加Add punctuation语音增强Speech enhancement✔️✔️✔️2.1 源码层面的逐项印证能力矩阵并非宣传口号在sherpa-mnn/csrc中每一项都有对应的实现文件与 API 示例可以从源码结构得到印证语音识别流式 非流式流式入口为 online-recognizer.cc非流式入口为 offline-recognizer.cc模型侧覆盖 Transducer、CTC、Paraformer、Whisper、SenseVoice、Moonshine、NeMo、TeleSpeech 等见 offline-whisper-model.cc、offline-sense-voice-model.cc、online-paraformer-model.cc 等。语音合成 TTS入口为 offline-tts.cc底层实现分 VITS、Matcha、Kokoro 三种offline-tts-vits-impl.h、offline-tts-matcha-impl.h、offline-tts-kokoro-impl.h并配有 HiFi-GAN 声码器hifigan-vocoder.cc。说话人分离 / 分割见 offline-speaker-diarization.cc 与 offline-speaker-segmentation-pyannote-model.cc。说话人识别python 示例 speaker-identification.py 与 speaker-identification-with-vad.py 给出了独立使用和与 VAD 串联使用的两种范式。语种识别见 spoken-language-identification.cc含基于 Whisper 的实现 spoken-language-identification-whisper-impl.h。音频打标见 audio-tagging.cc支持 CED 与 Zipformer 两种模型后端audio-tagging-ced-impl.h、offline-zipformer-audio-tagging-model.cc。VAD对应 vad-microphone.py、vad-remove-non-speech-segments.py 等示例常与 ASR 串联构成VAD 识别管线。关键词唤醒 KWS见 keyword-spotter.cc示例覆盖缓冲 Token 与热词两种模式kws-cxx-api.cc。标点添加在线/离线两套实现online-punctuation.cc、offline-punctuation.cc。语音增强GTCRN 降噪模型offline-speech-denoiser-gtcrn-model.cc。2.2 可本地运行的目标形态README_ONNX.md 的 Introduction 部分进一步列出了这些能力可覆盖的平台与操作系统清单同样继承如下指令集x86、x86_64、32-bit ARM、64-bit ARMarm64 / aarch64、RISC-Vriscv64桌面/服务器 OSLinux、macOS、Windows、openKylin移动/穿戴Android、WearOS、iOS新形态HarmonyOS、NodeJS、WebAssembly嵌入式与开发板NVIDIA Jetson Orin NX、NVIDIA Jetson Nano B01、Raspberry Pi、RV1126、LicheePi4A、VisionFive 2、旭日X3派、爱芯派 等从平台支持矩阵可以看到各架构的完整分布继承原文架构AndroidiOSWindowsmacOSLinuxHarmonyOSx64✔️✔️✔️✔️✔️x86✔️✔️arm64✔️✔️✔️✔️✔️✔️arm32✔️✔️✔️riscv64✔️在仓库中可以找到与上述平台对应的构建脚本与工具链Android 侧有 project/android/build_64.sh 等构建 MNN 的脚本iOS 侧有 project/ios 工程与 package_scripts/ios/buildiOS.shHarmonyOS 侧有 project/harmony/build_64.shsherpa-mnn 自身的跨平台工具链配置位于 apps/frameworks/sherpa-mnn/toolchains。三、编程语言 API 矩阵12 种语言 WebAssemblyREADME_ONNX.md 给出的语言支持矩阵继承原文三个表格1. C2. C3. Python4. JavaScript✔️✔️✔️✔️5. Java6. C#7. Kotlin8. Swift✔️✔️✔️✔️9. Go10. Dart11. Rust12. Pascal✔️✔️✔️✔️原文同时说明Rust 支持通过社区封装的 sherpa-rs 项目提供此外还支持WebAssembly浏览器内运行。这些 API 在仓库中都有对应的落地目录可以逐一对照C / CC 示例见 cxx-api-examples含流式 Zipformer、Whisper、SenseVoice、Moonshine、Fire-Red-ASR、KWS、TTS 等 12 个示例C 示例见 c-api-examples30 个.c文件覆盖解码、流式识别、热词、VADASR 组合等。Python见 python-api-examples既有一行式离线解码如 offline-decode-files.py也有麦克风实时识别speech-recognition-from-microphone.py还提供 WebSocket 服务端streaming_server.py、offline-websocket-server.cc与 HTTP 服务http_server.py。Kotlin / Java / JNIKotlin 示例见 kotlin-api-examplesJNI 层实现位于 sherpa-mnn/jniPython 绑定位于 sherpa-mnn/python。Swift / C# / Go / Dart / JavaScript / PascalREADME_ONNX.md 明确支持且说明 FlutterDart应用与 LazarusObject Pascal应用均有预编译产物发布详见下文预编译产物一节Swift 侧可通过build-swift-macos.sh产出sherpa-mnn.xcframework供 iOS/macOS 调用。四、模型体系从流式 ASR 到非流式 ASR 的预训练模型清单4.1 按任务分类的预训练模型入口README_ONNX.md 按任务给出了预训练模型的获取入口原文以表格列出此处转为文字清单链接不再展开为外部 URL可到官方文档与 Release 页面检索对应关键字语音识别ASRsherpa-onnx 的 asr-models 发布包语音合成TTStts-models 发布包VADsilero-vad 的 ONNX 模型关键词唤醒kws-models 发布包音频打标audio-tagging-models 发布包说话人识别speaker-recognition-models 发布包口语语种识别可直接使用多语种 Whisper ASR 模型标点添加punctuation-models 发布包说话人分割speaker-segmentation-models 发布包语音增强speech-enhancement-models 发布包4.2 流式 ASR 预训练模型部分README_ONNX.md 明确说明下表仅列出部分流式模型更多可在官方文档的 online-transducer / online-paraformer / online-ctc 三个页面查阅。继承原文清单模型名支持语言说明sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20中文、英文双语 Zipformer Transducersherpa-onnx-streaming-zipformer-small-bilingual-zh-en-2023-02-16中文、英文小模型适合低算力设备sherpa-onnx-streaming-zipformer-zh-14M-2023-02-23中文适合 Cortex A7 CPUsherpa-onnx-streaming-zipformer-en-20M-2023-02-17英文适合 Cortex A7 CPUsherpa-onnx-streaming-zipformer-korean-2024-06-16韩语韩语流式识别sherpa-onnx-streaming-zipformer-fr-2023-04-14法语法语流式识别流式streaming识别意味着边录音边出结果仓库中对应的端到端示例是 streaming-zipformer-cxx-api.cc 与 streaming-zipformer-rtf-cxx-api.cc后者用于测实时率 RTF以及 Python 侧的 online-decode-files.py 与两遍识别Two-pass示例 two-pass-speech-recognition-from-microphone.py。4.3 非流式离线ASR 预训练模型部分同样仅列出部分模型更多可在官方文档的 offline-transducer / offline-paraformer / offline-ctc / telespeech / whisper 页面查阅。继承原文清单模型名支持语言说明Whisper tiny.en英文轻量英文离线识别Moonshine tiny英文轻量英文离线识别int8sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17中文、粤语、英文、韩语、日文支持多种中文方言sherpa-onnx-paraformer-zh-2024-03-09中文、英文也支持多种中文方言sherpa-onnx-zipformer-ja-reazonspeech-2024-08-01日文基于 ReazonSpeech 语料sherpa-onnx-nemo-transducer-giga-am-russian-2024-10-24俄语NeMo Transducersherpa-onnx-nemo-ctc-giga-am-russian-2024-10-24俄语NeMo CTCsherpa-onnx-zipformer-ru-2024-09-18俄语Zipformer Transducersherpa-onnx-zipformer-korean-2024-06-24韩语韩语离线识别sherpa-onnx-zipformer-thai-2024-06-20泰语泰语离线识别sherpa-onnx-telespeech-ctc-int8-zh-2024-06-04中文支持多种方言int8 量化从源码结构看上述每类模型在csrc中都有对应的模型封装类例如 SenseVoice 对应 offline-sense-voice-model.cc、Paraformer 对应 offline-paraformer-model.cc、Whisper 对应 offline-whisper-model.cc、NeMo 系列对应 offline-nemo-enc-dec-ctc-model.cc 与 offline-transducer-nemo-model.ccTeleSpeech 对应 offline-telespeech-ctc-model.cc。Python 示例也一一对应如 offline-sense-voice-ctc-decode-files.py、offline-whisper-decode-files.py、offline-moonshine-decode-files.py。五、开箱即用的体验途径在线 Demo 与预编译产物README_ONNX.md 为不想编译、只想体验的用户提供了三条路径原文以链接表格给出此处转为文字说明在线 Web DemoHuggingface Spaces无需安装任何东西只用浏览器即可体验说话人分离、语音识别含 Whisper、语音合成、字幕生成、音频打标、基于 Whisper 的语种识别等。另外还有一批基于WebAssembly构建的 Spaces在 Huggingface 与 ModelScope 双平台发布覆盖silero-vad 的 VAD 演示中英 Zipformer / Paraformer 的实时识别含粤语版 Paraformer-large英文 Zipformer 实时识别SenseVoice中英韩日粤的 VAD识别Whisper tiny.en、Moonshine tiny 的 VAD识别基于 GigaSpeech / WenetSpeech / ReazonSpeech / GigaSpeech2 语料训练的 Zipformer 识别英/中/日/泰中文方言 TeleSpeech-ASRParaformer-large / small 的中英及方言识别Piper 英文与德文 TTS以及说话人分离。预编译 Android APK提供说话人分离、流式语音识别、TTS、VAD、VAD非流式识别、两遍识别、音频打标含 WearOS 版、说话人识别、语种识别、关键词唤醒等 11 款 APK中国用户另有国内下载地址。预编译 Flutter / Lazarus 应用Flutter 应用覆盖实时语音识别Android与 TTSAndroid 的 arm64-v8a / armeabi-v7a / x86_64、Linux x64、macOS x64 / arm64、Windows x64iOS 需从源码构建LazarusObject Pascal应用提供字幕生成功能。六、核心实战ONNX 模型转 MNN 本地编译运行能力矩阵再大落地到 MNN 引擎都需要完成ONNX → MNN 模型转换与sherpa-mnn 编译两步。以下命令全部继承自 主 README可直接照做。6.1 编译 MNN开启低内存与量化支持下载 MNN 源码后编译时必须额外加上-DMNN_SEP_BUILDOFF与-DCMAKE_INSTALL_PREFIX.建议同时开启MNN_LOW_MEMORYON配合量化模型可显著降低运行内存并提升性能与MNN_BUILD_CONVERTERON产出 MNNConvertmkdir build cd build cmake .. -DMNN_LOW_MEMORYON -DMNN_SEP_BUILDOFF -DCMAKE_INSTALL_PREFIX. -DMNN_BUILD_CONVERTERON make -j4 make install前提与限制MNN_LOW_MEMORY对模型权重布局有要求因此第 6.2 节转换模型时应量化后再转换且不要直接转换 int8 的 ONNX 模型应使用 FP32 的 ONNX 模型做权重量化避免精度与内存收益受损。6.2 用 MNNConvert 将 ONNX 模型量化为 MNN 模型在编译好 MNNConvert 的目录即上文的 build 目录下以下面这组 Zipformer 流式模型encoder / decoder / joiner 三段式为例把下载好的 ONNX FP32 模型逐个转换。--weightQuantBits8 --weightQuantBlock64表示按 8bit 权重、量化块大小 64 进行量化可降低模型大小并在MNN_LOW_MEMORY下降低运行内存、提升运行性能mkdir sherpa-mnn-models ./MNNConvert -f ONNX --modelFile sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.onnx --MNNModel sherpa-mnn-models/encode.mnn --weightQuantBits8 --weightQuantBlock64 ./MNNConvert -f ONNX --modelFile sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx --MNNModel sherpa-mnn-models/decode.mnn --weightQuantBits8 --weightQuantBlock64 ./MNNConvert -f ONNX --modelFile sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.onnx --MNNModel sherpa-mnn-models/joiner.mnn --weightQuantBits8 --weightQuantBlock646.3 编译 sherpa-mnn回到 sherpa-mnn 根目录即 apps/frameworks/sherpa-mnn执行 CMake 构建MNN_LIB_DIR指向第 6.1 步的 MNN 编译目录mkdir build cmake .. -DMNN_LIB_DIR/path/to/MNN/build # 按自己的编译目录修改 make -j166.4 运行测试与输出解读以sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20模型为例运行命令行工具对一段 wav 做流式识别./build/bin/sherpa-mnn --tokens./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt \ --encoder./sherpa-mnn-models/encode.mnn \ --decoder./sherpa-mnn-models/decode.mnn \ --joiner./sherpa-mnn-models/joiner.mnn \ ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/test_wavs/1.wav正常输出包含实时率RTF统计与结构化 JSON 识别结果例如Number of threads: 1, Elapsed seconds: 0.27, Audio duration (s): 5.1, Real time factor (RTF) 0.27/5.1 0.053 这是第一种第二种叫与 ALWAYS ALWAYS什么意思 { text: ..., tokens: [这, 是, ..., ALWAYS, ALWAYS, ...], timestamps: [0.96, 1.04, ...], ys_probs: [...], lm_probs: [], context_scores: [], segment: 0, words: [], start_time: 0.00, is_final: false}解读Real time factor (RTF)是衡量端侧性能的关键指标小于 1 表示识别快于音频时长JSON 结果中的tokens是逐 token 解码结果、timestamps是各 token 的时间戳、ys_probs是解码得分、is_final标记是否为流式末尾帧——这些字段与 hypothesis.cc 等解码器输出结构一一对应。6.5 移动端编译Android / iOS / macOSAndroid先编译 MNN 的 Android 库进入 MNN 的project/android目录执行../build_64.sh -DMNN_LOW_MEMORYON -DCMAKE_INSTALL_PREFIX.后make install然后修改 sherpa-mnn 的build-android-arm64-v8a.sh脚本把MNN_LIB_DIR改为上述编译目录后执行。若产出的 so 较大可用 Android NDK 自带的 strip 工具瘦身。iOS修改build-ios.sh将MNN_LIB_DIR指向 MNN 根目录保证能找到头文件即可然后export MNN_LIB_DIR/path/to/MNN sh build-ios.sh产出build-ios/sherpa-mnn.xcframework。macOS framework过程与 iOS 类似修改build-swift-macos.sh的MNN_LIB_DIR后运行产出build-swift-macos/sherpa-mnn.xcframework/。七、生态中的集成案例README_ONNX.md 列举了若干基于 sherpa-onnx/sherpa-mnn 能力的第三方项目此处仅保留事实描述不附外部链接Open-LLM-VTuber通过免提语音交互、语音打断与 Live2D 形象在本地跨平台运行和任意 LLM 对话。voiceapi基于 FastAPI 展示流式 ASR 与 TTS Python API 的用法。TMSpeech腾讯会议摸鱼工具用 C# 实现带图形界面的流式 ASR常被用于实时字幕场景。lol 互动助手基于 Electron 使用 sherpa-onnx 的 JavaScript API。Sherpa-ONNX 语音识别服务器基于 Node.js 提供语音识别 RESTful API 的服务端。QSmartAssistant模块化、全程可离线、低占用率的对话机器人/智能音箱同时使用 ASR 与 TTS。Flutter-EasySpeechRecognition在流式 ASR 的 Flutter 示例基础上扩展为应用内下载模型减小安装包体积。sherpa-onnx-unity把 sherpa-onnx 集成进 Unity 引擎。这些案例从侧面印证了能力矩阵中流式 ASR、TTS、JavaScript/C#/Dart API等在真实产品中的落地方式。八、小结与进一步阅读以 README_ONNX.md 为总览、以 主 README 为构建手册、以 csrc 为实现证据可以得出 sherpa-mnn 的完整技术画像一套把新一代 Kaldi 语音生态完整迁移到 MNN 推理引擎的端侧语音工具包本地支持 ASR流式/非流式、TTS、说话人识别/分离/验证、语种识别、音频打标、VAD、KWS、标点、语音增强共 11 类任务覆盖 5 种指令集与 8 类操作系统/平台提供 12 种编程语言 API 与 WebAssembly 支持。后续可以继续深入的方向逐模型阅读 csrc 中某个具体模型的配置解析如 offline-transducer-model-config.cc理解 encoder/decoder/joiner 各段如何被 MNN 调度对照 python-api-examples 把 VAD ASR TTS 串成完整的端到端离线语音助手在 Jetson、RISC-V 开发板或 HarmonyOS 上复现 6.5 节的交叉编译流程验证能力矩阵中的平台覆盖。【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考