✨ Bert-VITS2 Android 版, 推理框架基于 alibaba-MNN.
本工程提供了一个示例,实现了离线推理版本的 Bert-VITS2 (2.3版本),目前仅适配了中文:
- 🧠 蒸馏版中文 BERT 模型 :中文 Bert 模型使用了一个自制的蒸馏版本,基于 Wikipedia 中文以及 SkyPile 中文数据集,共计约 1000W 条文本进行模型蒸馏,将体积缩减至 30M。(也不知道蒸的咋样反正最后看曲线是收敛了 -.-)
- 🏗 MNN :基于 MNN 推理框架实现 BV2 的整个推理流程,推理参考自其 onnx 推理代码。(pth 直接转不成功,你没资格啊,你没资格.jpg)
- 🧹 cppjieba and cpptokenizer :用来平替 Python 端的 jieba 分词以及 huggingface 的 tokenizer。一些 BV2 独有的文本预处理步骤使用 Kotlin 进行平替实现。(此过程 GPT 老祖帮了许多)
整个过程在 Android 端全程 离线推理 无需任何联网服务.
Input Text
↓
Tokenization + G2P (cppjieba + tokenizer + kotlin code)
↓
BERT embedding (distilled Chinese model)
↓
Encoder + Emb + DP/SDP + Flow + Decoder (BV2 infer by MNN)
↓
Waveform output (.wav)
此处提供一些中文音频示例,基于部分明日方舟语音集以及原神语音集进行训练:
| Text | Character | Audio |
|---|---|---|
| 博士,当初在龙门,我不该放你走的。 | 陈 | 🔊 Play |
| 旅行者,好久不见。 | 珐露珊 | 🔊 Play |
| 工作还没有做完,又要开始搬砖了。 | 甘雨 | 🔊 Play |
GIT_LFS_SKIP_SMUDGE=1 git clone --recurse-submodules git@github.com:Voine/Bert-VITS2-MNN.git
# for windows powershell
$env:GIT_LFS_SKIP_SMUDGE=1; git clone --recurse-submodules git@github.com:Voine/Bert-VITS2-MNN.git
cd Bert-VITS2-MNNIf already cloned:
git submodule update --init --recursive📦 建议使用 Android Studio 进行工程编译,用 IDE 打开根目录即可
# From project root
./gradlew assembleRelease本工程的一些文件如 .mnn ,使用 lfs 进行存储,需要按照如下方式拉代码:
git lfs install
git lfs pullTo track files (if contributing):
git lfs track "*.mnn"| Library | Path |
|---|---|
| MNN | third_party/MNN |
| cppjieba | third_party/cppjieba |
| tokenizer-cpp | third_party/tokenizers-cpp |
中文模型基于 chinese-roberta-wwm-ext-large 进行蒸馏,为适配移动端,大幅缩减了体积。原版直接转换能有 1.2G ...
蒸馏代码详见 distill/README.md.
- 如果你需要替换自己的模型尝试验证,首先需要参考 BertVITS2 内的说明进行训练得到桌面端模型,目前仅支持 2.3 版本,本工程基于的 BV2 代码 commit 为 13424595,如需自制模型,建议 BV2 代码版本保持一致。
- 将你的 pth 模型转换成 onnx, onnx 导出脚本在 这里
- 使用 MNN Convert 将所有模块的 onnx 模型转成 mnn, 转换命令参考:
./MNNConvert --modelFile your_path_to_onnx.onnx --MNNModel your_path_to_mnn.mnn --framework ONNX --bizCode MNN --weightQuantBits 8 --weightQuantAsymmetric- 放到 assets/bv2_model 内,如果你的模型名字有变化,则需要修改 VoiceViewModel.kt 内关于模型路径加载的部分。(硬编码字符串一时爽,一直硬编码一直爽)
目前在 third_party 内的 cppjieba、tokenizer-cpp 以及 MNN 仅是为了提供头文件,若需要自行编译 tokenizer-cpp 并替换产物 libtokenizers_c.a libtokenizers_cpp.a,需修改 huggingface_tokenizer.cc 内的 add_special_tokens 默认为 true
├── app/
├──── src/main/
│ ├── assets # mnn bert model, cppjieba dic, mnn bv2model
│ ├── java/preprocess # Text preprocess code
├── bertvits2 # Bert-VITS2 infer code
├── cppjieba # cppjieba interface
├── cpptokenizer # cpptokenizer interface
├── third_party # provide hpp
本工程基于以下前辈们的贡献做了一些微不足道的搬砖工作,也希望能为后续在端智能推理捣鼓的小伙伴提供一些参考。
- 看一下日文版和英文版怎么搞
- 迁移到移动版老婆聊天器中