在本地(Windows_Linux)从零开始训练VITS中文AI语音模型到TTS推理的避坑教程指南

因为搜遍全网也找不到几个详细点的本地训练教程,更不用说各大佬GitHub里无比精简的README了,所以分享研究几天的经验供大家参考,能力有限,欢迎指正补充。本教程仅包含Cj版VITS,在本地使用CUDA训练单人中文模型及Windows下的TTS推理,Colab在线中文模型训练教程视需求更新。

个人建议有能力及条件的朋友使用Linux训练,不仅报错会减少,而且会更高效地利用显卡性能来训练。

网络问题:

从GitHub到安装各类插件、软件,建议全程使用代理,或者自行搜索相关镜像源及换源(GitHub、Conda、pip等),本文均按照网络环境已经通畅来进行。

硬件要求:

内存最好在16G以上。

**显存最好在12G以上,最低也得6G,而且必须是支持CUDA的N卡。**A卡目前理论上也有办法跑torch,但是非常复杂且麻烦,其不在本文讨论范围内。

相关链接:

VITS原版:https://github.com/jaywalnut310/vits

VITS(CjangCjengh版):https://github.com/CjangCjengh/vits

audio-slicer:https://github.com/openvpi/audio-slicer

零基础炼丹秘籍 - 为自己喜爱的角色训练TTS(文字转语音)模型 :https://www.bilibili.com/read/cv17826415

零基础炼丹 - vits版补充 :https://www.bilibili.com/read/cv18357171

vits注解(不完全正确) :https://www.bilibili.com/read/cv18478187

初探VITS AI语音模型训练 – Fantasy Land(需加速访问):https://east.moe/archives/1342

【AI术语】看不懂炼丹黑话?相关词条整理(什么是炸炉?过拟合?学习率?:https://www.bilibili.com/read/cv20351511

准备环节

安装Conda

因为在数据集的准备中,分割音频也需要安装相关Python依赖,在此便将虚拟环境放到最开始。

我们使用Conda来搭建Python虚拟环境。

首先打开Conda官网:https://www.anaconda.com/

选择合适你的电脑的版本。(Linux请自行搜索安装和配置方法,在此不再赘述。PS:都用Linux了,就不用我来教了吧)

Conda官网

下载好安装程序,打开安装。

安装路径可根据自己喜好,不建议C盘,因为之后虚拟环境和Python插件会比较占用空间。

此处添加到环境变量,根据个人使用需求而定,可以不勾选,因为之后教程均直接用Anaconda的终端而非Windows终端,环境变量无所谓。

此处无法勾选是因为前面选择的问题

安装完毕后打开开始中的Anaconda Powershell Prompt (Anaconda3)

输入Conda info查看Conda默认虚拟环境创建路径

如图所示,可根据自己需求选择是否更改创建路径,如需更改,请自行搜索方法。

项目下载

通过Git Clone命令(git clone https://github.com/CjangCjengh/vits.git)下载Cj版VITS,如果没有Git,进入项目网站:https://github.com/CjangCjengh/vits

点击Code中的Download ZIP下载整个项目的压缩包,然后将压缩包解压到你存放项目的地方。

数据集准备(以单人数据集为例)

删除filelists中的所有文件(无用)。然后,在里面新建list.txt和list_val.txt文件(文件名可自定义,后面记得改),文件编码务必是UTF-8(不带BOM)!

删除

然后再如上图在项目文件夹中添加wavs文件夹,上图为已添加后的截图。

数据集的整理具体可参考相关链接中的《零基础炼丹 - vits版补充 》专栏。

接下来是音频处理

首先建议阅读相关链接中的《vits注解(不完全正确)》了解什么是****训练集、验证集。

如果有比较充足的兴趣和时间还可以阅读学习相关链接中的:【AI术语】看不懂炼丹黑话?相关词条整理(什么是炸炉?过拟合?学习率?(https://www.bilibili.com/read/cv20351511)

接下来使用Au对你要训练的长音频文件(类似软件都可以,这里以Au为例)进行重新编码。

音频要求:无背景音(自行搜索如何去背景音、去噪、去BGM)、吐字清晰、无明显情感波动、语速适中、音量大小均衡。如果不符合要求将会影响训练出的模型质量。

进入批处理面板,将音频文件放进去,打开导出设置

位置任意,格式请严格按照上图选择(单声道、22050Hz,PCM 16bit),剩下设置按需操作。

设置完导出设置点击确定,然后在面板中点击运行即可。

接下来进行音频的分割处理(以audio-slicer为例)

根据前文提到过的办法,下载audio-slicer项目(https://github.com/openvpi/audio-slicer),进入项目文件夹。

打开conda终端(Anaconda Powershell Prompt)

创建slicer虚拟环境,命令如下:

conda create -n slicer python=3.7

之后一路确定,安装完激活环境,命令如下:

conda activate slicer

然后cd到audio-slicer项目文件夹,根据requirements.txt安装相关依赖(pip或者conda都可以,如果出现依赖冲突等问题,可以自行选择版本命令安装或者按需修改requirements.txt):

pip install -r requirements.txt

安装完依赖,将Au处理过的音频移动到当前目录(建议重新命名为1.wav、2.wav……)进行音频分割(如果有自定义需求,如音频长度等等可参考项目README):

python slicer.py 这里填你命名的文件

稍等片刻,分割完毕。

然后将分割后的文件(不包含原文件)移动至前面的wavs目录。

接下来进行文本整理

打开filelists目录中的list.txt(训练集)和list_val.txt(验证集)文件。

数据整理可参考前文提到的“零基础炼丹”相关文章。

关于标点符号,如下图,请参考项目文件夹下text文件夹中的symbols.py中的chinese_cleaner段落中的punctuation行,如果你知道cleaner的工作机制,也可以修改、自制、选择其他作者的cleaner,本文均使用Cj版的中文cleaner。

关于数据量,个人建议训练集五百条十秒长的语音起步,越多更好;验证集大概为训练集十分之一左右。

如图所示

重要:两个txt文件都必须不带任何空行,末尾处也不可以,否则后面预处理会报“out of range”的错。

文字前的路径可以参考下面简单写的Python脚本来处理。

i=0

f = open(‘output.txt’,‘a’,encoding=“utf-8”)

while i < 100:

    f.write(‘wavs/1_’)

    f.write(str(i))

    f.write(’.wav|\n’)

    i=int(i)

    i=i+1

else:

    f.close()

    print(‘写入已完成’)

至此,数据集制作完毕。

搭建VITS环境

新建conda虚拟环境:

conda create -n vits python=3.7

激活环境:

conda activate vits

接下来先安装torch(重要)

先确定显卡驱动,输入以下命令:

nvidia-smi

查看CUDA驱动是否正常以及CUDA版本。(CUDA驱动如果没有自行搜索下载安装)

**torch一定要安装带有CUDA版本的且CUDA版本应低于你驱动的CUDA版本,**其安装方法主要有三种:Conda在线安装、pip在线或本地安装。

Conda或是pip在线安装(pip如果换源安装torch容易报错)

在线安装可参考上图Pytorch官网(https://pytorch.org/)给出的命令(conda和pip)

本地安装,打开(https://download.pytorch.org/whl/torch_stable.html)下载pytorch和torchvision的whl安装包

个人建议选择比较新的稳定版本,而非requirements.txt中的上古版本。

其中torch后缀解释示例:cu102-cp37-win为Windows下Python3.7(如果你按照前文命令搭建环境,则选择3.7版本即可)版本带且有102版本CUDA的安装包,一定要选择带有cu的!

之后在conda命令行cd到下载目录(cd 你的下载路径)输入以下命令:

pip install 你下载的安装包名字(带whl后缀)

等待安装完毕即可。

安装相关依赖

cd切回刚才的vits目录,先不要急着安装requirements.txt,打开该文件删除torch相关的两行

如图

然后清理不需要的依赖,如果需要训练中文模型,像pyopenjtalk(装起来还费劲)、num_thai这些都可以删掉(可选),不过需要处理相关的py文件以免报错(后面会涉及),还可以删掉==后的所有版本内容(可选,已测试可行),因为这个文件列的依赖其实挺乱的,如果严格按照其版本安装可能报错。

接下来用pip安装requirements.txt(或者自己手动敲命令安装,方便处理报错):

pip install -r requirements.txt

另外,如果你没有删掉pyopenjtalk一行,安装这个模块大概率报错,解决方法可参考:https://www.bilibili.com/video/BV13t4y1V7DV/

依赖全部安装完可以输入pip list查看所有的包,方便对照requirements。

安装MSVC(仅Windows)

打开https://visualstudio.microsoft.com/zh-hans/downloads/

下载安装visual studio installer

在installer中选择单个组件,搜索MSVC安装适合版本的生成工具(并非安装Visual Studio)。安装路径可以不用是C盘。

如图

Build monotonic alignment search

此步很重要,如果跳过运行训练必报错。

conda cd到monotonic_align文件夹,输入以下命令

python setup.py build_ext –inplace

正常情况下不会报错,如果报错检查生成工具或者是其环境变量的搭建。

如果出现“可能丢失数据”字样,并且该文件夹没有再嵌套一个monotonic_align文件夹,但是多出来了build文件夹,将build文件夹中的lib开头的文件夹中的monotonic_align文件夹移动到最外层的monotonic_align文件夹即可。

注意:Windows下build后的core不与Linux通用,如果更换平台需要重新build。

至此,环境的搭建完成。

修改项目文件(以训练中文模型为例)

config.json

首先根据configs文件夹中给出的例子生成一份属于自己的config.json放在此目录,在这里我们选择给出的chinese_base.json为例。

train部分:

eval_interval为保存间隔,这里按照默认的1000即可以满足保存的需求,设置过小会训练过程会耗费大量时间在保存上;设置过大如果训练出现问题无法满足及时保存最近的模型的需求。

epochs迭代次数,一般来说比较好的数据集质量不到一千就能出现效果,两千往上勉强可以使用,这里个人建议一万到两万效果最佳。

**batch_size一定要改!请按照你的显存酌情修改(否则开始训练就爆显存),6G大概为4左右,12G可以到16左右,以此类推。**建议后面尝试自行开跑训练,测试并设置合适自己的数值。

fp16_run半精度训练,一般按照默认开启即可,如果你对你的配置过于自信可以尝试关闭。

剩下的不用改动。

data部分:

前两行要改成我们前面保存list.txt和list_val.txt路径,即filelists/list.txt.cleaned和filelists/list_val.txt.cleaned

text_cleaners因为我们是中文模型,保持默认即可。

关于cleaned的后缀,加上就完了,后面我们预处理就会clean了。

n_speakers说话人数,因为我们是单人改为0即可。

cleaned_text保持默认的true即可,原因参考上上条。

如果是单人,speaker这行可以删掉,也可以随便填一个自定义的名字,无影响。

如果你不了解cleaner的工作机制,请不要动symbols,这里的Unicode是与前文的symbols.py保持一致的。

修改Cleaner

因为下载下来的项目代码默认cleaner并非是中文cleaner,所以我们需要处理一下py代码。

打开text文件夹下的symbols.py,注释掉japanese_cleaners2,去掉chinese_cleaners的注释。

修改后如下图所示:

接下来打开cleaners.py,注释掉与中文cleaner无关import

修改后如图下所示:

这样如果前面如果没有安装与中文无关的python依赖就不会报错了。

预处理

回到项目目录,打开preprocess.py

将第十行的english_cleaners2改为chinese_cleaners,这样预处理默认就是中文cleaner了。

打开conda终端,cd到项目目录,输入以下命令预处理txt文件(提示:路径以Windows为例,Linux斜杠用/):

python preprocess.py –text_index 1 –filelists 存放list.txt的目录\list.txt 存放list_val.txt的目录\list_val.txt

跑完预处理,就可以准备开始训练了。

修改train.py(仅Windows)

原train.py代码并不适合Windows跑(Linux请跳过此步),开跑会直接报nccl错,所以我们需要修改。

打开train.py

将67行的nccl改为gloo

开始训练(以单人模型为例)

打开conda终端,在项目目录中输入以下命令开始训练(仍以Windows下路径为例):

python train.py -c 你存放config.json的目录\config.json -m 你的自定义模型名

(最常见,自行摸索出的办法)如报错“RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss.”,打开train.py,如下图所示将104和105行模型的参数后加上find_unused_parameters=True

注:但是find_unused_parameters=True的设置会带来额外的运行时开销(而且还不小)。

动手能力强的朋友可以自行参考类似文章(https://zhuanlan.zhihu.com/p/592515484)对代码进行深一些的修改。

改后的代码如上图所示。

如果报错Broken pipe,请尝试重启电脑重试。

Linux下训练

Win下训练

如上图所示,如果正常saving保存pth文件以及Epoch迭代,那么就是在进行正常训练。Epoch后面的数字为迭代数。pth模型文件保存在项目文件夹上一级目录drive中的MyDrive文件夹中。自动保存会仅保留当前最新两次进度,所以不用担心占用过大空间。

TTS推理(仅Windows)

可以使用VITS模型的TTS软件有不少(MoeTTS、MoeGoe等等),这里以Cj大佬的MoeGoe为例。

前往(https://github.com/CjangCjengh/MoeGoe/releases)下载最新版的MoeGoe命令行版本(MoeGoe.7z),将其解压到任意目录。

接着前往(https://github.com/CjangCjengh/MoeGoe_GUI/releases)下载最新版相对应的GUI启动器(MoeGoe_GUI.exe),建议将启动器放到MoeGoe同目录。

然后打开MoeGoe_GUI.exe

如上图所示,打开文件选择MoeGoe解压目录中的MoeGoe.exe,打开模型选择前文中的pth模型文件(仅需要打开开头为G的)。打开配置选择模型同目录的config.json即可。

然后再语音合成中输入要合成音频的文本,参数设置可调节语速,选择说话人,选择保存路径就会自动开始TTS推理了。

有关MoeGoe其他功能可自行查看官方文档以及作者视频(https://space.bilibili.com/35285881)自行摸索。

各种报错

因为报错问题错综复杂,也根据不同人不同设备及环境而不同,本文提及的报错都为我们遇到过并已解决的,没有提及的我们也无能为力,但是欢迎在评论区补充或讨论。

欢迎关注同名公众号,解锁更多内容

使用 Hugo 构建
主题 StackJimmy 设计