最近在做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

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

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

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

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

除此之外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,这里是后面推理的时候添加的辅助选项,为了修饰推理出来的音频更加顺滑

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

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

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

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

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

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

三、声音推理

这里网上的教程都是说把模型文件拉取到本地来进行推理,但是个人不太建议这样子做,因为本地的python环境需要安装很多的依赖不说,还不一定能装载成功,既然云端都提供了整个工程了,为什么不在云端进行推理呢。云端推理有 webui 和 脚本 两种方法,两个我试过了,webui会出现推理失败的情况,脚本就非常稳定,能成功产出推理音频。
和数据预处理一样,我们需要把需要被转换的音乐,进行人声和背景音的分离,使用我们上面的工具 demucs 来处理,步骤是一样的。得到音乐的人声后,我们把它放到云端工程的这个目录下。
上图中 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 文件夹中

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

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

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

泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~的更多相关文章

  1. 手摸手教你微信小程序开发之自定义组件

    前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现 ...

  2. 手摸手,和你一起学习 UiPath Studio

    学习 RPA 的路上坑比较多,让我们手摸手,一起走…… 以下是一些学习 UiPath 和 RPA 的资源, 拿走不用谢! UiPath Studio 中文文档 机器人流程自动化其实是很好的概念和技术, ...

  3. 【转】手摸手,带你用vue撸后台 系列二(登录权限篇)

    前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自己是一个业务猿,每天被我司的产品虐的死去活来,之前又病了一下休息了几天,大家见谅. 进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常 ...

  4. iOS动画进阶 - 手摸手教你写 Slack 的 Loading 动画

    如果移动端访问不佳,可以访问我的个人博客 前几天看了一篇关于动画的博客叫手摸手教你写 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我写这个动画 ...

  5. 【转】手摸手,带你用vue撸后台 系列三(实战篇)

    前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...

  6. 【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)

    前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不 ...

  7. 【转】手摸手,带你用vue撸后台 系列一

    前言 说好的教程终于来了,第一篇文章主要来说一说在开始写业务代码前的一些准备工作吧,但这里不会教你webpack的基础配置,热更新怎么做,webpack速度优化等等,有需求的请自行google. 目录 ...

  8. 原创 | 手摸手带您学会 Elasticsearch 单机、集群、插件安装(图文教程)

    欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/ ...

  9. 浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!

    条件队列是什么?可能很多人和我一样答不出来,不过今天终于搞清楚了! 什么是条件队列 条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态 ...

  10. 手摸手教你让Laravel开发Api更得心应手

    https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...

随机推荐

  1. 干货 | BitSail Connector 开发详解系列一:Source

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 BitSail 是字节跳动自研的数据集成产品,支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全 ...

  2. SpringBoot——配置及原理

    更多内容,前往IT-BLOG 一.Spring Boot全局配置文件 application.properties 与 application.yml 配置文件的作用:可以覆盖 SpringBoot ...

  3. 2020寒假学习笔记13------Python基础语法学习(二)

    同一运算符   同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址. 运算符 描述 is is 是判断两个标识符是不是引用同一个对象 is not is  not 是判断两个标识符是不是引用 ...

  4. 聊天小精灵ChatGPT,好与不好大揭秘!

    一.引言 在一个遥远的地球上,有一个名为ChatGPT的魔法盒子,它能够用智慧回答你的问题,解决你的困扰.它是一个聪明的家伙,但和任何家伙一样,有优点也有缺点.现在就让我们一起来探索这个神秘的魔法盒子 ...

  5. $\mathcal{Crypto}$ 共模攻击原理实现以及$\mathcal{CRT}$优化

    \(\mathcal{共模攻击概述}\) 共模攻击是一种攻击 \(\mathcal{RSA}\) 加密的技术,当两个密文使用相同的 \(\mathcal{RSA}\) 公共模数时,攻击者可以使用中国剩 ...

  6. 1.使用cookie简单实现单点登录流程

    1.动手 实现了简单使用多系统,单一位置同时登陆,以及注销 主要认证中心流程代码编写在为在sso-login包下的ViewConreoller和LoginController:各系统的用户名显示是写在 ...

  7. 关于微人事中POI导入文件到数据库的异常以及自己的一些技术心得

    前言 在近四个月的时间里面,我的微人事项目才逐渐接近尾声,在昨天的测试接口中出现了两次数组越界以及一次空指针异常,三处异常我都通过吊事bug根据项目实际情况解决了,但是在空指针异常那里还是带有疑问,起 ...

  8. 访问不到tomcat下的静态资源文件

    问题:idea+tomcat 测试Servlet,居然访问不到与WEB-INF同级的静态资源1.html.又不是访问WEB-INF里的文件.... 分析:可能是开发目录中的文件没有自动复制到部署目录. ...

  9. v-if与v-show造成部分元素丢失的问题——v-if复用元素问题

    pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } 问题描述 在写tab切换 ...

  10. 快速上手Linux核心命令(一):核心命令简介

    前言 众所周知,Linux在服务器中占用不可替代的位置.大多数互联网公司,服务器都是采用的Linux操作系统.而Linux是一个主要通过命令行来进行管理的操作系统.只有熟练掌握Linux核心命令,在使 ...