小米笔记 - 坏记性不如烂笔头

Sovits4训练AI翻唱

今天要介绍的是训练AI翻唱,使用的是 so-vits-svc ,一个歌声音色转换模型,通过SoftVC内容编码器提取源音频语音特征,与F0同时输入VITS替换原本的文本输入达到歌声转换的效果。

项目地址:https://github.com/svc-develop-team/so-vits-svc

本文将从 制作数据集,训练模型,推理模型 三个部分来介绍使用方法,最后还会提出一些优化建议可供参考。

制作数据集

我们需要先准备数据集,网上很多各种歌手的训练,我也不知道训练啥,就直接训练一个自己的声音吧,先找一些自己唱的歌,然后【提取出人声】,【将人声分段】

提取人声

分离人声和伴奏有很多方法,我这边推荐几种方式:

ultimatevocalremovergui可直接在电脑安装,但对电脑有一定的要求,达到要求的可以直接下载安装使用:

我这边找了40首歌曲,先直接使用 Ultimate-Vocal-Remover-Colab 来处理

先将colab脚本复制到自己的云端硬盘,然后再来操作

勾选上MountDrive,然后点击运行

允许连接到 Google Drive,UVR 就会安装在 Google Drive 中了,下次就可以直接启动,不用再次下载安装了。

等待一会儿,安装好后,打开文件列表,VocalRemover5-COLAB_arch 就是安装目录了,tracks 文件夹中放入需要分离人声的音频,可以先放一个测试下,测试好参数再将所有文件一起处理。

我这边之前就上传了很多音频了,你可以先上传一个音频到 tracks 文件夹中,

运行 Print a list of tracks and models

我这边尝试处理分离一下 anmiaoyao.mp3 这段音频

然后这里有个小问题,需要在 Inference 前新增这一个语句,然后运行下

!pip install librosa==0.9.1

不然后面处理会报这个错误:

开始处理

Input 中填入要处理的音频文件名,需要带上后缀名,模型我选择一个vocal模型,然后勾选上 isVocal 选项,其它不变,然后点击左上角运行

运行结果如下说明成功:

然后 separated 中就有分离的人声和伴奏了,就可以下载试听了,分离流程就是这样的了。

效果不错的话就可以上传所有要处理的音频到 tracks 文件夹中了,然后再次处理。

input 留空,然后勾选上 convertAll ,就会将 tracks 中所有文件批量处理了,下面还是要勾上 isVocal

然后再次运行,等待批量处理完成,将 separated 文件夹下载到本地,删除所有伴奏音频,只留下人声音频。然后就要开始进行人声音频分段了。

音频分段

直接使用开源框架 audio-slicer: flutydeer/audio-slicer: A simple GUI application that slices audio with silence detection (github.com)

Windows可以直接下载安装包。

Mac电脑需要 pull 项目到本地,下载依赖:

pip install -r requirements.txt

运行:

python slicer-gui.py

将要分割的音频拖入task list中,选择好Output Directory,默认参数第一次处理不用修改,

第一次处理后,按文件大小倒序排列,找出大于20秒的音频(稍微长点也无伤大雅,实在太长可能会导致训练中途甚至预处理就爆显存),再次使用软件处理,调低Minimum Interval 和 Maximum Silence Length,比如分别调到 100 和 500 ,再次运行处理,如果还是大于20秒,大概率是人声训练集本身就很嘈杂,可以直接删掉。

总之,小于20秒的所有人声音频就是我们的训练数据集了,下面就开始训练模型了。

软件的参数含义如下:

Threshold(阈值)

以 dB 表示的 RMS 阈值。所有 RMS 值都低于此阈值的区域将被视为静音。如果音频有噪音,请增加此值。默认值为 -40。

Minimum Length(最小长度)

每个切片音频剪辑所需的最小长度,以毫秒为单位。默认值为 5000。

Minimum Interval(最小间距)

要切片的静音部分的最小长度,以毫秒为单位。如果音频仅包含短暂的中断,请将此值设置得更小。此值越小,此应用程序可能生成的切片音频剪辑就越多。请注意,此值必须小于 min length 且大于 hop size。默认值为 300。

Hop Size(跳跃步长)

每个 RMS 帧的长度,以毫秒为单位。增加此值将提高切片的精度,但会降低处理速度。默认值为 10。

Maximum Silence Length(最大静音长度)

在切片音频周围保持的最大静音长度,以毫秒为单位。根据需要调整此值。请注意,设置此值并不意味着切片音频中的静音部分具有完全给定的长度。如上所述,该算法将搜索要切片的最佳位置。默认值为 1000。

训练模型

将处理好的数据集音频,放入一个文件夹压缩,我处理后的数据集接近800个音频。

打开sovits来训练模型,我这边使用Colab来训练模型,你如果本地有条件也可以本地执行,本地执行文档中也有说明,打开链接:

https://github.com/svc-develop-team/so-vits-svc/blob/4.1-Stable/README_zh_CN.md#%E7%89%B9%E5%BE%81%E6%A3%80%E7%B4%A2

打开colab ipynb后,先复制到自己的云端硬盘,再来操作

然后按步骤一步步执行即可:

Connect to colab runtime and check GPU

直接执行,要使用GPU运行哦

Clone repository and install requirements

克隆项目,安装依赖,直接执行(以后每次执行程序都要运行一下)

Mount google drive and select which directories to sync with google drive

挂载 Google 硬盘,后面要同步项目信息到 Google 硬盘,会有一些授权提示操作要做,全部选允许。(以后每次执行程序都要运行一下)

Get pretrained model(Optional but strongly recommend)

下载预训练底模文件,墙裂建议使用。

从svc-develop-team(待定)或任何其他地方获取Sovits底模

扩散模型引用了Diffusion-SVC的Diffusion Model,底模与Diffusion-SVC的扩散模型底模通用,可以去Diffusion-SVC获取扩散模型的底模

虽然底模一般不会引起什么版权问题,但还是请注意一下,比如事先询问作者,又或者作者在模型描述中明确写明了可行的用途

Dataset preprocessing

数据集处理,先将我们之前数据集压缩包上传到 Google Drive 的 sovits4data 文件夹中,将数据集按照下面的目录格式上传到 dataser_raw 目录中

我们执行下面的解压方法,解压我们的数据集到 dataser_raw 目录

但是,目前不满足文件夹格式要求,我们需要改成下图这样,你也可以在本地按照这种方式弄好了再上传, mi 文件夹官方的定义是 speaker,不同的说话人就用不同的文件夹隔离。

Resample to 44100Hz and mono

重采样至44100Hz单声道,直接运行

Divide filelists and generate config.json

自动划分训练集、验证集,以及自动生成配置文件,直接运行

speech_encoder选择请看:https://github.com/svc-develop-team/so-vits-svc/blob/4.1-Stable/README_zh_CN.md#2-%E8%87%AA%E5%8A%A8%E5%88%92%E5%88%86%E8%AE%AD%E7%BB%83%E9%9B%86%E9%AA%8C%E8%AF%81%E9%9B%86%E4%BB%A5%E5%8F%8A%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6

Generate hubert and f0

生成hubert与f0,直接运行(以后每次执行程序都要运行一下)

f0_predictor拥有四个选择

crepe
dio
pm
harvest

如果训练集过于嘈杂,请使用crepe处理f0

如果省略f0_predictor参数,默认值为dio

尚若需要浅扩散功能(可选),需要增加--use_diff参数,比如

python preprocess_hubert_f0.py --f0_predictor dio --use_diff

执行完以上步骤后 dataset 目录便是预处理完成的数据,可以删除 dataset_raw 文件夹了

Save the preprocessed dataset to google drive

保存预处理的数据到 Google Drive

Unzip preprocessed dataset from google drive directly if you have preprocessed already.

解压数据到当前运行环境。第一次运行不需要执行,主要用于后面再次运行,数据还原使用,就不用再次处理数据。上一步可理解为备份数据,这一步是还原数据。(以后每次执行程序都要运行一下)

主模型训练

配置文件为:configs/config.json,可根据自己的需求修改训练配置

Train cluster model (Optional)

聚类音色泄漏控制。

介绍:聚类方案可以减小音色泄漏,使得模型训练出来更像目标的音色(但其实不是特别明显),但是单纯的聚类方案会降低模型的咬字(会口齿不清)(这个很明显),本模型采用了融合的方式,可以线性控制聚类方案与非聚类方案的占比,也就是可以手动在"像目标音色" 和 "咬字清晰" 之间调整比例,找到合适的折中点

使用聚类前面的已有步骤不用进行任何的变动,只需要额外训练一个聚类模型,虽然效果比较有限,但训练成本也比较低

Train diffusion model (Optional)

训练扩散模型,如果需要浅扩散功能,就需要训练(强烈建议使用)。

模型训练结束后,模型文件保存在logs/44k目录下,扩散模型在logs/44k/diffusion下,我的主模型训练了5万多 epoch。

推理

直接执行

开始推理

上传人声音频(人声音频怎么提取看本文后面使用UVR部分)到 sovits4data/raw/ 文件夹,开始推理

推理完成就会直接下载了。将推理出的原生和伴奏一起听一下效果如何。

关于模型训练到什么程度就OK

我自己感觉主要靠听,我训练到10000步的时候我感觉就能听了,到40000步的模型,我个人感觉比50000步的效果要好。

关于怎么提取人声效果比较好

提取人声首推UVR:Anjok07/ultimatevocalremovergui: GUI for a Vocal Remover that uses Deep Neural Networks. (github.com)

UVR有庞大的模型库,在 Download Center 中下载了,具体的使用方法不详细赘述,有感兴趣的可以自行检索合适的模型。

简单单一模型可以下载使用 3_HP-Vocal_UVR 模型,选好音频和输出目录,直接 Start Processing 即可,结果就会输出人声和伴奏两个音频文件了。

还可以多个模型一起结合使用,选择 Ensemble mode 合奏模式

我这里推荐的参数,大家也可以自行尝试,有更好的也欢迎提出:

模型(需要提前下载好):

分离模式:Vocals/Instrumental

合并算法:Min/Max 或者 Min/Min

你会发现提取出的声音还是会有和声,但是和声对模型推理有很大的影响,我的方案是,将分离出的人声使用RipX软件,来进行修正,删除和声部分,再去推理效果就会好很多。

效果演示

参考资料

so-vits-svc/README_zh_CN.md at 4.1-Stable · svc-develop-team/so-vits-svc · GitHub

Sovits4.0教程-AI翻唱声音模型训练,Colab云端免费GPU

【教程】如何优雅的分离 修复人声

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »