sherpa-onnx 语音工具箱:3 分钟跑通离线语音合成与识别
【免费下载链接】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
sherpa-onnx 是一个完全离线的语音工具箱:语音识别(ASR)、语音合成(TTS)、VAD、说话人分离、语音增强都装在一箱里,不联网、零 API 费用。这篇走一遍最小路径:装包、下模型、跑出第一段声音。
🎬 先想两个场景:你的声音要留在哪
场景一:录音转写,数据不能出内网。把会议录音丢给 offline-decode-files.py,逐文件转成文字,全程不碰外网,也没有按字符计费的账单。
场景二:给自家软件加个朗读。App、网站、树莓派小盒子都可以。模型跑在本地 CPU 上,断网照常工作,数据不落地。
这两个场景,一个要"听懂",一个要"开口",都是 sherpa-onnx 的基本功。
🚀 三步跑通第一个语音合成
git clone https://gitcode.com/GitHub_Trending/sh/sherpa-onnx cd sherpa-onnx pip install sherpa-onnx soundfile装一个 Python 包就够了,不用自己编译 C++。接着下载一个约 20MB 的英文 TTS 模型,放进项目目录解压。模型列表在仓库 releases 页的 tts-models 标签下,命令示例直接写在 offline-tts.py 文件头部。
第 2 步:合成并试听
python3 ./python-api-examples/offline-tts.py \ --vits-model=./vits-piper-en_US-amy-low/en_US-amy-low.onnx \ --vits-tokens=./vits-piper-en_US-amy-low/tokens.txt \ --vits-data-dir=./vits-piper-en_US-amy-low/espeak-ng-data \ --output-filename=./generated.wav \ "Hello from sherpa-onnx. This runs fully offline."跑完终端会打印RTF: 0.xxx/xx.xxx = 0.xxx,这就是实时率:合成耗时除以音频时长。小于 1 表示比实时快。生成的 wav 直接播放验证即可。
🧠 核心原理:一个工具箱,两种角色
别把它想成一个"引擎",更像是工具箱:识别、合成、VAD 各自是独立的 ONNX 模型,互不牵连,各对应一套 API。
- ASR 像"速记员":wav 进来,切成 40ms 左右的小帧,逐帧算特征、喂进模型,吐出文字。
- TTS 像"播音员":文本先经过数字、日期等规则改写(那几个
.fst文件干这事),变成音素,再经神经网络生成音频波形。
推理底座是 ONNX Runtime。模型训练好之后导出成 .onnx,任何能跑 ONNX Runtime 的机器——手机、树莓派、RK NPU、服务器——都可以直接执行,这就是"一次训练、多端部署"的由来。
⚙️ 进阶用法与调参
换流式识别。麦克风实时转写用 online-decode-files.py,边采边出字,不等整句说完。
部署成 WebSocket 服务。一条命令起服务,浏览器直接录音上传:
python3 ./python-api-examples/http_server.py --port=6009 python3 ./python-api-examples/non_streaming_server.py --port=10095VAD 打底再识别。长录音先用 vad-with-non-streaming-asr.py 把静音切掉,再送 ASR,省时间也省算力,这个组合也是字幕生成的标准套路。
调参先看这张表:
| 参数 | 默认值 | 作用 |
|---|---|---|
--num-threads | 1 | 神经网络计算线程,调 2~4 提速明显 |
--sample-rate | 16000 | 音频采样率,必须与 wav 实际一致 |
--decoding-method | greedy_search | 解码方式,beam search 更准但更慢 |
--max-num-sentences | 1 | 批内句数,防长文本 OOM |
--speed | 1.0 | 合成语速,越小越慢 |
🕳️ 三个新手必踩的坑
1. 采样率不匹配,识别结果全是"鬼话"。8k 的电话音频按 16k 读,音调全变。看 wav 标称采样率,--sample-rate填多少就传多少。
2. VITS 模型参数传混。官方给了 piper、matcha、kokoro、kitten 等多套模型。piper 系只用--vits-model、--vits-tokens、--vits-data-dir三项;带--vits-lexicon的是 icefall、zh-ll 那批模型。指定data-dir后 lexicon 和 tokens 会被忽略,别两个都传。
3. 长文本合成 OOM。用--max-num-sentences控制批内句数,设 1 最稳,小值并不会比大值慢。
⚖️ 选型建议:它适合什么,不适合什么
适合:离线/内网部署;Android、iOS、鸿蒙、树莓派、NPU 板卡等多平台;预算敏感、不想按量付费 API;要 VAD、说话人分离、语音增强这类"周边能力"时,一个项目全包含。
不适合:要顶级情感表达和超高自然度的高端有声书场景;或毫秒级超低延迟的实时对话,那还是云方案成熟。
另外,仓库示例里多数是"离线模型 + 模拟流式"的玩法,纯流式体验以 streaming-decode-files.py 这类脚本为准,预期要摆正。
📚 延伸资源(均为仓库内路径)
- 离线识别:offline-decode-files.py
- 语音合成:offline-tts.py,文件头 8 组模型示例可直接抄
- Web 与 WebSocket 部署:http_server.py、non_streaming_server.py
- VAD 组合:vad-with-non-streaming-asr.py
- Android 端工程:android/SherpaOnnxTts/、android/SherpaOnnx/
- Flutter 跨平台示例:flutter-examples/
- 12 种语言的 API 绑定:c-api-examples/、java-api-examples/、go-api-examples/、python-api-examples/
项目目录很直白:python-api-examples/下 80 多个脚本按功能命名,每个脚本头部 Usage 注释都是现成命令,照着改路径就能跑。
下一步
挑 tts-models 列表里体积最小的那个模型,把 offline-tts.py 完整跑一遍,记下打印的 RTF;然后加--num-threads=2再跑一次,对比两个数字。基线有了,后面换中文模型、换 kokoro 多语言模型,心里就有底了。
【免费下载链接】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),仅供参考