最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了。之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog.csdn.net/sinat_26918145/article/details/79591717
现代的模型对于图生图的支持效果已经非常好了,相信对于美术行业,这是一场影响很深远的变革。也许我们正站在一个新的时代交叉路口,可能多年后回忆起当下的一瞬间,才后知后觉我们经历了一段什么样的时代开端。
好了,回到主题,这一篇文章主要是介绍如何使用音频模型,转换成你想要的歌手声音,得益于AI孙燕姿的火爆全网,让我也迫切想尝试一下 AIsong 歌曲转换。
目前来说比较火的开源 SVC 主要有以下几种:
语音转换的目标是将源语音转换为目标语音,保持内容不变。提出了自监督表示学习用于语音转换
离散内容编码表示会丢失一些语言内容,导致发音不准确。为此,提出了通过预测离散单位分布学习的软语音单位。通过建模,软语音单位捕捉更多的内容,提高了转换语音的效果。
在语音转换系统架构中,离散内容编码主要包含两个部分的实现:
除此之外Acoustic model将离散/软语音单位转换为目标声谱图。 vocoder语音合成器将声谱图转换为音频波形。
废话不多说,前期铺垫了这么多,我们下面直接开始操作~
一、前期准备
刚开始模型训练前,我们需要搜集大量的目标人物的音频素材,如果是需要以你自己声音为基础的转换模型,则需要录制你自己的声音。这里的素材多少会直接影响到你模型训练的质量,一般建议提供 100 分钟以上的人声素材。
如果不是自己的声音,建议可以去网上搜集需要的人声音频。我这边使用的是阿B上的视频素材,这里可以使用这里推荐的工具(传送门),直接下载对应的视频or音频,非常方便~
这里我下载了差不多100分钟的音频
准备好音频素材后,需要对音频文件进行人声和背景音的分离,因为背景音对于模型的训练有干扰,单纯的人声可以让模型的声音效果和目标更拟合。这里使用到的工具是 demucs
安装:
pip install -U demucs
分离人声和背景音
demucs "音频文件地址" -o "输出文件目录" -n mdx_extra --two-stems=vocals
生成后输出文件目录有两个文件,一个是人声,一个是背景音
把所有的音频文件都进行人声分离后,接下来就要对音频进行切片处理了,因为人声素材文件的大小过大会影响模型训练的速度,所以我们还需要对其切片,将它变成一个比较小的人声切片文件。这里使用的工具是 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
二、模型训练
模型训练主要是使用的是 https://github.com/svc-develop-team/so-vits-svc/tree/4.1-Stable
你可以在自己的显卡上训练,也可以在云端上进行锻炼。因为我本机电脑的显卡不行,所以使用云端的服务器来进行训练。参考了很多教程,感觉很多博主都推荐 AutoDL 这个平台,所以我们也使用这个,避免走弯路~
这里租用一台 v100 的算力服务器
镜像这里选择:
选择 v3 或者 v4 模型都可以
买完之后进入控制台,接下来就是使用网盘把我们处理过的人声素材导入到实例容器中
点击“AutoPanel”进入控制台
可以先把训练数据上传到阿里云,在这里用阿里云app扫码登录。对需要上传到容器内的训练集文件夹,点击下载,然后就可以自动同步到容器内的这个文件夹目录里的,整个过程耗时会稍微久一点。
至此,我们的数据集就全部准备好了,下面就准备训练了。
二、模型训练
回到我们的控制台,点击 JupyterLab 进入容器内
进入 JupyterLab 后,打开项目内的 README-v4.ipynb ,可以看到模型作者很细致的将模型训练每一步都做成了可视化操作的命令步骤解析。第一步就是我们的训练集从 /dataset 文件夹目录,搬运到 /dataset_raw。只需要鼠标点击模型作者第一步 [1]: 所标识的python命令,然后点击运行按钮即可,这个点击后需要小小等待一会,它开始运行时命令下面会有相关的输出提示。
在此文件夹目录下,数据集就安放正确了。比如你训练数据集的文件夹名称是 Paimondata 则会在此目录下生成一个同样的目录,其实你可以直接把数据集导入到这里也行,不用网盘。
在文档中也清楚的说明了,文件夹名称就是你训练的人声名字,可以放多个你想要训练的声音目标
第二步就是对数据集进行采样至 44100hz。第三步则是进行自动划分训练集。这两部分也是一样,按运行按钮执行。
接下来就是对配置文件 /config/config.json 文件进行配置,编辑后进行修改:把 "learning_rate"改成 0.0004,把 "batch_size"改成24,把 "keep_ckpts"改成10,然后按Ctrl+S保存!!!
learning_rate和batch_size这两个参数可以理解为训练速度和训练质量,因为我们用的V100 32G显卡,这块直接固定死数值就可以,keep_ckpts是保存多少个模型,因为声音模型训练是不会自动停止的,每几千步就会给你保存一个模型,所以我们可以让他自动保存最新的10个模型让我们来选一个最好的。
接着需要生成 hubert 和 f0,这里是后面推理的时候添加的辅助选项,为了修饰推理出来的音频更加顺滑
如果你是第一次训练,则无需进行清理,直接跳到训练这一步就行了,不过在训练这里,按照文档注释的,使用终端来进行训练命令的执行。
注意一下,这里需要在项目的当前目录才能执行,如果不是项目目录可以
cd ~/autodl-tmp/so-vite-svc
出现日志后就说明开始训练了,可以看到每训练200步,train.log 日志就记录相关的日志,也就是控制台中的输出。没当800步的时候就会保存一个模型,工程会默认保存最新的十个模型,模型目录如下
然后我们可以等待它的模型了,一般达到10000步的时候效果会比较好一些,这个过程差不多五个小时,这时候咱们可以去吃饭喝茶遛弯干别的事情了,哪怕关掉电脑都行,训练命令并不会因为与 autodl 的网页连接中断而停止,所以不用担心。
三、声音推理
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 文件夹中
最后的最后让我们一起来听一下成片吧~~~
链接: https://pan.baidu.com/s/1lwCvlZc91UYmPmtICksLIQ 提取码: dezw