欢迎光临散文网 会员登陆 & 注册

vits声音合成-本地部署(windows)-自己组合ai的第二步

2023-04-05 00:06 作者:不想起名字的雨狼  | 我要投稿

这些是vits的衍生版本(没有配置使用过):

https://github.com/PlayVoice/vits_chinese(不是教程版本)

https://github.com/Plachtaa/VITS-fast-fine-tuning(小白的最好选择)

https://github.com/svc-develop-team/so-vits-svc(三方维护衍生版)


本文档基于:

windows11

CUDA 12.1

Anaconda

Anaconda对于配置单个AI可有可无,这是用来用于虚拟多个python环境,防止之后组合别的ai出现环境和包不匹配导致安装多AI失败的情况,比如拟声鸟需要的是python3.9,而stablediffusion需要的是python3.10,以及各个包之间会有相同的依赖库但版本不同

nccl(无法在windows运行),windows使用的是gloo(无需下载文件)

Cmake(需要先下载microsoft visual studio【社区版就行(community)】)

FFmpeg

显卡2080ti(很慢,1500的训练用了一天,一般建议配置不好的各位后面配置config.json的时候填的虽然是10000,但可以在1500左右就使MogGoeGUI跑一下,一般好的训练材料已经可以出效果了)

开始(前置准备):

【这版教程很匆忙,我没有设置网盘资源】


查看当前电脑的CUDA版本:

打开“命令提示符(CMD)”

输入nvidia-smi

531.41为驱动版本,12.1为CUDA版本


下载所用文件:

下载vits项目(Github)

https://github.com/jaywalnut310/vits(原版,非教程版,步骤差不多,但是缺少对于中文的支持,动手能力强的可以自己修改其中代码增加对于中文的支持,尤其是symbol.py和cleaner.py)

github.com/CjangCjengh/vits(Cj中文版vits【大部分改动在对于中文的处理上】)


下载AnaConda(Windows):

https://www.anaconda.com (主页)

https://repo.anaconda.com/archive/Anaconda3-2023.03-Windows-x86_64.exe

https://mirrors.bfsu.edu.cn/anaconda/(北京外国语大学开源软件镜像站)



msvc:

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



下载pytorch文件(以防各种莫名其妙的pytorch报错):

命令行方式:https://pytorch.org/get-started/locally/

Pytorch下载:

https://download.pytorch.org/whl/ (所有库下载)

pytorch:

https://download.pytorch.org/whl/torch

cp:python版本(cp310=python3.10版本)

cu:cuda版本(cu118=cuda11.8版本)     使用显卡

cu118可以适用于cuda12.1版本

cpu:cpu版本    使用CPU

cpu版本适用于显卡显存不足6g的电脑

2.0.0为最新版本

Pytorch Audio

https://download.pytorch.org/whl/torchaudio

Pytorch Vision

https://download.pytorch.org/torchvision/



CUDA下载(CUDA Toolkit):

https://developer.nvidia.com/cuda-downloads 


Git下载(梯子在这个项目中非常重要,最好有梯子):

https://git-scm.com/downloads

需要的软件:

shotcut(导出音频文件):

https://www.shotcut.org


buzz(语音转文字,安装运行,基于openai的whisper,我项目里直接使用的代码制作训练集,放置于评论区)

https://github.com/chidiwilliams/buzz/releases/tag/v0.7.2


audio-slicer(视频切片,.exe文件运行,可以多切几次弄多一点训练材料,参数自己调整,最好每一条都在5秒以内)

https://github.com/flutydeer/audio-slicer/releases/tag/v1.1.0


Espeak:

https://github.com/espeak-ng/espeak-ng/releases/tag/1.51(只在环境变量中用到)


FFmpeg:

https://github.com/BtbN/FFmpeg-Builds/releases(win,文件大小126M的版本,只在环境变量中用到)


MoeGoeGUI:

https://github.com/CjangCjengh/MoeGoe_GUI/issues(用于使用训练好的模型)


配置环境变量:

按照自己的安装路径修改

PHONEMIZER_ESPEAK_LIBRARY

PHONEMIZER_ESPEAK_PATH


环境变量(path中):

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp

D:\Microsoft\Microsoft Visual Studio\Visual Studio\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin

C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\

C:\Program Files\NVIDIA Corporation\Nsight Compute 2023.1.0\

D:\Microsoft\Microsoft Visual Studio\Visual Studio\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin

假设我的项目路径在

C:\Users\用户名\Desktop\AIS\vits-main\


Vits配置安装:

使用anaconda prompt

conda create -n 名字 想要安装的包(=指定版本) 

首先使用conda创建一个3.9的python环境

示例:

conda create -n vits python=3.9 

激活python环境

conda activate 你的环境名字

基础环境base

示例:

conda activate vits

激活的vits环境

cd 你的项目文件夹路径(之后操作只有安装依赖文件会改变路径到monotonic_align下)

示例:

cd C:\Users\用户名\Desktop\AIS\vits-main\


pip install 下好的torch,torchaudio,torchvision文件路径

示例:

pip install C:/torch.whl

由于我们安装好了pytorch,就不使用它自带的老版本了容易出错,所以我们需要修改安装依赖文件

requirement.txt文件内容修改为:

Cython==0.29.21

librosa==0.8.0

matplotlib==3.3.1

numpy==1.18.5

phonemizer==2.2.1

scipy>=1.5.2(可能是python版本问题导致无法安装1.5.2只能安装大于1.5.2的版本)

tensorboard==2.3.0

Unidecode==1.1.1

anaconda prompt在项目文件夹路径下输入

pip install -r requirement.txt


修改项目文件(极度重要【中文训练】),尽量避免之后的报错:

都是项目文件夹下

train.py

52行【原版需要修改】:

os.environ['MASTER_PORT'] = '8000'

67行【windows修改,nccl在windows用不了】:

dist.init_process_group(backend='gloo', init_method='env://', world_size=n_gpus, rank=rank)

104行【问题在下面】:

net_g = DDP(net_g, device_ids=[rank],find_unused_parameters=True)

105行【同104】:

net_d = DDP(net_d, device_ids=[rank],find_unused_parameters=True)



preprocess.py

这个文件中可以不用设置,但在使用预处理命令时需要加上参数

9行【设置为你制作好的数据集文件,_val文件是校验集】:

parser.add_argument("--filelists", nargs="+", default=["filelists/list.txt", "filelists/list_val.txt"])

10行【中文版设置,原版训练英文的不用管】:

parser.add_argument("--text_cleaners", nargs="+", default=["chinese_cleaners"])


mel_processing.py

pytorch包太新了导致的

66行,67行【onesided=True后增加,return_complex=False】

spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device],center=center, pad_mode='reflect', normalized=False, onesided=True,return_complex=False)

104行,105行【onesided=True后增加,return_complex=False】

spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], center=center, pad_mode='reflect', normalized=False, onesided=True,return_complex=False)


utils.py

146行,147行【default中为训练时的config.json文件位置,可以不设置,训练的时候可以使用-c参数配置】

parser.add_argument('-c', '--config', type=str, default="./configs/base.json",help='JSON file for configuration')

146行,147行【help中为训练设置的模型名,可以不设置,训练的时候可以使用-m参数配置】

  parser.add_argument('-m', '--model', type=str, required=True,help='Model name')

152行【训练设置的模型名是个文件夹,在这个文件夹下,实际用到的是G_*.pth这个文件】

model_dir = os.path.join("../drive/MyDrive", args.model)


datautils.py

323行【不设置一定报错】

for i in range(len(buckets) - 1, -1, -1):


训练材料(炼丹材料)和list.txt放置方式以及config配置:

基于https://www.bilibili.com/read/cv21153903

训练集制作【最好没有背景杂音】

下载视频,然后使用Shotcut导出为wav,一定要是单声道不然训练容易报错

点击输出

参数为:采样22050Hz,16bit(16位),单声道

然后打开audio-slicer:


然后弹出界面,配置参数:

左上点击选择文件

参数:

Threshold(dB):低于这个分贝就会切割

Minimum Length(ms):最小的切割长度

Minimum Interval(ms):最小的切割间隔

Hop Size(ms):粗略理解为精确度(10-20就行了)

Maximum Silence Length(ms):最大沉默(无声)时间

最后这个是输出目录

进度条到100%就去文件夹里看看

【假设我导出的文件夹在C:\Users\用户名\Desktop\AIS\Vedios】


然后使用buzz(没有批量导出,批量导出还是自己想办法或者用python自己写,有人需要的话评论区留言,下一期我就写whisper的配置以及在python中的使用)

点击+号导入文件,可以按住shift批量选,

Tiny改选medium(模型,这个软件用的是CPU)

Language:选中文(其他语言也可以)

点击run就行


这样就是完成

双击这条数据,然后右下角选TXT导出到文件夹中,作为训练音频的文本数据

【假设我导出的文件夹在C:\Users\用户名\Desktop\AIS\Txt】



然后制作两个文件,文件名随意,但一个是训练集一个是验证集,而且是txt文件(无BOM头),不然训练时会报错,文件中的格式参考官方【两个文件格式一样】

【官方为多人多训练数据格式】

黄色:audio-slicer切割好的wav音频文件路径(绝对路径最好,相对路径会计算也可以)

绿色:说话人数大于一个人时设置,第一个说话的为0,第二个为1以此类推(只有一个人时不写)

天蓝色(湖蓝色):文字语言类型(可以不写)

橙色:音频文本(涉及训练质量)

紫色:文字语言类型(可以不写)

【单个人说话的基本格式】(|:分割符)

音频文件路径|音频文本

示例:

C:\Users\用户名\Desktop\AIS\Vedios\test.wav|示例文本

(默认说话人为0)

【假设我导出的文件夹在C:\Users\用户名\Desktop\AIS\vits-main\filelist】

文件名为【list.txt,list_val.txt】

文件路径为:

【C:\Users\用户名\Desktop\AIS\vits-main\filelist\list.txt】

【C:\Users\用户名\Desktop\AIS\vits-main\filelist\list_val.txt】



训练参数文件:

以下操作全在

【C:\Users\用户名\Desktop\AIS\vits-main\】文件夹下(假设的项目文件夹)


config下创建文件(原版基于ljs_base.json,中文版基于chinese_base.json)

【可以复制粘贴然后直接改名】,文件名自定义:

【假设文件名:chinese_config.json】

重要训练参数:

查看中文版官方给的chinese_base.json为例


eval_interval【保存间隔】:

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

epochs【迭代次数】:

比较好的数据集训练1500次就能出现效果,2000已经勉强可以使用,这里建议一万到两万效果最佳,但是那是显卡好的情况,差的话可能要训练好几天,甚至一个月。

batch_size【使用显存,4:6GB,6:10GB】

(除非富哥或者租卡的,不然不设置就等着一直爆显存了):

请按照你的显存酌情修改,否则开始训练就爆显存。

fp16_run【半精度训练】:

默认开启即可,配置足够优秀可以尝试关闭。

data部分:

training_files:训练数据文本文件preprocess(预处理)后文件路径

示例:

C:\Users\用户名\Desktop\AIS\vits-main\filelist\list.txt.cleaned

validation_files:训练数据验证文件preprocess(预处理)后文件路径

示例:

C:\Users\用户名\Desktop\AIS\vits-main\filelist\list_val.txt.cleaned

text_cleaners【text文件夹下cleaner.py中的def方法,就是这里的名称】

n_speakers【说话人数】:

单人改为0

cleaned_text【保持默认的true即可】

【假设配置文件路径:C:\Users\用户名\Desktop\AIS\vits-main\config\chinese_config.json】

开始训练:

回到anaconda prompt:


通用方式(中英文版都行)


按照官方给的方式使用:

安装训练依赖:

切换到项目下的monotonic_align文件夹

cd monotonic_align 

python setup.py build_ext --inplace

小坑:

monotonic_align下还要建立一个文件夹叫monotonic_align,不然报错


回到项目文件夹:

cd ..


预处理:

python preprocess.py --text_index 1 --filelists 两个list.txt文件的位置,中间用空格分开

示例:

python preprocess.py --text_index 1 --filelists C:\Users\用户名\Desktop\AIS\vits-main\filelist\list.txt C:\Users\用户名\Desktop\AIS\vits-main\filelist\list_val.txt


训练

python train.py -c 自定义config.json文件路径 -m 输出后的model名称

# LJ Speech(常用)

python train.py -c configs/ljs_base.json -m ljs_base

示例:

python train.py -c C:\Users\用户名\Desktop\AIS\vits-main\config\chinese_config.json -m TestModel【之前文件设置过的话直接python train.py就行了】


# VCTK

python train_ms.py -c configs/vctk_base.json -m vctk_base

示例:

python train_ms.py -c C:\Users\用户名\Desktop\AIS\vits-main\config\chinese_config.json -m TestModel【之前文件设置过的话直接python train_ms.py就行了】



训练模型使用

====> Epoch:1【显示这个就是开始训练了】

 训练模型存放位置默认为项目文件的上一级文件夹的drive文件夹中

打开MoeGoe

打开文件是他自己的.exe

打开模型选择【G_数字.pth】

示例:G_81000.pth

打开配置选择【config.json】

config.json是在训练后的模型这个文件夹中的,不要选项目文件夹中的那个,虽然文件格式一样,但就怕出bug

然后说话人选之前文本中设置过的,单人为0

点击保存,保存后的文件为wav文件



问题总览:

包问题【No module named】(一律使用pip解决)

No module named 'numpy.random.bit_generator'

pip install numpy==1.19.3

TypeError: Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0. If you cannot immediately regenerate your protos, some other possible workarounds are: 1. Downgrade the protobuf package to 3.20.x or lower. 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

pip install protobuf==3.20.0


问题:

ValueError: port must have value from 0 to 65535 but was 80000.

解决方法:

修改train.py或train_ms.py文件

  os.environ['MASTER_PORT'] = '80000'

改为没被占用的端口号(80,3306,22,21,20,443等常用端口不要去设置,比如:网页常用端口,后端和数据库常用端口,应用服务已占用端口如微信、MC服务器等,服务占用的端口,数据库常用端口,文件传输常用端口,各种协议如邮件传输协议的常用端口等端口,一定需要避免设置这些端口,且范围控制在0~65535中)

例子:os.environ['MASTER_PORT'] = '5321'


问题:

导致vits在windows上无法一次启动的原因:

RuntimeError("Distributed package doesn't have NCCL " "built in")

RuntimeError: Distributed package doesn't have NCCL built in

解决方法:

(Linux)

https://developer.nvidia.com/nccl

https://docs.nvidia.com/deeplearning/nccl/install-guide/index.html

(windows)

修改train.py或者train_ms.py文件

init_process_group(backend="gloo", init_method="env://")


问题:

opencc的包导入问题

解决方法:

注释所有text文件夹中使用opencc的地方,因为很难装,有成功装好的希望给出解决方式在评论区


问题:

NotImplementedError: Only 2D, 3D, 4D, 5D padding with non-constant padding are supported for now 

解决方法:

重新制作数据集,数据集需要是22050Hz,16bit,单声道(重要!!!)


问题:

stft will soon require the return_complex parameter be given for real inputs, and will further require that return_complex=True

解决方法

修改mel_processing.py文件

spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[str(y.device)], center=center, pad_mode='reflect', normalized=False, onesided=True,return_complex=False)

在出现STFT处增加False消除警告


问题

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或者train_ms.py文件

将104和105行模型的参数后加上find_unused_parameters=True

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


其他问题解决方案:

https://www.bilibili.com/read/cv22206231/(多错误集合)

https://www.bilibili.com/read/cv21153903(很有用)

https://github.com/jaywalnut310/vits/issues(github评论区)










vits声音合成-本地部署(windows)-自己组合ai的第二步的评论 (共 条)

分享到微博请遵守国家法律