0xMimic 发表于 2023-7-1 13:59:00

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

作者: 来源:稀土掘金

链接:https://juejin.cn/post/7196324326482968633

## 前言

本文主要讲述如何应用so-vits-svc快速生成AI歌曲,仓库地址:(https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Finnnky%2Fso-vits-svc "https://github.com/innnky/so-vits-svc")

主要通过autoDL平台租借GPU进行AI模型训练,邀请码地址:[www.autodl.com/register?co…](https://link.juejin.cn?target=https%3A%2F%2Fwww.autodl.com%2Fregister%3Fcode%3D179a6d82-4e5b-486e-8b1f-ec3afa54ed3a "https://www.autodl.com/register?code=179a6d82-4e5b-486e-8b1f-ec3afa54ed3a")

## 搭建训练环境

#### 本地搭建(小白不建议)

##### 硬件需求

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

##### 本地环境搭建参考

python = 3.8.10

pip = 22.3.1

pytorch = 1.13

##### so-vits-svc依赖安装

克隆代码到本地:

!(data/attachment/forum/202307/01/134852oith97z842c58m8i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



#### autoDL搭建(不用配环境)

##### 创建so-vits-svc实例

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

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cffb5bb8fa9b4b9babcf3a457e4bd8d8~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

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

!(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d3eff23e812c422e8555d0b68d107c23~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

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

##### vscode远程连接

本地安装好vscode

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

!(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/138e6b9e9c1c4b4f885a1addef5a8b69~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

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

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

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/191366e26ea7466fb034dd5bf38a975e~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

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

!(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/16960b0b052149b2bb1a939d2141b843~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

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

!(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d714a34f983b4e01a798161375675361~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

克隆so-vits-svc到本地

!(data/attachment/forum/202307/01/135010xjpmgvmrgfma6z6t.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



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

##### JupyterLab传输文件

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

参考文档:[www.autodl.com/docs/jupyte…](https://link.juejin.cn?target=https%3A%2F%2Fwww.autodl.com%2Fdocs%2Fjupyterlab%2F "https://www.autodl.com/docs/jupyterlab/")

## 训练准备工作

#### 预下载模型文件

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

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

!(data/attachment/forum/202307/01/135128pyt7ukniyayudtz4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



#### 准备数据集

##### 什么是数据集

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

##### 数据集要求

**格式为wav**

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

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

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

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

##### 上传数据集

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

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

!(data/attachment/forum/202307/01/135223t4pguup4dd1ounbd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



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

!(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d7ae3531dd834dc09fb8f5fcdfdbecff~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

#### 数据预处理

!(data/attachment/forum/202307/01/135335lbpgywfeff0wg7cy.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



**注意**

程序会在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**

#### 装载预训练模型

!(data/attachment/forum/202307/01/135436bzdp11g7q5h8p14h.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



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

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

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

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

### 开始训练AI

#### 为什么训练AI

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

!(data/attachment/forum/202307/01/135515y5578zs72aagv4zr.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



#### **训练注意点**

**训练前检查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…](https://link.juejin.cn?target=https%3A%2F%2Fwww.autodl.com%2Fdocs%2Fdaemon%2F "https://www.autodl.com/docs/daemon/")

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

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

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

!(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e059e86b0fd74501859825801b67bb94~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

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

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

### 推理

#### 什么是推理

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

#### 上传推理文件

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

!(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/364d1d44a0c546feb1a89dc8d09b4e14~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

#### 配置推理参数

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

我这里使用inference_main.py

!(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e45e8dd3b7d84907b81685d9a515eab9~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp?)

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

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

!(data/attachment/forum/202307/01/135624aq33lpyqtptd3ldd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")



### 如果重新训练

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

so-vits-svc/logs/32k

so-vits-svc/dataset_raw

so-vits-svc/configs

so-vits-svc/dataset

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

## 参考资料

so-vits-svc项目:(https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Finnnky%2Fso-vits-svc "https://github.com/innnky/so-vits-svc")

B站炼丹师**MasterSatori**的soVits3.0教程(注意他选择的是48k分支,而不是本教程的32k分支)(https://link.juejin.cn?target=https%3A%2F%2Fspace.bilibili.com%2F8407182%2Farticle "https://space.bilibili.com/8407182/article")

## 后话

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

vip76699 发表于 2024-1-16 16:05:21

so-vits-svc

dolphinbbqh 发表于 2024-1-31 00:40:22

感谢大佬分享

两眼丁真 发表于 2024-3-9 17:06:18

谢谢谢谢大佬分享的教程

安大卫 发表于 2024-3-15 15:07:29

感谢大佬这么详细的教程!
但我有一个问题始终不明白,都说这几年AI大爆发,但为什么使用AI做点东西这么难:L:L。可不可以让使用AI更AI一点:lol

xwhxwh 发表于 2024-10-4 19:14:07

666666666666
页: [1]
查看完整版本: 【人工智能】保姆级教学so-vits-svc快速生成AI歌曲