目前见过效果最好的中文语音合成工具
1 引言
与大型语言模型(LLM)相比,语音模型相对较小,只需要本地有 GPU 的机器就可以进行训练。我的机器是很久以前购买的 1080Ti,10G 的显存,就可以正常训练。它在中文声音模拟方面的效果也相当不错。我下载了一段十几分钟评书音频,用这个模型进行训练只需 5 分钟就能完成。我觉得它模拟的音色和抑扬顿挫的效果都相当不错,虽然不能完全模拟真人的声音,但已经是我目前使用过的最好效果了。
此外,作者评测显示用 1 分钟语音与 30 分钟的效果相似。该项目目前只发布了 TTS 工具,变声工具还在开发中。
2 安装
2.1 环境
建议在 docker 环境下的安装。这样既可以与其他工具共存,也不会破坏宿主机当前环境。我下载了与 install.sh 中指定的底层软件版本最相近的版本。基础镜像 7.2G,全部安装完 10.5G,另外下载的模型和源码也在 5G 以内。
1 | docker pull pytorch/pytorch:2.1.1-cuda12.1-cudnn8-runtime |
docker image 占空间 7.2G
2.2 安装软件
安装软件时,如果设置代理。可能会快一些;另外,为避免重复安装,我修改了 install.sh 中的 cuda 版本,与 docker 版本一致。
1 | git clone https://github.com/RVC-Boss/GPT-SoVITS |
如需要中文语音识别,还需要安装以下软件:
1 | pip install modelscope torchaudio sentencepiece funasr |
2.3 下载模型
训练和使用 GPT-SoVITS 都需要下载基础模型。如需训练模型,还需要对待模仿的音频进行切分和识别等操作,至少需要安装语音识别模型 ASR。
2.3.1 下载预训练的 GPT-SoVITS 模型
在 huggingface 下载
1 | cd GPT_SoVITS/pretrained_models |
不计.git,模型约 1.1G 左右
2.3.2 下载 asr 模型
在魔塔平台下载
1 | cd tools/damo_asr/models |
不计.git 文件夹,约 1.4G 左右。
2.4 运行程序
如需要修改端口,请在 config.py 中设置
1 | python webui.py |
此时,在默认的 9874 端口即可看到 gradio 界面。
2.4.1 准备训练音频
切分音频
- 在 0b-Audio slicer 界面设定待学习的 mp3 格式音频文件。
- 点击 Start audio slicer,切分后的音频将以每 5 秒一个的 wav 保存在设置的输出目录中。
语音识别
- 在 0c-Chinese ASR tool 界面中,将切分输出目录设置为识别数据目录。
- 点击 Start batch ASR,将音频转换为文字,生成 list 文件。
- 如果服务后台报错“funasr-pipeline is not in the pipelines…”,请参考问题与解决部分。
编辑语音识别结果
- 在 0d-Speech to text proofreading tool 界面中,设置.list 文件的路径(通常是 output/asr_opt/slicer_opt.list,具体请在数据目录下查找)。
- 打开 labelling WebUI,通过在 9871 端口启动界面,对识别结果进行编辑。
- 请删除效果太差、无内容或太短的音频,并纠正错误的识别结果。
- 在测试时,可以跳过此步骤。
2.4.2 训练模型
切换到第二个选项卡 GPT-SOVITS-TTS,并输入待创建的模型名称。
该界面分为三个部分:A 数据格式化,B 模型训练,C 语音合成。
1A-Dataset formatting
设置之前处理的 list 位置和音频数据目录,按照 A-B-C 的步骤执行,或者通过下方按钮一次性执行所有步骤。
1B-Fine-tuned training
分别点击两个按钮进行模型训练,SoVITS 训练大约需要 5GB 显存和 5 分钟左右,GPT 训练大约需要 5GB 显存和 3 分钟左右。
在训练过程中可能会出现共享内存错误,解决方法请参考问题及解决部分。
1C-inference
点击 refresh 按钮后,下拉列表中将出现新训练的模型。选择模型后,打开推理 WEB 界面,在 9872 端口打开界面(如果一次打不开,就多等会儿)。
在推理 Inference 界面中,需要设置一个音频文件及其对应的文本。可以使用之前切分的 wav 文件,并输入其对应的文本。我觉得这是用于 GPT 从上文生成下文的需求。
然后输入需要合成的文本,点击合成按钮即可。
如果出现与 pyopenjtalk 相关的错误,请参考问题及解决部分。
2.5 问题及解决
我从下载到修改再到训练合成,大概花了半天时间;安装过程中遇到了一些报错,工具链还有一定的改进空间。
2.5.1 问题一:pyopenjtalk 版本问题
理论上,运行 install.sh 脚本可以直接安装所需软件。可能是因为 requirements.txt 文件中没有指定软件的版本号,导致我在安装 pyopenjtalk 时遇到了错误。似乎是由于编译工具的问题引起的。解决方法如下:
1 | apt-get update |
这是一个日语合成库,我们一般用不上,实在不行,将 text/japanese.py 中包含 pyopenjtalk 的地方加 try 或注释掉也行。
2.5.2 问题二:markupsafe 版本问题
1 | ImportError: cannot import name 'soft_unicode' from 'markupsafe' |
降级了两个软件的版本后可正常运行。
1 | pip install werkzeug==2.0.1 |
2.5.3 问题三:modelscope 识别不了 funasr
我在使用语音识别 asr 功能时,报错“funasr-pipeline is not in the pipelines…",解决方法是:源码安装 modelscope(用 pip 安装同一版本报错找不到 funasr),另外还需要 modelscope 与 funasr 版本相配,请在 modelscopt 搜索 funasr,以确定其版本。
1 | git clone -b funasr1.0 --single-branch https://github.com/alibaba-damo-academy/FunASR.git |
修改后,出现另一报错“TypeError: AutoModel.generate() missing 1 required positional argument: 'input'”,我觉得可能还是版本问题,于是修改了源码:
1 | vi tools/damo_asr/cmd-asr.py |
2.5.4 问题四:共享内存报错
报错信息如下:
RuntimeError: DataLoader worker (pid 14958) is killed by signal: Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit.
解决方法是修改 GPT_SoVITS/s2_train.py
112 行左右,将 DataLoader 的 num_workers 从 6 改成 1
1 | 110 train_loader = DataLoader( |
3 代码解析
代码以 Python 为主,约 1.3W 行,其中:
- GPT_SoVITS/:核心工具 9000 行
- GPT_SoVITS/AR:自回归 VIT 2500 行
- GPT_SoVITS/module/:主模型 3400 行,VITS 核心代码
- tools/:辅助工具 3200 行
4 原理
GPT_SoVITS 名字由三部分组成的模型:这里的 GPT 并非指代常见的大型语言模型 GPT,而是其字面意思——Generative Pre-training Transformer。它通常指利用上文生成下文的生成模型。这也可以从上述操作中看出,推理过程中使用“音频”作为引子来合成新的音频。
SoVITS 是 2023 年非常流行的一款歌声音色转换器,它主要基于 SoftVC 和 VITS 两个音频模型构建,名字即二者的组合。接下来的文章将介绍这两个模型相关的论文(链接见参考部分)。
5 使用技巧
- 语气是习得的,所以如果用朗诵数据训练,读啥都很奇怪;如果用旁白或者有声书数据训练,则自然很多。
- 这个项目实现了定制的语音合成,并在训练过程中采用了如语音识别、人声与背景声的分离,以及精调模型,声音转换等技术的具体应用,可以说是一份极好的语音模型入门教材。
6 参考
- https://www.yjpoo.com/site/2983.html
- 论文阅读_语音转换_SoftVC
- 论文阅读_语音合成_VITS