sherpa-onnx 离线语音识别实战指南:从设备端到树莓派与 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
会议室断网,语音助手瞬间"失聪";出差到无信号的车间,转写 App 一片空白。这些场景的共同点是没有云。sherpa-onnx 是把离线语音识别、文字转语音、说话人识别等一整套能力搬到设备本地的推理框架,基于 ONNX Runtime 运行,无需联网。
项目定位:一句话讲清它是什么
sherpa-onnx 是一个跨平台语音推理框架,解决的核心问题是:在断网、弱网或隐私敏感的设备上,本地完成语音相关任务。它用 C++ 写核心,通过 ONNX Runtime 做推理,因此同一个模型文件可以在手机、开发板、服务器之间迁移。你不需要为每种设备单独训练模型,只需要下载一份模型,再选对应的运行后端即可。当前主版本为 1.13.8,功能覆盖识别、合成、增强、声源分离与检测五大类。
能力清单:按你要做的事来分
与其按技术栈罗列,不如按"你拿它干什么"来分。四类典型任务,每类都能独立启用。
语音转文字(识别)
分两种形态:流式(边说边出结果,适合实时字幕)和非流式(整段音频一次转写,精度更高,适合文件处理)。支持的模型家族包括 Zipformer、Paraformer、Whisper、SenseVoice、Moonshine、NeMo 等,覆盖中英日韩及多种中文方言。
文字转语音(合成)
支持 Piper、VITS、Matcha、Kokoro、Kitten 等 TTS 引擎,可从文本生成 wav 音频,也支持指定说话人 ID 与语速。
同一套 Flutter 代码在 Ubuntu 桌面完成中文文本转语音,全程本地推理。
音频理解与检测
- VAD(语音活动检测):用 silero-vad 切出"有人说话"的片段,是识别链路的前置。
- 说话人识别 / 分离 / 验证:判断"是谁在说",或把多人对话拆开。
- 语种识别:判断输入是哪种语言。
- 关键词 spotting:本地唤醒词检测,不依赖云。
音频处理
- 语音增强:GTcrn、DPDFNet 模型降噪。
- 声源分离:spleeter、UVR 把人声与背景分离。
- 标点恢复:给转写结果补标点。
上手路径:先跑起来,再谈原理
最快的验证路径是 Python 包。不需要编译,装包后直接调 API。
pip install sherpa-onnx python3 python-api-examples/offline-decode-files.py \ --tokens ./tokens.txt --paraformer ./paraformer.onnx test.wav这段命令说明一件事:识别的最小闭环只有三步——装包、指定模型文件、丢一个音频。仓库自带的python-api-examples/里每类任务都有一个可运行脚本,照着对应脚本填模型路径即可。
用代码直接控制时,非流式识别长这样:
import sherpa_onnx recognizer = sherpa_onnx.OfflineRecognizer.from_sense_voice( model="./model.int8.onnx", tokens="./tokens.txt", num_threads=2, ) stream = recognizer.create_stream() stream.accept_waveform(16000, samples) recognizer.decode_stream(stream) print(stream.result)这段代码说明 sherpa-onnx 的统一调用范式:建识别器 → 建流 → 喂音频 → 解码 → 读结果。无论换 Whisper 还是 Paraformer,都是改"建识别器"那一步的工厂方法,后面的流式流程不变。
macOS 上的 TTS 示例,界面直接给出 RTF(实时率)指标,便于评估性能。
关键机制:它是怎么做到的
三个设计点决定了它的跨平台与易用性。
第一,模型统一为 ONNX 格式。各模型家族被转成.onnx,ONNX Runtime 负责执行。这意味着模型和运行环境解耦——你换平台时不用重新导出模型,只需换对应的 Runtime 后端(CPU、CUDA、CoreML 等)。
第二,识别器用"工厂方法"屏蔽模型差异。从上面的代码能看到from_sense_voice、from_whisper、from_transducer等入口。每个模型家族有自己的参数(Whisper 要 encoder/decoder,Paraformer 只要单文件),但对外暴露的都是create_stream/decode_stream这套接口。你不用关心内部结构,只需选对工厂方法。
第三,VAD + 非流式 ASR 的组合。真实语音是连续且带静音的。项目提供了vad-with-non-streaming-asr.py这类组合脚本:先用 silero-vad 找出有语音的片段,再对每段做高精度非流式识别。这是"麦克风实时转写"最常见的落地形态。
选型对照:不同设备怎么选
平台覆盖很宽,关键在"按硬件挑后端"。下表按设备给出建议起点。
| 设备类型 | 典型代表 | 建议后端 | 说明 |
|---|---|---|---|
| 手机 / 平板 | Android、iOS、HarmonyOS | NNAPI / CoreML | 走移动端 API 或 Flutter/Tauri 包 |
| 开发板 / 边缘 | 树莓派、RV1126、RK3588、VisionFive 2 | CPU | 轻量模型 + int8 量化 |
| NPU 加速 | RK、Qualcomm、Ascend、Axera、Intel | 对应 NPU 后端 | 专用加速,功耗更低 |
| 桌面 / 服务器 | x86_64、Jetson Orin | CPU / CUDA / OpenVINO | 多线程或 GPU 提吞吐 |
| 浏览器 / Node | WebAssembly、NodeJS | WASM / JS 绑定 | 端侧免安装运行 |
它支持的语言有 12 种:C++、C、Python、JavaScript、Java、C#、Kotlin、Swift、Go、Dart、Rust、Pascal,另加 WebAssembly。移动端通常走 Java/Kotlin/Swift 或 Flutter 包,桌面服务走 Python/C++,嵌入式走 C/C++。
编译为 WebAssembly 后,识别可跑在浏览器里,支持文件上传与麦克风实时录音。
调优与排坑:常见问题与容易踩的坑
性能与排障是落地时最花时间的部分。项目未公开的指标一律以官方基准为准,这里给的是方向。
| 问题现象 | 常见原因 | 调整方向 |
|---|---|---|
| 实时率(RTF)偏高、跟不上语速 | 模型偏大或线程不足 | 换 int8 量化模型;num_threads对齐核心数 |
| 内存占用高 | 模型多、实例多 | 按需延迟加载;int8 量化 |
| 中文识别夹杂英文/口音偏差 | 模型语言不匹配 | 选对应语种模型;SenseVoice 支持多方言 |
| 流式结果不稳、跳字 | 解码参数或 LM 未配 | 调decoding-method、hotwords偏置 |
| Flutter 里模型加载失败 | 沙箱读不到文件 | 模型作为 asset,运行时拷到可写目录 |
几条实操建议:先压模型再谈调参——优先选.int8.onnx版本;num_threads别盲目拉满,线程过多反而增加调度开销;专业术语识别差时,用--hotwords-file加偏置词表比换模型更省事;采样率要对齐,默认 16kHz,前端不一致会导致整条链路偏移。
行动收尾:落地 checklist
按顺序走,能少走弯路。
- 明确任务类型:流式还是非流式?是否要 VAD、TTS、说话人分离?
- 选定语言绑定:移动端选 Java/Kotlin/Swift,服务选 Python/C++,端侧选 C/C++
- 下载对应模型包(
.onnx+tokens.txt),优先 int8 版本 - 用仓库
python-api-examples/里的脚本先跑通一个任务 - 按设备挑后端(CPU / NPU / GPU),跑基准脚本确认实时率达标
- 流式场景配 VAD,识别差时加热词偏置
- 移动端把模型放进 asset,运行时拷贝到可写目录
代码获取:
git clone https://gitcode.com/GitHub_Trending/sh/sherpa-onnx从仓库根目录读README.md找到对应功能的模型下载说明,配合python-api-examples/和c-api-examples/里的脚本,即可在本地跑通第一条语音链路。
【免费下载链接】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),仅供参考