前言
本文主要讲述如何应用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,经济实惠
镜像选择"算法镜像",搜索"so-vits-svc",这是已经配好环境的镜像,可无需担心环境配置问题
创建成功后,选择"开机"
vscode远程连接
本地安装好vscode
vscode左侧栏"拓展"安装"Remote - SSH"
ctrl+shift+p调出用于执行命令的输入框
选择"Remote - SSH: Add new SSH Host..."
复制刚刚新建的容器实例的ssh登录指令,到vscode的命令输入框内,复制粘贴ssh链接密码,这样我们就建立好远程连接
选择"打开文件夹",选择"autodl-tmp"文件夹
克隆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:
数据预处理
#将数据集重采样至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等等即为训练完成的模型
如果训练完成后,想要继续增量训练, 修改 configs/config.json这个配置文件中的epoch,再次执行 开始训练 即可
不过不能中途添加删改数据集
推理
什么是推理
推理就是使用训练出来的模型,向模型输入需要的内容,经模型处理后输出内容。比如,我现在已经获得了”周董的歌喉“,那么我需要《富士山下》的bgm+歌词,就能唱出”周董版的《富士山下》“
上传推理文件
通过JupyterLab,将需要推理的文件上传到/so-vits-svc-32k/raw/,比如我这里上传了yhx.wav
配置推理参数
可以使用inference.ipynb推理。也可以通过inference_main.py 推理
我这里使用inference_main.py
如图,需要配置的内容有:
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项目,也感谢这么多大佬在社区提供教程,祝各位炼丹师玩的开心~