编译Sherpa开源TTS模型的Android应用

81 阅读4分钟

编译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.fstnumber.fstphone.fst)处理特定格式的文本(如日期、数字、电话号码),确保其正确发音。

2. 模型推理
  • TTS模型(model-steps-3.onnx) :将处理后的文本(音素序列)输入到TTS模型中。模型通过深度学习技术(如Transformer、Diffusion)生成对应的梅尔谱图或直接生成音频波形。

  • tokens.txt:定义了模型使用的音素或字符集,确保输入序列正确转换为模型所需的格式。

3. 声码器(vocos-22khz-univ.onnx)
  • 输入梅尔谱图:TTS模型生成的梅尔谱图被送入声码器模型。
  • 转换为音频波形:声码器将梅尔谱图转换为实际的音频波形,生成最终的合成语音。

五、总结

通过上述步骤,您可以成功编译并运行一个基于Sherpa的TTS Android应用。Sherpa的灵活配置和丰富模型支持,使得开发者能够根据需求选择合适的模型和声码器,快速实现高质量的TTS服务。希望本文能为您提供帮助,也期待您能够开发出更多优秀的应用!


参考资料