3

泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~ - Blackbinbin

 11 months ago
source link: https://www.cnblogs.com/blackbinbin/p/17434084.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~ - Blackbinbin - 博客园

最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了。之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog.csdn.net/sinat_26918145/article/details/79591717

现代的模型对于图生图的支持效果已经非常好了,相信对于美术行业,这是一场影响很深远的变革。也许我们正站在一个新的时代交叉路口,可能多年后回忆起当下的一瞬间,才后知后觉我们经历了一段什么样的时代开端。

好了,回到主题,这一篇文章主要是介绍如何使用音频模型,转换成你想要的歌手声音,得益于AI孙燕姿的火爆全网,让我也迫切想尝试一下 AIsong 歌曲转换。

目前来说比较火的开源 SVC 主要有以下几种:

  • rvc: https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI
  • diff-svc: https://github.com/prophesier/diff-svc
  • so-vits-svc: https://github.com/svc-develop-team/so-vits-svc

语音转换的目标是将源语音转换为目标语音,保持内容不变。提出了自监督表示学习用于语音转换

离散内容编码表示会丢失一些语言内容,导致发音不准确。为此,提出了通过预测离散单位分布学习的软语音单位。通过建模,软语音单位捕捉更多的内容,提高了转换语音的效果。

2517409-20230525181141495-738409341.png

在语音转换系统架构中,离散内容编码主要包含两个部分的实现:

  1. 离散内容编码器:将音频特征聚类,生成一系列离散的语音单位序列
  2. 软内容编码器:被训练用于预测离散语音单位

除此之外Acoustic model将离散/软语音单位转换为目标声谱图。 vocoder语音合成器将声谱图转换为音频波形。

废话不多说,前期铺垫了这么多,我们下面直接开始操作~

一、前期准备

刚开始模型训练前,我们需要搜集大量的目标人物的音频素材,如果是需要以你自己声音为基础的转换模型,则需要录制你自己的声音。这里的素材多少会直接影响到你模型训练的质量,一般建议提供 100 分钟以上的人声素材。

如果不是自己的声音,建议可以去网上搜集需要的人声音频。我这边使用的是阿B上的视频素材,这里可以使用这里推荐的工具(传送门),直接下载对应的视频or音频,非常方便~

这里我下载了差不多100分钟的音频

2517409-20230525182347667-1067884574.png

准备好音频素材后,需要对音频文件进行人声和背景音的分离,因为背景音对于模型的训练有干扰,单纯的人声可以让模型的声音效果和目标更拟合。这里使用到的工具是 demucs

pip install -U demucs

分离人声和背景音

demucs "音频文件地址" -o "输出文件目录" -n mdx_extra --two-stems=vocals

生成后输出文件目录有两个文件,一个是人声,一个是背景音

2517409-20230525183133495-1746407302.png

把所有的音频文件都进行人声分离后,接下来就要对音频进行切片处理了,因为人声素材文件的大小过大会影响模型训练的速度,所以我们还需要对其切片,将它变成一个比较小的人声切片文件。这里使用的工具是 audio-slicer

https://github.com/openvpi/audio-slicer 

git clone https://github.com/flutydeer/audio-slicer.git
cd ./audio-slicer
pip install -r requirements.txt
python ./slicer-gui.py

2517409-20230525184016794-1249879649.png

二、模型训练

模型训练主要是使用的是 https://github.com/svc-develop-team/so-vits-svc/tree/4.1-Stable

你可以在自己的显卡上训练,也可以在云端上进行锻炼。因为我本机电脑的显卡不行,所以使用云端的服务器来进行训练。参考了很多教程,感觉很多博主都推荐 AutoDL 这个平台,所以我们也使用这个,避免走弯路~

这里租用一台 v100 的算力服务器

2517409-20230525184854010-2073839880.png

镜像这里选择:

2517409-20230525184933126-133673611.png

选择 v3 或者 v4 模型都可以

2517409-20230525185008221-1200051656.png

买完之后进入控制台,接下来就是使用网盘把我们处理过的人声素材导入到实例容器中

2517409-20230525185141304-665119082.png

点击“AutoPanel”进入控制台

2517409-20230526103328724-1175707078.png
2517409-20230526103328245-512998464.png

 可以先把训练数据上传到阿里云,在这里用阿里云app扫码登录。对需要上传到容器内的训练集文件夹,点击下载,然后就可以自动同步到容器内的这个文件夹目录里的,整个过程耗时会稍微久一点。

2517409-20230525225822912-17722268.png

 至此,我们的数据集就全部准备好了,下面就准备训练了。

二、模型训练

回到我们的控制台,点击 JupyterLab 进入容器内

2517409-20230525230234798-453795427.png

进入 JupyterLab 后,打开项目内的 README-v4.ipynb ,可以看到模型作者很细致的将模型训练每一步都做成了可视化操作的命令步骤解析。第一步就是我们的训练集从 /dataset 文件夹目录,搬运到 /dataset_raw。只需要鼠标点击模型作者第一步 [1]: 所标识的python命令,然后点击运行按钮即可,这个点击后需要小小等待一会,它开始运行时命令下面会有相关的输出提示。

2517409-20230525230858238-877151800.png

在此文件夹目录下,数据集就安放正确了。比如你训练数据集的文件夹名称是 Paimondata 则会在此目录下生成一个同样的目录,其实你可以直接把数据集导入到这里也行,不用网盘。

