完全离线运行的高精度中文文字转语音 Android 应用。使用 sherpa-onnx(ONNX Runtime)加载 VITS 神经网络模型,不依赖系统 TTS 引擎、不联网,可商用(Apache-2.0)。
- ✅ 完全离线:模型与词典内置在 APK 中,运行时零网络访问
- ✅ 流式播放:基于
generateWithCallback+MODE_STREAMAudioTrack, 合成即播放(首音延迟 ~10ms),无音频长度上限 - ✅ 174 个发音人(aishell3 多说话人模型)
- ✅ 可调语速 / 音调、发音人选择、WAV 保存
- ✅ Apache-2.0 许可证,可用于商业产品
输入文本 → 规则 FST(数字/日期/电话/多音字)→ VITS 神经网络 → 浮点音频块
→ PCM16 转换 → AudioTrack (MODE_STREAM) 边合成边播放
| 组件 | 技术 |
|---|---|
| 推理引擎 | sherpa-onnx 1.13.4(ONNX Runtime 封装) |
| 声学模型 | VITS aishell3(174 说话人,8kHz) |
| 文本归一化 | date.fst / number.fst / phone.fst / new_heteronym.fst |
| 播放 | AudioTrack MODE_STREAM,16-bit PCM |
重要:需要 JDK 17、Android SDK、Gradle 7.2。
# 关键:设置 ANDROID_SDK_HOME 指向可写的用户目录,否则 AGP 因 C:\.android 不可写而失败
$env:ANDROID_SDK_HOME = "C:\Users\Administrator"
$env:ANDROID_HOME = "D:\sdk"
$env:ANDROID_SDK_ROOT = "D:\sdk"
$env:JAVA_HOME = "F:\Program Files\Java\jdk-17.0.12"
$env:GRADLE_USER_HOME = "G:\AIProject\AndroidTTs\.gradle-home"
$gh = "C:\Users\Administrator\.gradle\wrapper\dists\gradle-7.2-bin\2dnblmf4td7x66yl1d74lt32g\gradle-7.2"
& (Join-Path $gh "bin\gradle.bat") assembleDebug --no-daemonAPK 输出:app/build/outputs/apk/debug/app-debug.apk
$adb = "D:\sdk\platform-tools\adb.exe"
& $adb install -r "app\build\outputs\apk\debug\app-debug.apk"
& $adb shell am start -n com.aiproject.androidtts/.MainActivity
⚠️ 当前abiFilters包含x86(用于模拟器调试)。生产发布时请删除x86,仅保留arm64-v8a。
当前 aishell3 输出 8000 Hz(电话级音质)。如需更高自然度的生产级音质, 可切换到 vits-zh-hf-doom(单发音人、更自然):
# 1. 下载高保真模型
powershell -ExecutionPolicy Bypass -File download-model.ps1 -Model hf-doom然后修改 app/src/main/java/com/aiproject/androidtts/TtsController.java:
private static final String MODEL_FILE = MODEL_DIR + "/vits-zh-hf-doom.onnx";
private static final String ENGINE_LABEL = "VITS 神经网络 (hf-doom)";重新构建即可。
| 模型 | 大小 | 采样率 | 发音人 | 音质 | 许可证 |
|---|---|---|---|---|---|
| aishell3(默认) | ~120 MB | 8000 Hz | 174 | 电话级 | Apache-2.0 |
| hf-doom(推荐) | ~600 MB | ~22050 Hz | 1 | 高自然度 | Apache-2.0 |
| mms-zho | ~280 MB | 22050 Hz | 1 | 中等 | CC-BY-4.0 |
| 文件 | 说明 |
|---|---|
app/src/main/java/.../TtsController.java |
sherpa-onnx 封装:流式合成 + 播放 + 保存 |
app/src/main/java/.../MainActivity.java |
UI:发音人选择、语速/音调、朗读/停止/保存 |
app/src/main/assets/vits-zh/ |
模型文件(~124 MB,不随源码分发) |
app/libs/sherpa-onnx-1.13.4.aar |
推理引擎 AAR(48.8 MB) |
app/build.gradle |
minSdk 24,本地 AAR 依赖,noCompress onnx |
download-model.ps1 |
模型下载脚本(支持多模型) |
- 模型 aishell3:Apache-2.0(可商用)
- 训练数据 AISHELL-3:Apache-2.0
- sherpa-onnx 运行时:Apache-2.0
- 本应用代码:可自由使用