从零开始的VITS教程

硬件需求

RAM 16G+
VRAM 6G+(显卡支持CUDA)

相关介绍

VITS原版
VITS(CjangCjengh版)
个人屑作
Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech

环境准备

安装Conda

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

选择合适你的电脑的版本。(Linux请自行搜索安装和配置方法,在此不再赘述。PS:都用Linux了,就不用我来教了吧)
安装路径可根据自己喜好,不建议C盘,因为之后虚拟环境和Python插件会比较占用空间。
此处添加到环境变量,根据个人使用需求而定,可以不勾选,因为之后教程均直接用Anaconda的终端而非Windows终端,环境变量无所谓。
安装完毕后打开开始中的Anaconda Powershell Prompt (Anaconda3)
输入Conda info查看Conda默认虚拟环境创建路径

下载项目

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

搭建VITS环境

新建conda虚拟环境:
conda create -n vits python=3.7
激活环境:
conda activate vits
接下来先安装torch(重要)
先确定显卡驱动,输入nvidia-smi
查看CUDA驱动是否正常以及CUDA版本。(CUDA驱动如果没有自行搜索下载安装)
torch一定要安装带有CUDA版本的且CUDA版本应低于你驱动的CUDA版本,其安装方法主要有三种:Conda在线安装、pip在线或本地安装。
本地安装,打开https://download.pytorch.org/whl/torch_stable.html下载pytorch和torchvision的whl安装包

个人建议选择比较新的稳定版本

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

之后在conda命令行cd到下载目录(cd 你的下载路径)输入以下命令:
pip install 你下载的安装包名字(带whl后缀)
等待安装完毕即可

安装相关依赖

(之前我们单独安装了torch 我的项目requirements.txt里面便没有包含torch相关库)
pip install -r requirements.txt

(Windows特定篇目)安装MSVC

打开https://visualstudio.microsoft.com/zh-hans/downloads/
下载安装visual studio installer
在installer中选择单个组件,搜索MSVC安装适合版本的生成工具(并非安装Visual Studio)

单调对齐搜索的构建

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

python setup.py build_ext --inplace

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

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

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

数据集准备

第一步 提取角色语音
首先需要一些材料,比如角色语音和角色文本,我们挑简单的来。

Galgame中的人物语音大都一句句分好了,非常适合使用。提取的过程可以使用GARbro软件提取游戏中的各类资源,比如voice.xp3。用GARbro提取不出来可以用krkrextract

注意:提取出的语音需转换成wav格式,单声道,采样率必须为22050Hz,PCM 16bit

第二步 获取台词文本
获取到台词文本即可。建议如果游戏文件中有scn.xp3文件,可以解包得到ks.scn文件,用FreeMoteToolkit转成json提取文件。如果实在没有办法获取原台词,可以尝试使用whisper听写台词。

用notepad新建一个文件,文件名取什么都行,比如list.txt。文件内容大致如下:

wavs/0013000.wav|です wavs/0013001.wav|です wavs/0013002.wav|です wavs/0013003.wav|です wavs/0013004.wav|です
左侧是语音文件的名称,后侧是对应的文本,用英文标点'|'分隔。文本文件中不能有空行,需要保存为UTF-8编码。文件名前面需要带"wavs/"前缀,或者也可以放其他目录。建议用默认的wavs目录,会省去一些不必要的配置麻烦

多人则为
wavs/A/001.wav|0|です。 wavs/A/002.wav|0|です。 wavs/B/001.wav|1|ます。 wavs/B/002.wav|1|ます。

音频处理

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

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

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

单声道、22050Hz,PCM 16bit

音频分割(转自B站 符号社Antigone)

接下来进行音频的分割处理(以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('写入已完成')

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

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非中文 需修改
打开text文件夹下的symbols.py,注释掉japanese_cleaners2,去掉chinese_cleaners的注释

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

预处理

回到项目目录,打开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

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

(Windows特定篇目)修改train.py

将67行的nccl改为gloo

开始训练(单人为例)

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

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

点赞
  1. C1en C1en说道:
    Google Chrome Windows 10
    :qian:

发表回复

电子邮件地址不会被公开。必填项已用 * 标注