2517409-20230525231327811-2100753410.png

 在文档中也清楚的说明了,文件夹名称就是你训练的人声名字,可以放多个你想要训练的声音目标

2517409-20230526094805827-2062776039.png

 第二步就是对数据集进行采样至 44100hz。第三步则是进行自动划分训练集。这两部分也是一样,按运行按钮执行。

2517409-20230526103329101-659156957.png

 接下来就是对配置文件 /config/config.json 文件进行配置,编辑后进行修改:把 "learning_rate"改成 0.0004,把 "batch_size"改成24,把 "keep_ckpts"改成10,然后按Ctrl+S保存!!!

2517409-20230526103328759-228130636.png

learning_rate和batch_size这两个参数可以理解为训练速度和训练质量,因为我们用的V100 32G显卡,这块直接固定死数值就可以,keep_ckpts是保存多少个模型,因为声音模型训练是不会自动停止的,每几千步就会给你保存一个模型,所以我们可以让他自动保存最新的10个模型让我们来选一个最好的。

接着需要生成 hubert 和 f0,这里是后面推理的时候添加的辅助选项,为了修饰推理出来的音频更加顺滑

2517409-20230526103328993-878702706.png

如果你是第一次训练,则无需进行清理,直接跳到训练这一步就行了,不过在训练这里,按照文档注释的,使用终端来进行训练命令的执行。

2517409-20230526103329053-1285741863.png
在启动页点击“终端”,进入终端后就可以上面训练中的 Python 命令拿来执行了

2517409-20230526100017856-683306575.png

 注意一下,这里需要在项目的当前目录才能执行,如果不是项目目录可以

cd ~/autodl-tmp/so-vite-svc

2517409-20230526100132618-1256233876.png

出现日志后就说明开始训练了,可以看到每训练200步,train.log 日志就记录相关的日志,也就是控制台中的输出。没当800步的时候就会保存一个模型,工程会默认保存最新的十个模型,模型目录如下

2517409-20230526103328809-2096730919.png

然后我们可以等待它的模型了,一般达到10000步的时候效果会比较好一些,这个过程差不多五个小时,这时候咱们可以去吃饭喝茶遛弯干别的事情了,哪怕关掉电脑都行,训练命令并不会因为与 autodl 的网页连接中断而停止,所以不用担心。

三、声音推理

这里网上的教程都是说把模型文件拉取到本地来进行推理,但是个人不太建议这样子做,因为本地的python环境需要安装很多的依赖不说,还不一定能装载成功,既然云端都提供了整个工程了,为什么不在云端进行推理呢。云端推理有 webui 和 脚本 两种方法,两个我试过了,webui会出现推理失败的情况,脚本就非常稳定,能成功产出推理音频。
和数据预处理一样,我们需要把需要被转换的音乐,进行人声和背景音的分离,使用我们上面的工具 demucs 来处理,步骤是一样的。得到音乐的人声后,我们把它放到云端工程的这个目录下。
2517409-20230526103328625-1241454710.png
上图中 vocals.wav 就是整首歌的人声部分,这里因为音频有四分钟左右,整首进行推理的话,会直接报内存使用超过上限的错误,所以我又用上面提到的 auto-slicer 工具来进行切分人声,得到 0 到 5 个分片文件。
接下来打开终端,运行一下命令:
python inference_main.py  -m "logs/44k/G_{模型编号}.pth" -c "configs/config.json" -n {raw目录下需要转换的人声文件名} -t 0 -s {上面你数据训练集的文件夹名称也就是文档里的speaker name}

关于推理参数,文档有很详细的描述

#用脚本推理 
!python inference_main.py 
#推理结果会存放在so-vits-svc/results文件夹
#如果不编辑推理脚本,参数直接附加在上面的指令后 
#如 !python inference_main.py -m "logs/44k/G_30400.pth" -c "configs/config.json"...
#每个参数需要用""括起来
#必填参数
#-m, --model_path:模型路径。
#-c, --config_path:配置文件路径。
#-n, --clean_names:wav 文件名列表,放在 raw 文件夹下。
#-t, --trans:音高调整,支持正负(半音)。
#-s, --spk_list:合成目标说话人名称。
#可填参数
#-a, --auto_predict_f0:语音转换自动预测音高,转换歌声时不要打开这个会严重跑调。
#-cm, --cluster_model_path:聚类模型路径,如果没有训练聚类则随便填。
#-cr, --cluster_infer_ratio:聚类方案占比,范围 0-1,若没有训练聚类模型则填 0 即可。

所有的推理产出都在 result 文件夹中

2517409-20230526103328705-1605494422.png
可以一个一个的下载下来本地进行播放,如果发现效果不好,则重新选择模型进行推理,一般来说训练次数越多,声音的推理产出结果和训练的目标对象越相似。
在本地后,你可以像我一样用剪印或者其他的编辑软件进行音频的合成。也就是把上面的推理结果和歌曲的背景音进行重新剪辑合并。

2517409-20230526103024146-170933260.png

2517409-20230526103139536-1965006186.png

最后的最后让我们一起来听一下成片吧~~~

链接: https://pan.baidu.com/s/1lwCvlZc91UYmPmtICksLIQ 提取码: dezw 

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK