【人工智能】保姆级教学so-vits-svc快速生成AI歌曲

13,621 阅读8分钟

前言

本文主要讲述如何应用so-vits-svc快速生成AI歌曲,仓库地址:github.com/innnky/so-v…

主要通过autoDL平台租借GPU进行AI模型训练,邀请码地址:www.autodl.com/register?co…

搭建训练环境

本地搭建(小白不建议)

硬件需求

N卡,建议GPU达到GTX 3080显存8G以上。A卡应该是跑不了,只能通过CPU去跑了(AMD,no!)

本地环境搭建参考

python = 3.8.10

pip = 22.3.1

pytorch = 1.13

so-vits-svc依赖安装

克隆代码到本地:

git clone https://github.com/innnky/so-vits-svc.git

安装所需依赖:

pip install -r requirements.txt

autoDL搭建(不用配环境)

创建so-vits-svc实例

注册账号,右上角进入"控制台",选择左侧栏“容器实例”,选择“租用新实例”,按照自己需求租用GPU。建议A4000,经济实惠

1.jpg

镜像选择"算法镜像",搜索"so-vits-svc",这是已经配好环境的镜像,可无需担心环境配置问题

2.jpg

创建成功后,选择"开机"

vscode远程连接

本地安装好vscode

vscode左侧栏"拓展"安装"Remote - SSH"

5.jpg

ctrl+shift+p调出用于执行命令的输入框

选择"Remote - SSH: Add new SSH Host..."

3.jpg

复制刚刚新建的容器实例的ssh登录指令,到vscode的命令输入框内,复制粘贴ssh链接密码,这样我们就建立好远程连接

4.jpg

选择"打开文件夹",选择"autodl-tmp"文件夹

6.jpg

克隆so-vits-svc到本地

cd /root/autodl-tmp/
git clone https://github.com/innnky/so-vits-svc.git

注意:其实autoDL上的so-vits-svc镜像在根目录里已经有一个so-vits-svc的文件夹,但是那份代码是48k分支的,我们用32k,所以可以直接无视那份代码。所以这里我选择了在读写相对较快的autodl-tmp数据盘里,重新克隆so-vits-svc代码,以此为项目根目录进行后面的模型训练和推理。

JupyterLab传输文件

autoDL控制台容器页面还有一个文件管理工具:JupyterLab,通过这个工具,我们可以自由远程传输训练所需要的训练集和其他文件

参考文档:www.autodl.com/docs/jupyte…

训练准备工作

预下载模型文件

  • soft vc hubert:hubert-soft-0d54a1f4.pt
    • 放在hubert目录下
  • 预训练底模文件:G_0.pth与D_0.pth
    • 放在logs/32k 目录下
    • 预训练底模为必选项,因为据测试从零开始训练有概率不收敛,同时底模也能加快训练速度
    • 预训练底模训练数据集包含云灏 即霜 辉宇·星AI 派蒙 绫地宁宁,覆盖男女生常见音域,可以认为是相对通用的底模
    • 底模删除了optimizer speaker_embedding 等无关权重, 只可以用于初始化训练,无法用于推理
    • 该底模和48khz底模通用

这3个文件也可以手动通过JupyterLab上传到对应位置

# 一键下载
# hubert
wget -P hubert/ https://github.com/bshall/hubert/releases/download/v0.1/hubert-soft-0d54a1f4.pt
# G与D预训练模型
wget -P logs/32k/ https://huggingface.co/innnky/sovits_pretrained/resolve/main/G_0.pth
wget -P logs/32k/ https://huggingface.co/innnky/sovits_pretrained/resolve/main/D_0.pth

`在vscode终端,依次执行这3条指令,它将直接在当前目录下载所需文件,并存放到对应目录:hubert-soft-0d54a1f4.pt,G_0.pth,D_0.pth

准备数据集

什么是数据集

数据集是语音文件集合。比如我想生成的AI能用周董的声音唱《富士山下》,那么我们现在就需要准备周董的语音数据,让AI"学习"

数据集要求

格式为wav

需要至少600条以上的数据集

每条语音时常最好在5-15s之间

您所提供的数据集应当尽量无杂音(即没有BGM、混响或者和声),如果您无法找到这样的数据,那么您所训练出来的模型会拥有包括但不限于:自带混响、自带鼓点、自带底噪、输出音频糊成一团等“额外功能”,因此您应当尽力提高音频的质量

一般来说,数据集"更重质,而不是量",好的数据集能够达到更好的效果。如果数据集是像游戏内解包的角色语音无损音源,那么效果更好

上传数据集

通过JupyterLab,通过文件上传将数据集按如下结构放入dataset_raw文件夹

即使只有一个说话人,也必须将数据集放入 speaker0 !

dataset_raw

├───speaker0

│ ├───xxx1-xxx1.wav

│ ├───...

│ └───xxx-0xx8.wav

└───speaker1
│ ├───xx2-0xxx2.wav

│ ├───...

│ └───xxx7-xxx007.wav

当然,speaker0只是一个替代名,一个speaker0代表一种人声,你可以选择不同的文件夹名称,比如我这里的nahida:

9.jpg

数据预处理

#将数据集重采样至32khz
python resample.py
#自动划分训练集 验证集 测试集 以及自动生成配置文件
python preprocess_flist_config.py

注意

程序会在so-vits-svc/configs目录下生成config.json配置文件,内部包含训练的所有信息

自动生成的配置文件中,说话人数量n_speakers会自动按照数据集中的人数而定

为了给之后添加说话人留下一定空间,n_speakers自动设置为 当前数据集人数乘2

如果想多留一些空位可以在此步骤后 自行修改生成的config.json中n_speakers数量

一旦模型开始训练后此项不可再更改

建议

将config.json下载下来修改

按照训练集大小修改"epochs"参数,如1000条语音的参考epoch大约是400

根据显存大小调节"batch_size"。默认值12推荐16gb以上显存的显卡运行。若显存不足可尝试调低此参数

修改batch_size应当同步修改"learning_rate" 它应当与batch_size成正比

其他参数不建议修改

将修改后的config覆盖原来的config

装载预训练模型

#生成hubert与f0
python preprocess_hubert_f0.py
#如果这一步执行成功,那么恭喜你,准备工作快完成了

这一步是必须的,利用预训练模型可以加快训练速度 防止不拟合

初次训练前已经预先安装了预训练模型,若后续要重新训练

请手动清空so-vits-svc/logs/32k文件夹

将pre_train_model目录下的所有文件复制到so-vits-svc/logs/32k文件夹中

开始训练AI

为什么训练AI

训练AI的目的是得出模型,比如我想通过周董音色唱粤语歌,这一步就是为了得到"周董的歌喉"

#开始训练
python train.py -c configs/config.json -m 32k

训练注意点

训练前检查log/32k下是否有G_0.pth和D_0.pth两个底模文件,底模训练数据集包含云灏 即霜 辉宇·星AI 派蒙 绫地宁宁,覆盖男女生常见音域,提高训练效果"

训练日志保存在so-vits-svc/logs/32k下的train.log中

训练默认使用单精度进行 使用半精度效果未知

单精算力的 27.77 TFLOPS的A5000显卡 在29条语音的测试训练集下每epoch耗时20秒 可估算得每处理一条条语音需要进行17TFLOP

A5000平均每小时处理5220次语音

请根据自己的训练集大小和epoch自行估算耗时,充值足够的余额,以免训练中断

训练提示

长时间训练请开启守护进程 教程参考www.autodl.com/docs/daemon…

训练完成后,可见终端显示模型已经保存的字样

模型会保存在so-vits-svc/logs/32k/h

如下图G_0.pth和D_0.pth等等即为训练完成的模型

8.jpg

如果训练完成后,想要继续增量训练, 修改 configs/config.json这个配置文件中的epoch,再次执行 开始训练 即可

不过不能中途添加删改数据集

推理

什么是推理

推理就是使用训练出来的模型,向模型输入需要的内容,经模型处理后输出内容。比如,我现在已经获得了”周董的歌喉“,那么我需要《富士山下》的bgm+歌词,就能唱出”周董版的《富士山下》“

上传推理文件

通过JupyterLab,将需要推理的文件上传到/so-vits-svc-32k/raw/,比如我这里上传了yhx.wav

10.jpg

配置推理参数

可以使用inference.ipynb推理。也可以通过inference_main.py 推理

我这里使用inference_main.py

11.jpg

如图,需要配置的内容有:

model_path:模型位置。可以在/logs/32k/文件夹里选择D_0.pth到D_6000.pth 或者 G_0.pth到G_6000.pth,后面的数字越大,则是越后导出的模型,模型迭代次数越多(建议使用G开头的,选择效果好的

clean_name:修改为要推理转换的wav文件名 文件存放在raw文件夹

trans:音高

spk_list:每次同时合成多语者音色。在数据集存放的文件夹/dataset_raw/内,数据集存放在speaker0文件夹训练音色的就填写speaker0

#用脚本推理 使用ipynb请忽略此条
python inference_main.py 
#推理结果会存放在so-vits-svc/results文件夹

如果重新训练

每次重新训练新的模型 都需要清空旧的训练集和模型,请手动删除:

so-vits-svc/logs/32k

so-vits-svc/dataset_raw

so-vits-svc/configs

so-vits-svc/dataset

中的所有文件,并重新上传数据集

参考资料

so-vits-svc项目:github.com/innnky/so-v…

B站炼丹师MasterSatori的soVits3.0教程(注意他选择的是48k分支,而不是本教程的32k分支)space.bilibili.com/8407182/art…

后话

感谢作者开源了这么好玩的AI项目,也感谢这么多大佬在社区提供教程,祝各位炼丹师玩的开心~

zha.jpg

vscode.jpg