1 引言

与大型语言模型(LLM)相比,语音模型相对较小,只需要本地有 GPU 的机器就可以进行训练。我的机器是很久以前购买的 1080Ti,10G 的显存,就可以正常训练。它在中文声音模拟方面的效果也相当不错。我下载了一段十几分钟评书音频,用这个模型进行训练只需 5 分钟就能完成。我觉得它模拟的音色和抑扬顿挫的效果都相当不错,虽然不能完全模拟真人的声音,但已经是我目前使用过的最好效果了。

此外,作者评测显示用 1 分钟语音与 30 分钟的效果相似。该项目目前只发布了 TTS 工具,变声工具还在开发中。

2 安装

2.1 环境

建议在 docker 环境下的安装。这样既可以与其他工具共存,也不会破坏宿主机当前环境。我下载了与 install.sh 中指定的底层软件版本最相近的版本。基础镜像 7.2G,全部安装完 10.5G,另外下载的模型和源码也在 5G 以内。

1
2
$ docker pull pytorch/pytorch:2.1.1-cuda12.1-cudnn8-runtime
$ nvidia-docker run --network host --rm -v /exports:/opt/xieyan/ -it pytorch/pytorch:2.1.1-cuda12.1-cudnn8-runtime bash

docker image 占空间 7.2G

2.2 安装软件

安装软件时,如果设置代理。可能会快一些;另外,为避免重复安装,我修改了 install.sh 中的 cuda 版本,与 docker 版本一致。

1
2
3
$ git clone https://github.com/RVC-Boss/GPT-SoVITS
$ cd GPT-SoVITS
$ . install.sh

如需要中文语音识别,还需要安装以下软件:

1
$ pip install modelscope torchaudio sentencepiece funasr

2.3 下载模型

训练和使用 GPT-SoVITS 都需要下载基础模型。如需训练模型,还需要对待模仿的音频进行切分和识别等操作,至少需要安装语音识别模型 ASR

2.3.1 下载预训练的 GPT-SoVITS 模型

在 huggingface 下载

1
2
3
$ cd GPT_SoVITS/pretrained_models
$ git clone https://huggingface.co/lj1995/GPT-SoVITS
$ mv GPT-SoVITS/* .

不计.git,模型约 1.1G 左右

2.3.2 下载 asr 模型

在魔塔平台下载

1
2
3
4
$ cd tools/damo_asr/models
$ git clone https://www.modelscope.cn/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git
$ git clone https://www.modelscope.cn/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch.git
$ git clone https://www.modelscope.cn/iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch.git

不计.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
2
$ apt-get update
$ apt-get install build-essential

这是一个日语合成库,我们一般用不上,实在不行,将 text/japanese.py 中包含 pyopenjtalk 的地方加 try 或注释掉也行。

2.5.2 问题二:markupsafe 版本问题

1
ImportError: cannot import name 'soft_unicode' from 'markupsafe'

降级了两个软件的版本后可正常运行。

1
2
$ pip install werkzeug==2.0.1
$ pip install markupsafe==1.1.1

2.5.3 问题三:modelscope 识别不了 funasr

我在使用语音识别 asr 功能时,报错“funasr-pipeline is not in the pipelines…",解决方法是:源码安装 modelscope(用 pip 安装同一版本报错找不到 funasr),另外还需要 modelscope 与 funasr 版本相配,请在 modelscopt 搜索 funasr,以确定其版本。

1
2
3
4
5
$ git clone -b funasr1.0 --single-branch https://github.com/alibaba-damo-academy/FunASR.git
$ cd FunASR
$ pip install -e ./
$ git clone https://github.com/modelscope/modelscope.git
$ pip install -e ./

修改后,出现另一报错“TypeError: AutoModel.generate() missing 1 required positional argument: 'input'”,我觉得可能还是版本问题,于是修改了源码:

1
2
3
4
vi tools/damo_asr/cmd-asr.py
修改:
26 text = inference_pipeline(input="%s/%s"%(dir,name))[0]["text"]
27 #text = inference_pipeline(audio_in="%s/%s"%(dir,name))["text"] # xieyan test

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
2
3
4
110     train_loader = DataLoader(
111 train_dataset,
112 #num_workers=6,
113 num_workers=1,

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 参考