编译Sherpa开源TTS模型的Android应用
Sherpa是是一个功能强大、完全离线运行、跨平台支持的开源语音处理工具箱,由 k2-fsa 团队(新一代 Kaldi 的核心开发者)维护。它基于 ONNX Runtime 实现,无需联网即可在多种设备上高效运行语音相关任务。
本文将详细介绍如何使用Sherpa的预训练模型和相关资源编译一个Android应用,帮助开发者快速上手。
一、官方pre-apk
如果您希望直接使用Sherpa的预编译APK,可以访问官方网站,这里提供了不同版本的APK供您下载和测试。不过,如果您有特殊需求或希望进行二次开发,可能需要手动编译。
二、编译步骤
1. 工程外壳
首先,您需要从GitHub克隆Sherpa的Android工程外壳。该外壳已经配置好了相关的依赖项和目录结构,方便您快速开始:
git clone https://github.com/k2-fsa/sherpa-onnx.git
cd sherpa-onnx/android/SherpaOnnxTtsEngine
2. 下载so库
接下来,您需要下载预编译的so库。这些库包含了Sherpa的底层功能,如模型加载、推理等。请从以下链接下载对应版本的so库:
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.18/sherpa-onnx-v1.12.18-android.tar.bz2
tar -xvjf sherpa-onnx-v1.12.18-android.tar.bz2
解压后,将so库文件放置到您的项目中对应目录,通常位于app/src/main/jniLibs下。
3. 下载aar包
除了so库外,您还需要下载sherpa-onnx的aar包,该包集成了与Android交互的Java接口。从以下链接下载:
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.18/sherpa-onnx-1.12.18.aar
将下载好的aar包添加到您的项目中,通常放置于app/libs目录,并在build.gradle中添加依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
}
4. 下载模型
Sherpa的TTS模型支持多种语言和发音人,这里以中文Baker模型为例:
wget https://huggingface.co/csukuangfj/matcha-icefall-zh-baker/resolve/main/tts_model.onnx
将模型文件放置于您的应用的assets目录中,方便在应用中加载使用。
5. 下载声码器模型
为了将TTS模型生成的语音特征转换为实际的音频波形,您还需要一个声码器模型。这里推荐使用Vocos模型:
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/vocoder-models/vocos-22khz-univ.onnx
同样地,将声码器模型放置于assets目录中。
三、集成目录结构
一个典型的集成目录结构如下:
project-root
├── app
│ ├── src
│ │ └── main
│ │ ├── assets
│ │ │ ├── vocos-22khz-univ.onnx ← 声码器(Vocoder)模型
│ │ │ └── matcha-icefall-zh-baker ← 中文 TTS 主模型(基于 Matcha-TTS + Icefall + Baker 数据集)
│ │ │ ├── date.fst ← FST:日期格式转换规则
│ │ │ ├── lexicon.txt ← 词典:字/词 → 音素映射
│ │ │ ├── model-steps-3.onnx ← TTS 主干模型(神经网络)
│ │ │ ├── number.fst ← FST:数字读法转换规则
│ │ │ ├── phone.fst ← FST:音素序列处理
│ │ │ ├── README.md ← 说明文档
│ │ │ ├── tokens.txt ← 模型使用的 token 字典(音素/字符 ID 映射)
│ │ │ └── dict ← 分词和词典资源
│ │ │ ├── generate_user_dict.py ← 生成用户词典脚本
│ │ │ ├── hmm_model.utf8 ← HMM模型文件
│ │ │ ├── idf.utf8 ← IDF词典
│ │ │ ├── jieba.dict.utf8 ← 结巴分词词典
│ │ │ ├── stop_words.utf8 ← 停用词词典
│ │ │ ├── user.dict.utf8 ← 用户自定义词典
│ │ │ └── pos_dict ← 词性标注资源
│ │ │ ├── char_state_tab.utf8 ← 字符状态表
│ │ │ ├── prob_emit.utf8 ← 发射概率表
│ │ │ ├── prob_start.utf8 ← 初始概率表
│ │ │ └── prob_trans.utf8 ← 转移概率表
│ │ ├── jniLibs
│ │ │ ├── arm64-v8a
│ │ │ │ └── libonnxruntime.so ← 预编译的so库
│ │ │ │ └── libsherpa-onnx-jni.so ← 预编译的so库
│ │ │ └── ... (其他ABI)
│ │ └── java
│ │ └── com
│ │ └── yourcompany
│ │ └── ... (Java代码)
│ └── build.gradle
├── libs
│ └── sherpa-onnx-1.12.18.aar ← sherpa-onnx的aar包
└── ... (其他文件和目录)
四、流程原理:
1. 文本处理
-
输入文本:用户输入的文本(如“欢迎使用AI实验室的TTS服务!”)。
-
分词与词典匹配:利用
jieba.dict.utf8等资源进行分词,将文本分解为词或短语。然后通过lexicon.txt将每个词或短语转换为对应的音素序列。 -
FST处理:使用FST(有限状态转换器)文件(如
date.fst、number.fst、phone.fst)处理特定格式的文本(如日期、数字、电话号码),确保其正确发音。
2. 模型推理
-
TTS模型(model-steps-3.onnx) :将处理后的文本(音素序列)输入到TTS模型中。模型通过深度学习技术(如Transformer、Diffusion)生成对应的梅尔谱图或直接生成音频波形。
-
tokens.txt:定义了模型使用的音素或字符集,确保输入序列正确转换为模型所需的格式。
3. 声码器(vocos-22khz-univ.onnx)
- 输入梅尔谱图:TTS模型生成的梅尔谱图被送入声码器模型。
- 转换为音频波形:声码器将梅尔谱图转换为实际的音频波形,生成最终的合成语音。
五、总结
通过上述步骤,您可以成功编译并运行一个基于Sherpa的TTS Android应用。Sherpa的灵活配置和丰富模型支持,使得开发者能够根据需求选择合适的模型和声码器,快速实现高质量的TTS服务。希望本文能为您提供帮助,也期待您能够开发出更多优秀的应用!
参考资料