sherpa-mnn 版本演进与技术图谱:从 0.0.1 到 1.10.46 的端侧语音推理框架全景解析
【免费下载链接】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
本篇文章以仓库 CHANGELOG.md 为主线,系统梳理 sherpa-mnn 从最初发布到 1.10.46 的完整演进历程:它是什么、为何诞生、每一版带来了哪些模型能力与多语言 API、工程化与跨平台支持如何一步步成熟。读完本文,你将掌握 sherpa-mnn 的能力版图、版本选型依据,以及结合 MNN 源码与构建脚本进行本地编译、模型转换与端侧部署的完整实战路径。
一、项目定位:把 sherpa-onnx 的推理引擎替换为 MNN
sherpa-mnn 是 MNN 仓库中内置的一套完整端侧语音框架(位于 apps/frameworks/sherpa-mnn)。按照 README.md 的说明:"本工程基于 sherpa-onnx 改造而得,将 onnxruntime 的调用全部替换为 MNN"。
这意味着它继承了 sherpa-onnx 庞大的语音生态(流式/非流式 ASR、VAD、关键词唤醒、TTS、说话人识别/分离、音频打标、标点恢复、逆文本正则化等),但把底层的 ONNX Runtime 换成了 MNN 推理引擎,从而能够复用 MNN 的轻量、低内存、跨端能力,为端侧 LLM 之外的语音场景提供统一推理入口。从源码结构看,核心 C++ 运行时位于 sherpa-mnn/csrc,并通过 C API、Python、Kotlin、JNI 等多语言绑定对外暴露。
版本号方面,CMakeLists.txt 中声明SHERPA_MNN_VERSION "1.10.46",并明确注释"发布时请同步更新./CHANGELOG.md",因此这份 CHANGELOG 是版本选型、能力检索与升级评估的一手依据。需要注意的是,其中部分条目(尤其涉及 onnxruntime 版本号、CUDA 的条目)继承自上游发布记录,与仓库中保留的SHERPA_MNN_ENABLE_GPU、SHERPA_MNN_LINUX_ARM64_GPU_ONNXRUNTIME_VERSION等兼容开关相关,落地时需结合构建配置甄别。
二、版本演进时间线:三大发展阶段
CHANGELOG 从0.0.1(Initial release)一路记录到1.10.46,跨度可以清晰划分为三个阶段。
阶段一:地基期(0.0.1 → 1.10.12):打通链路、修稳底座
这一阶段解决的是"能不能用"的问题,重点在构建、打包与基础功能:
| 版本 | 关键变更 | 解读 |
|---|---|---|
| 0.0.1 | Initial release | 首个可用版本 |
| 0.0.2 | 支持指定 lib 路径 | 打通第三方库定位 |
| 0.0.3 | 修复 Windows 路径分隔符 | 跨平台可用性起步 |
| 1.9.29 | 通过 CI 发布 | 引入自动化发布 |
| 1.9.30 | 新增 TTS | 语音合成能力落地 |
| 1.10.0 | 新增逆文本正则化(ITN) | 数字/日期等文本规范化 |
| 1.10.1 | 支持停止 TTS 生成 | 合成控制能力 |
| 1.10.2 | 修复 C# 字符串传递到 C++ | 跨语言边界修复 |
| 1.10.7 / 1.10.11 | Flutter 支持 Android / iOS | 移动跨端框架接入 |
| 1.10.8 / 1.10.9 | 修复发布包(lib 目录、piper-phonemize 缺失) | 打包规范化 |
| 1.10.10 | 将 sherpa-onnx 构建为单一共享库 | 部署形态收敛 |
| 1.10.12 | 为 VAD 增加 Flush 以检出最后一段语音 | VAD 边界语义完善 |
阶段二:模型生态与多语言 API 爆发期(1.10.13 → 1.10.31)
这一阶段"能力"快速膨胀,典型特征有三个:
1. 模型家族急剧扩张:Whisper large v3(1.10.14)、SenseVoice CTC 模型(1.10.17)、MeloTTS 中英模型(1.10.16)、ReazonSpeech 日语预训练模型(1.10.21)、GigaAM 俄语 CTC/Transducer(1.10.29)、Moonshine 系列(1.10.30)、NeMo Parakeet 与 Pyannote 说话人分割(1.10.28)、字节级 BPE(bbpe)解码支持(1.10.36)等相继加入。
2. 说话人能力从零到全:1.10.28 是"说话人大版本"——导出 Pyannote 分割模型、支持凝聚层次聚类(Agglomerative clustering)、并一次性补齐 C++/C/Python/Go/Swift/C#/JavaScript/Kotlin/Java/Dart/Pascal/Android JNI 全语言 API 与 Android demo;1.10.29 继续补充 reverb-diarization-v1 模型与"VAD + 非流式 ASR"的说话人识别示例。
3. 多语言 API 全面铺开:Dart(1.10.20 起音频打标与标点)、Pascal(1.10.22 起流式/非流式 ASR、VAD、wave 读取)、Go(1.10.25 起标点、1.10.26 VAD 最长语音时长、1.10.29 离线标点)、.NET/C# 升级到 .NET 8(1.10.38)等。与此同时,预构建产物体系建立:Python 3.13 wheels(1.10.31)、macOS xcframework(1.10.31)、Linux aarch64 预编译 JNI 库(1.10.30)、带 CUDA 的 Linux aarch64 wheels(1.10.31)、Android APK 两遍解码包(1.10.31)等。
阶段三:HarmonyOS 与新一代 TTS 时代(1.10.32 → 1.10.46)
HarmonyOS 支持是一条完整主线:从 1.10.32 支持交叉编译、VAD 支持,到 1.10.33 补齐非流式/流式 ASR、发布sherpa_onnx.har、VAD+ASR 与麦克风 demo、TTS 支持与端侧 demo,再到 1.10.34 加入说话人识别、分离 API 与 demo,1.10.42 加入关键词唤醒 C API 与 ArkTS API,形成了一个从库到示例的完整鸿蒙语音方案。
TTS 代际更新是另一条主线:1.10.38 起 Matcha-TTS 全语言 API 铺开;1.10.40 导出 Kokoro TTS 并补齐 C++/C/C#/Swift/Go/Dart/Pascal/JavaScript(node-addon 与 wasm)/Kotlin/Java API;1.10.42 升级到 Kokoro 1.0 多语言模型并新增 Android、iOS、HarmonyOS、Flutter 全套 demo;1.10.43 增加 MFC 示例并支持缩放 TTS 停顿时长;1.10.44 导出 MatchaTTS fa-en 模型、支持 espeak-ng 指定 Kokoro 音色。
最新版本 1.10.45 / 1.10.46 的收尾工作集中在:FireRedASR AED 模型的导出与 C++/Python/Kotlin/Java/C/CXX/JavaScript(node-addon 与 wasm)/C#/Swift/Dart/Go/Pascal 全语言 API(1.10.45);以及 Kokoro 中文词表生成修复、SenseVoice 说话人识别示例、JNI 异常处理、Whisper token 归一化、Go 的 AddPunct panic 修复、export_bpe_vocab.py的 UnicodeEncodeError、Linux/macOS/Windows 预构建库发布修复、RK NPU 上流式 zipformer ASR 的 C++ API 与 RKNN Linux aarch64 wheels(1.10.46)。
三、能力版图:CHANGELOG 中的功能全景
把 CHANGELOG 按能力域重新组织,可以得到 sherpa-mnn 的功能全景:
3.1 语音识别(ASR)
- 流式(在线):Zipformer 系列(transducer、zipformer2-ctc)、流式 Paraformer、流式 CTC + HLG 解码(1.10.21 起有
streaming-hlg-decode-file示例),1.10.25 重新实现了在线 transducer 的 LM rescore。 - 非流式(离线):Zipformer、Paraformer、Whisper(含 large v3、whisper turbo、token 归一化修复)、SenseVoice CTC(支持 lang/emotion/event 输出)、Moonshine、FireRedASR AED、NeMo CTC/Transducer、TeleSpeech CTC、GigaAM、ReazonSpeech、字节级 BPE(bbpe)模型等。
- 解码选项:从 offline-recognizer.h 可见,离线识别支持
greedy_search解码、max_active_paths、热词(hotwords_file/hotwords_score)、blank_penalty、FST 规则(rule_fsts/rule_fars)等配置;1.10.44 起OfflineRecognizer支持在创建 stream 时直接传入热词。
3.2 语音活动检测(VAD)
基于 Silero VAD 的完整链路:1.10.12 加入Flush以检出尾部语音段;1.10.26 支持指定最大语音时长(并补齐多语言 API);1.10.38 修复generate-subtitles.py中 VAD 尾部 padding 问题;配套有vad-with-non-streaming-asr、vad-sense-voice、vad-whisper、vad-moonshine等组合示例(见 c-api-examples 目录)。
3.3 关键词唤醒(KWS)
流式 transducer 关键词检测(buffered tokens/hotwords 支持,1.10.24/1.10.25 支持从内存缓冲直接加载 tokens 与热词)、1.10.41 修复关键词点检问题、1.10.42 增加 HarmonyOS C API 与 ArkTS API、1.10.46 新增麦克风示例提升兼容性。
3.4 语音合成(TTS)
覆盖 VITS、Matcha-TTS、Kokoro、MeloTTS 四代架构。以 VITS 配置为例,offline-tts-vits-model-config.cc 注册了--vits-model、--vits-lexicon、--vits-tokens、--vits-data-dir(piper-phonemize/espeak-ng 数据目录,给出后忽略 lexicon)、--vits-dict-dir(中文 jieba 词典目录)、--vits-noise-scale(默认 0.667)、--vits-noise-scale-w(默认 0.8)、--vits-length-scale(默认 1,越大语速越慢)等参数,并在Validate()中对模型、tokens、data_dir 的 phontab/phonindex/phondata/intonations、dict_dir 的五个 jieba 词表文件逐一做存在性校验。
3.5 说话人相关
识别(identification)、验证(verification)、分离(diarization,支持 Pyannote 分割 + 凝聚层次聚类)、嵌入提取(embedding);1.10.28 起全语言 API 覆盖,1.10.29 支持 reverb 分离模型、1.10.46 修复 SenseVoice 场景下speaker-identification-with-vad-non-streaming-asr示例。
3.6 其他能力
音频打标(audio tagging,CED/zipformer)、标点恢复(offline/online punctuation,1.10.20 起含 Dart/Go/Swift/Flutter 支持)、逆文本正则化(ITN,1.10.0)、语音增强(GTCRN 降噪,1.10.21 起)、语种识别(spoken language identification)、字幕生成(generate-subtitles.py)、流式/非流式 WebSocket 服务器与多语言客户端(1.10.21/1.10.33 起兼容新旧 websocket 请求头)。
四、多语言 API 与跨平台矩阵
CHANGELOG 最醒目的特征之一是**"一个模型、全语言 API"**的发布模式(如 1.10.30 Moonshine、1.10.40/1.10.42 Kokoro、1.10.45 FireRedASR 均在单一版本内补齐所有绑定)。汇总如下:
| API / 平台 | 代表能力出现版本 | 仓库位置 |
|---|---|---|
| C API | 持续扩展,1.10.19 起统一SherpaOnnx*前缀 | c-api-examples(30+ 个 .c 示例)、c-api.h |
| C++ API | 1.10.29 流式/非流式、1.10.37 Matcha-TTS、1.10.46 RK NPU zipformer | cxx-api-examples |
| Python | 1.10.25 在线标点绑定;示例最全 | python-api-examples(50+ 脚本) |
| Kotlin / Java | 1.10.23 起持续优化,1.10.35 起使用sherpa-onnx.aar | kotlin-api-examples |
| Go | 1.10.21 起说话人、1.10.29 标点、1.10.30 Moonshine,含 AddPunct panic 修复 | sherpa-mnn 多语言绑定目录 |
| Swift | SenseVoice 结果、在线标点、Kokoro TTS 等 | — |
| Dart | 1.10.20 起音频打标/标点,Whisper UTF-8 修复 | — |
| C# / .NET | 1.10.2 起字符串传递修复,1.10.38 升级 .NET 8 | — |
| Object Pascal / Lazarus | 1.10.22 起流式/非流式/VAD/wave 读取,1.10.23 TTS | — |
| JavaScript | node-addon 与 WebAssembly 双通道,1.10.27 起 UTF-8 字符串传递 | — |
| Flutter | 1.10.7 Android、1.10.11 iOS、Config toJson/fromJson(1.10.46) | — |
| HarmonyOS | 1.10.32 起,含 ArkTS API(1.10.42) | — |
平台侧同样覆盖全面:Linux / Windows(含 arm64 静态构建)、macOS(xcframework)、iOS、Android(AAR/JNI/APK)、HarmonyOS(har)、WebAssembly、嵌入式 Linux(ALSA 麦克风)与 RK NPU。
五、构建与发布工程化演进
5.1 发布产物体系
CHANGELOG 记录了一条从"裸库"到"全平台预构建产物"的演进链:0.0.2 支持指定 lib 路径 → 1.9.29 接入 CI → 1.10.8/1.10.9 修复打包结构(lib 目录、piper-phonemize)→ 1.10.10 收敛为单一共享库 → 1.10.31 起 Python 3.13 wheels / macOS xcframework / GPU 版 Linux aarch64 wheels → 1.10.35 提供sherpa-onnx.aar→ 1.10.33 发布sherpa_onnx.har→ 1.10.36 支持 Android 静态链接 onnxruntime → 1.10.46 修复 Windows/Linux/macOS 预构建库发布。
5.2 CMake 构建开关
CMakeLists.txt 中可裁剪的开关包括:SHERPA_MNN_ENABLE_PYTHON、SHERPA_MNN_ENABLE_TESTS、SHERPA_MNN_ENABLE_PORTAUDIO、SHERPA_MNN_ENABLE_JNI、SHERPA_MNN_ENABLE_C_API、SHERPA_MNN_ENABLE_WEBSOCKET、SHERPA_MNN_ENABLE_GPU、SHERPA_MNN_ENABLE_DIRECTML、SHERPA_MNN_ENABLE_WASM及细分的 WASM TTS/ASR/KWS/VAD/VAD_ASR/NODEJS、SHERPA_MNN_ENABLE_BINARY、SHERPA_MNN_ENABLE_TTS、SHERPA_MNN_ENABLE_SPEAKER_DIARIZATION、SHERPA_MNN_ENABLE_RKNN等,且存在联动约束(如开 WASM 需先开总开关、TTS 依赖 espeak-ng/piper-phonemize/cppjieba,见 cmake 目录)。从 1.10.39 的"修复无 TTS 时的构建"可以看出,可裁剪性本身也是持续维护的重点。
5.3 跨语言边界的修复经验
CHANGELOG 中大量修复条目集中在语言边界,构成了可复用的工程经验:
- 字符串传递:C#→C++(1.10.2、1.10.39)、JavaScript→C++ UTF-8(1.10.27)、Windows gb2312 编码(1.10.43)、识别结果含
"导致 JSON 转换失败(1.10.18)、export_bpe_vocab.py的 UnicodeEncodeError(1.10.46)。 - 数值与格式:RTF 计算 typo(1.10.45)、Go
[1<<28]在 GOARCH=386 下过大改为[1<<10](1.10.46)、Kokoro 中文词表生成(1.10.46)。 - 并发与生命周期:Go 实例创建成功但 C 结构创建失败(1.10.45)、Go AddPunct panic(1.10.46)、JNI 异常处理(1.10.46)、VAD+ASR 中 secondPass 卸载到后台线程(1.10.36)、VAD Flush(1.10.12)。
六、实战:把 CHANGELOG 落到 MNN 工程
CHANGELOG 之外,README.md 给出了完整的上手链路,配合 MNN 源码即可复现。
6.1 编译 MNN(前提条件)
在 MNN 仓库编译时额外加上-DMNN_SEP_BUILD=OFF与-DCMAKE_INSTALL_PREFIX=.,并建议开启MNN_LOW_MEMORY与MNN_BUILD_CONVERTER(后者用于生成 MNNConvert):
mkdir build cd build cmake .. -DMNN_LOW_MEMORY=ON -DMNN_SEP_BUILD=OFF -DCMAKE_INSTALL_PREFIX=. -DMNN_BUILD_CONVERTER=ON make -j4 make install6.2 模型转换与量化
使用上一步生成的MNNConvert把 ONNX FP32 模型逐个转为.mnn。README 明确建议:转换时量化(--weightQuantBits=8 --weightQuantBlock=64)可降低模型大小,并在MNN_LOW_MEMORY开启时降低运行内存、提升性能;但不要直接转换 int8 的 ONNX 模型。以流式 zipformer 中英双语模型为例:
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 --weightQuantBits=8 --weightQuantBlock=64 ./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 --weightQuantBits=8 --weightQuantBlock=64 ./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 --weightQuantBits=8 --weightQuantBlock=646.3 本地编译与运行
MNN_LIB_DIR指向上述 MNN 编译目录(需能找到 MNN 头文件与库):
mkdir build cmake .. -DMNN_LIB_DIR=/path/to/MNN/build make -j16运行测试(encoder/decoder/joiner 与 tokens 依次传入):
./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 格式的识别结果(text、tokens、timestamps、ys_probs、segment 等字段)。流式模型的 encoder/decoder/joiner 三段式拆分同样反映在源码层:如 offline-transducer-model-config.h 中encoder_filename、decoder_filename、joiner_filename三个字段,c-api.h 中的SherpaMnnOnlineTransducerModelConfig亦然。
6.4 Android / iOS / macOS 构建
- Android:先在 MNN 的 project/android 下执行
../build_64.sh -DMNN_LOW_MEMORY=ON -DMNN_SEP_BUILD_OFF -DCMAKE_INSTALL_PREFIX=.并make install,再修改 sherpa-mnn 的 Android 构建脚本中的MNN_LIB_DIR后执行;so 体积偏大可用 NDK strip 精简。 - iOS:修改
build-ios.sh的MNN_LIB_DIR为 MNN 根目录后sh build-ios.sh,产出build-ios/sherpa-mnn.xcframework。 - macOS framework:流程类似,运行
build-swift-macos.sh产出build-swift-macos/sherpa-mnn.xcframework/。
6.5 源码结构导读
- 核心 C++ 运行时sherpa-mnn/csrc:features(kaldi 特征)、各模型 impl(offline-recognizer--impl、offline-tts--impl、keyword-spotter、offline-speaker-diarization 等)、配置结构体(*-config.h 配合
ParseOptions注册命令行参数)、以及 MNNUtils.hpp 中基于MNN::Express的张量创建、输入输出名获取、帧切片等工具函数——这是 onnxruntime 被替换为 MNN 的关键适配层。 - 多语言绑定:C/C++ API 位于 sherpa-mnn/c-api,另有 sherpa-mnn/jni、sherpa-mnn/kotlin-api、sherpa-mnn/python(58 个 .cc 绑定源)。
- 示例与脚本:c-api-examples、cxx-api-examples、python-api-examples、kotlin-api-examples,以及 test_tts_batch.sh 等验证脚本。
- 交叉编译工具链:toolchains 提供 aarch64-linux-gnu、arm-linux-gnueabihf、riscv64-linux-gnu、iOS 四套 toolchain。
七、结语:用 CHANGELOG 指导版本选型
sherpa-mnn 的 CHANGELOG 记录了 0.0.1 → 1.10.46 的完整演进,是能力检索与版本决策的最佳入口:需要完整语音生态与最新模型(Kokoro 1.0、FireRedASR、HarmonyOS、RK NPU)可选 1.10.45/1.10.46;关注构建稳定性与预构建产物可回溯 1.10.8-1.10.10、1.10.31、1.10.35、1.10.46 等发布修复节点;按需裁剪则对应SHERPA_MNN_ENABLE_*系列开关。结合本仓库 README 的编译链路与 csrc 的源码实现,即可将这份演进史转化为可落地的端侧语音部署方案。
【免费下载链接】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),仅供参考