Sherpa Onnx TTS 快速上手: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 是一个完全离线工作的语音工具包,其 TTS 模块负责文本到语音的合成,同一套 ONNX 模型既能跑在 x86 服务器上,也能塞进手机和嵌入式设备。本文只讲最短路径:装依赖、下模型、调一次 generate,你会拿到一段能直接播放的合成语音,并知道几个关键参数该往哪个方向调。
📦 项目能力一览
- 纯本地推理:全部基于 ONNX Runtime 完成,合成过程不联网,适合弱网和隐私敏感环境。
- 四类声学模型可选:内置 VITS、Matcha、Kokoro、Kitten 的模型接口,按语言和质量自行挑选。
- 多说话人音色切换:多说话人模型用一个 sid 参数即可切换不同音色。
- 跨平台 API 覆盖广:Python、C/C++、Java、Kotlin、Go、Rust、Swift 等均有封装,示例覆盖 Android、iOS、HarmonyOS 与各桌面平台。
- 文本归一化内置:数字、日期通过 FST 规则转成自然发音,不需要自己做预处理。
快速上手
安装依赖
一条命令即可,Python 包已内置编译好的 ONNX Runtime:
pip install sherpa-onnx soundfilesoundfile 只负责把结果存成 wav 文件,不参与合成本身。
准备模型
从项目 release 页的 tts-models 分类里挑一个模型。新手建议选体积小的:英文可以用vits-piper-en_US-amy-low,中文可以用sherpa-onnx-vits-zh-ll。解包后你会得到.onnx模型文件、tokens.txt,以及一个espeak-ng-data目录(中文模型还会带lexicon.txt和几个.fst文件),后面配置全靠这几样。
核心调用
import sherpa_onnx config = sherpa_onnx.OfflineTtsConfig( model=sherpa_onnx.OfflineTtsModelConfig( vits=sherpa_onnx.OfflineTtsVitsModelConfig( model="./vits-piper-en_US-amy-low/en_US-amy-low.onnx", tokens="./vits-piper-en_US-amy-low/tokens.txt", data_dir="./vits-piper-en_US-amy-low/espeak-ng-data", ) ), num_threads=2, ) tts = sherpa_onnx.OfflineTts(config) audio = tts.generate("Hello, this is generated by Sherpa Onnx.")返回的audio里带samples(浮点采样)和sample_rate,用 soundfile 写盘就能播放。仓库里的 offline-tts.py 是这段逻辑的完整命令行版本,还会打印 RTF(实时率:合成耗时除以语音时长,小于 1 说明比实时更快)。
关键参数怎么调
| 参数 | 推荐值 | 说明 |
|---|---|---|
sid | 单说话人模型填 0 | 多说话人模型用来切换音色,可选范围以模型说明为准 |
speed | 1.0 | 大于 1 变快、小于 1 变慢,0.9~1.1 区间听感最自然 |
silence_scale | 0.2 | 标点处停顿的缩放系数,调大更沉稳,调小更连贯 |
num_threads | 2~4 | 推理线程数,手机、树莓派建议 1~2 |
max_num_sentences | 1 | 长文本按句分批推理,防内存溢出,不会变慢 |
provider | cpu | 可选 cuda、coreml,有对应环境才生效 |
前三项(sid、speed、silence_scale)通过 GenerationConfig 传入,generate 也提供了 sid、speed 的快捷参数;num_threads 和 provider 配在 OfflineTtsModelConfig 里;max_num_sentences 和 rule_fsts 配在外层 OfflineTtsConfig 里。接口细节可参考 Python 包源码。
⚡ 进阶玩法
中英文混合文本合成
多语言 Kokoro 模型靠多份 lexicon 文件区分语言,中英文写在同一段里可以自然衔接:
config.model.kokoro = sherpa_onnx.OfflineTtsKokoroModelConfig( model="./kokoro-multi-lang-v1_0/model.onnx", voices="./kokoro-multi-lang-v1_0/voices.bin", tokens="./kokoro-multi-lang-v1_0/tokens.txt", data_dir="./kokoro-multi-lang-v1_0/espeak-ng-data", lexicon="./kokoro-multi-lang-v1_0/lexicon-us-en.txt,./kokoro-multi-lang-v1_0/lexicon-zh.txt", ) audio = tts.generate("This is a test. 这是中英文混合语音合成。")长文本与数字朗读
中文模型建议加上rule_fsts(phone.fst、date.fst、number.fst 逗号拼接传入),"123456块钱""2024年5月11号"这类文本才会被读成自然语句,而不是逐字符念。长文本方面,把max_num_sentences设为 1,让引擎逐句合成,避免一次性把整篇文本压进内存。
适用场景
- 无障碍与朗读类应用:本地播报,文本不出设备,隐私顾虑最小。
- 离线设备:车载系统、树莓派、嵌入式盒子,断网环境照常合成。
- 内容批量生产:服务器多进程并行跑 offline-tts,批量生成有声读物和课件配音。
🔧 常见问题排查
合成出来是静音或空文件。先看日志里samples长度是否为 0,把debug设为 True 重跑一次。多数情况是 model、tokens、data_dir 三者不匹配或路径写错。
第一次生成特别慢。首次 generate 包含模型加载和推理预热,之后的请求会明显变快。对延迟敏感的应用,启动时先用一句短文本预热。
内存占用高或长文本 OOM。调小max_num_sentences,或换 fp16 版本模型,内存和体积都能明显下降。
想再快一些。优先加num_threads,其次换更小一号的模型;有 GPU 或 CoreML 环境时,把provider切到对应后端。
📚 相关资源
- Python 包源码与接口:sherpa-onnx/python/
- 命令行完整示例(含多种模型用法):python-api-examples/offline-tts.py
- 带播放的示例:python-api-examples/offline-tts-play.py
- Android 原生示例:android/SherpaOnnxTts/
- Flutter 跨平台示例(含各端构建说明):flutter-examples/tts/
- C API 示例:c-api-examples/offline-tts-c-api.c
- 模型导出脚本:scripts/vits/、scripts/kokoro/
到这里,一条完全离线的本地语音合成链路就跑通了。之后想换音色或换语言,只需要替换模型文件并同步 tokens、lexicon 配置,调用侧代码基本不用动。
【免费下载链接】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),仅供参考