找回密码
 立即注册
查看: 1533|回复: 0

[教程] 喂饭级SO-VITS-SVC教程,轻松生成AI歌曲

[复制链接]

61

主题

-8

回帖

195

积分

注册会员

积分
195
发表于 2023-7-1 13:42:17 | 显示全部楼层 |阅读模式

喂饭级SO-VITS-SVC教程,轻松生成AI歌曲

作者:大虎

背景

so-vits-svc是基于VITS的开源项目,VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)是一种结合变分推理(variational inference)、标准化流(normalizing flows)和对抗训练的高表现力语音合成模型

不过千万别被chatgpt骗了,生生把一个语言模型说成图像分类模型( version:3.5

gpt版本解释,千万别被误导

应用so-vits-svc快速生成AI歌曲,仓库地址:

https://github.com/svc-develop-team/so-vits-svc.gitgithub.com/svc-develop-team/so-vits-svc

目前该文档使用两个版本号系统,分别是 So-VITS 官方的版本号,以及本整合包的版本号。 请注意不要混淆

So-VITS 官方版本号目前为 4.1,其下另有两个分支:4.1-Stable 以及 4.1-Latest.

4.1-Stable是官方的稳定版本,4.1-Latest中包含一些尚在开发的新特性。由于后者可能存在一些 BUG,因此本整合包将仅同步更新 4.1-Stable的内容。

硬件需求

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

so-vits-svc安装

在你自定义的目录下使用Git命令克隆项目:

git clone https://github.com/svc-develop-team/so-vits-svc.git

没有梯子的使用下面这个下载

完整整合包 (v2.3.4)

百度网盘:

百度网盘 请输入提取码pan.baidu.com/s/12u_LDyb5KSOfvjJ9LVwCIQ?pwd=g8n4

提取码:g8n4

增量更新 (v2.3.4)

⚠️v1.x 版本的整合包无法通过增量更新更新至 v2,请参考这里了解更新方式

百度网盘:https://pan.baidu.com/s/1N-47gaAFE1Ewd4hrOQEu8A?pwd=yryv 提取码:yryv

底模DLC

预训练模型(底模)可以大大减少小数据集的训练难度。整合包内已经自带了底模,并会在训练时自动加载。但是目前 Vec768l12 编码器有一个更强的底模。你可以自行下载并替换原来的底模。

  1. 将下载的底模分别改名为 G_0.pthD_0.pth
  2. 替换到 pre_trained_model/768l12 目录下同名文件

下载地址:

https://huggingface.co/datasets/ms903/sovits4.0-768vec-layer12/tree/main/sovits_768l12_pre_large_320khuggingface.co/datasets/ms903/sovits4.0-768vec-layer12/tree/main/sovits_768l12_pre_large_320k

在开始之前

为了避免在之后的使用中出现各种意料之外的问题,请务必对照下面的 Checklist 检查本机环境。

关闭全局梯子 / 绕过局域网 确保本机正常连接互联网 使用推荐的浏览器(✅Chrome / Edge / Firefox) 关闭浏览器自带的网页翻译功能 关闭所有第三方杀毒软件 / 安全卫士等

部分浏览器(尤其是 Edge)会出现 WebUI 打开后无法正常工作的现象。如果遇到卡死/无法点击交互等现象,请尝试更换为上述推荐的其他浏览器。

本地搭建

开始搭建

安装完成后进入项目目录:

cd so-vits-svc

接着安装依赖,如果是Linux或者Mac系统,运行命令:

pip install -r requirements.txt

如果是Windows用户,需要使用Win系统专用的依赖文件

pip install -r requirements_win.txt

依赖库安装成功之后,在项目的根目录运行命令,启动服务:

python webUI.py

程序返回:

PS D:\so-vits-svc> python .\webUI.py   
DEBUG:charset_normalizer:Encoding detection: ascii is most likely the one.   
C:\Users\zcxey\AppData\Roaming\Python\Python310\site-packages\gradio\deprecation.py:43: 
UserWarning: You have unused kwarg parameters in UploadButton,
 please remove them: {'variant': 'primary'}  
 warnings.warn(   DEBUG:asyncio:Using proactor: IocpProactor   
Running on local URL:  http://127.0.0.1:7860  
To create a public link, set `share=True` in `launch()`.

说明服务已经正常启动了,这里so-vits-svc会在后台运行一个基于Flask框架的web服务,端口号是7860,此时访问本地的网址:127.0.0.1:7860:

孙燕姿无损音色模型

链接: https://pan.baidu.com/s/1oMYzRcavt__ccZvFpOHLPg?pwd=mvtu 提取码: mvtu

  • 下载模型文件之后,将模型文件放入logs/44k目录:
  • 接着将模型的配置文件config.js放入configs目录:
  • 随后,在页面中点击加载模型即可,这里环境就配置好了。

sd生成的话筒xswl

原始歌曲处理(人声和伴奏分离)

如果想要使用孙燕姿的模型进行二次创作,首先需要一段已经准备好的声音范本,然后使用模型把原来的音色换成孙燕姿模型训练好的音色即可

这里我们五月天的《我不愿让你一个人》来进行模拟,这两位歌手风格挺搭。慢歌适合新手,也方便我们练习。

需要注意的是,模型推理过程中,需要的歌曲样本不应该包含伴奏,因为伴奏属于“噪音”,会影响模型的推理效果,因为我们替换的是歌手的“声音”,排除伴奏。

这里我们选择使用开源库Spleeter来对原歌曲进行人声和伴奏分离,首先安装spleeter:

pip3 install spleeter --user

关于spleeter更多的操作,请移步至:

人工智能AI库Spleeter免费人声和背景音乐分离实践(Python3.10)-刘悦v3u.cn/a_id_305

接着运行命令,对《遥远的歌》进行分离操作: spleeter separate -o d:/output/ -p spleeter:2stems d:/我不愿让你一个人.mp3 这里-o代表输出目录,-p代表选择的分离模型,最后是要分离的素材。

首次运行会比较慢,因为spleeter会下载预训练模型,体积在1.73g左右,运行完毕后,会在输出目录生成分离后的音轨文件

其中vocals.wav为五月天的清唱声音,而accompaniment.wav则为伴奏。

至此,原始歌曲就处理好了。

歌曲覆盖

此时,将五月天的清唱声音vocals.wav文件添加到页面中:

接着就是参数的调整:

这里推理歌曲会有两个问题,就是声音沙哑和跑调,二者必出其一。

F0均值滤波(池化)参数开启后可以有效改善沙哑问题,但有概率导致跑调,而降低该值则可以减少跑调的概率,但又会出现声音沙哑的问题。

基本上,推理过程就是在这两个参数之间不断地调整。

所以每一次运行都需要认真的听一下歌曲有什么问题,然后调整参数的值,这里我最终的参数调整结果如上图所示。

覆盖出来的歌曲同样也是wav格式,此时我们将覆盖的清唱声音和之前分离出来的伴奏音乐accompaniment.wav进行合并即可,

Python3利用ffmpeg针对视频进行一些操作-刘悦v3u.cn/a_id_74

作品输出

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

该命令可以把推理的人声wav和背景音乐wav合并为一个output.wav歌曲,至此我们的二次创作便完成了

参数解析

推理

推理 (Inference) 是指将输入源音频通过 So-VITS 模型转换为目标音色的过程。因此,执行 So-VITS 的推理过程,你必须拥有:

image.png

从外部迁移模型

⏩从外部转移模型时,只要将对应的文件放置到上述的对应位置即可。模型的文件名可以任意更改,但请保持后缀不变。聚类模型和扩散模型使用的是同一个后缀(.pt),请在重命名时显著区分这两种模型。

⚠️从云端下载模型时,请务必注意只有"G"模型才是推理可用的模型。错误下载"D"模型将无法正常推理。

加载模型

在推理过程中,模型会默认被加载到 CUDA 设备(显卡)或 CPU 上,取决于你当前可用的设备。按照以下步骤加载模型:

  1. 选择所使用的 So-VITS 模型,此时会自动读取模型所使用的编码器

⏩关于不同的编码器详解,请参考训练 - 编码器详解

  1. 选择该模型对应的配置文件,此时会自动读取配置文件中的编码器参数

⚠️ 配置文件与模型的编码器必须对应,否则无法正常推理 。旧版模型需要修改配置文件以兼容 4.1 版本,关于如何修改配置文件兼容,请参考旧模型兼容

  1. 如需使用浅扩散、聚类模型、NSF-HifiGAN 声码器增强器,请自行选择
  2. 点击加载模型

浅扩散、聚类模型及声码器增强器需要在选中后再加载模型。如果已经有模型加载,选中选项后需要重新加载模型。

模型加载需要大约 10-30 秒,多说话人模型可以在 So-VITS 说话人列表中选择对应的说话人。

上传音频并转换

你需要首先上传一段输入源音频才能进行转换,优秀的输入源音频的要求是:

  • 纯人声,无伴奏、底噪、和声、混响等
  • WAV 格式,44100 hz,16 bit

⏩关于如何从歌曲中分离伴奏、去除混响和声,请参考训练 - 数据集处理 - 人声伴奏分离 ⏩整合包中预装了 FFmpeg,因此即便不是 44100 hz, 16 bit 的 WAV 文件也可以上传。如果在推理时遇到 FFmpeg 相关的错误,请重启 WebUI 后再次尝试,或手动使用音频处理软件转换为正确的格式

一般来说,默认的参数对于转换歌曲足够使用。你也可以参考推理参数详解来了解各个推理可选项的参数说明。

训练

训练是指使用目标说话人的音声数据集令 AI 学习特征并生成神经网络模型。在训练之前,你需要准备:

  • 目标说话人的授权数据集(至少 30 分钟的纯人声 / 歌声,1-2 小时最佳)
  • 音频处理软件(Adobe Audition, UVR5)
  • 本整合包

⚠️训练过程的显卡负载非常高,且一般会持续数小时,在此期间建议不要使用计算机进行其他的任务。

数据集处理

人声伴奏分离

如果你使用的是带伴奏的歌曲作为数据集,那么请一定要将人声从伴奏中分离出来。分离伴奏和人声推荐使用 Ultimate Vocal Remover 5 (UVR5), 并下载对应的处理模型。一些推荐的处理模型和功能如下:

  • Demucs - v3 | UVR_Model_1: 分离人声及伴奏
  • VR Architecture - 5_HP-Karaoke-UVR: 分离和声
  • VR Architecture - UVR-DeEcho-DeReverb: 去除混响和回声

⏩上述所有模型均可在 UVR5 软件选择模型处 —— Download More Models 下载

需要注意的是,没有任何一种方法能够做到无损分离人声。当歌曲中的伴奏越复杂,分离后的人声失真越严重。较差的人声质量会显著影响模型训练的结果。

音频切片

数据集的音频需要切分成数秒至数十秒的片段。一般来说 3- 15 秒为佳。在 WebUI 里整合了一个智能音频切片工具,可以满足上述切片要求。

⚠️在切片之前,请将待切片的音频文件以纯数字、字母、下划线命名。

  1. 打开 WebUI - 小工具/实验室特性 - 智能音频切片
  2. 将包含所有待处理音频文件(.wav 格式)的文件夹路径输入到原始音频文件夹
  3. 点击加载原始音频,确认音频被正确识别
  4. 输入切片后的输出目录,选择对过短音频的处理方式
  5. 开始处理

处理完成后在输出文件夹内将音频文件按大小排序,确认不包含过长(30秒以上)或过短(2秒以下)的音频。

预处理

数据集预处理的流程是:

响度匹配 —— 重采样 —— 生成配置文件 —— 提取特征

⚠️注意:虽然 So-VITS 项目自带响度匹配脚本,但该脚本会将音频匹配到 0db, 这可能会造成音质的受损。最佳的做法是使用专业音频处理软件,如 Adobe Audition自行对数据集进行响度匹配前处理后再进入预处理流程。如果数据集已经完成了响度匹配,可以在预处理时跳过程序自带的响度匹配流程。

上述所有流程在 WebUI 中均可一键完成:

  1. 将上一步切片完成的数据集文件夹放置到整合包根目录下dataset_raw文件夹内

⚠️请注意文件结构:dataset_raw/speaker_name/*.wav

  1. 在 WebUI 训练选项卡中,点击识别数据集,确认数据集被正确识别
  2. 根据说明自行选择训练使用的编码器和 f0 预测器

编码器详解

编码器名称 优点 缺点
vec256l9 - 不支持扩散模型
vec768l12(推荐) 最还原音色、有大型底模、支持响度嵌入 咬字能力较弱
hubertsoft 咬字能力较强 音色泄露
whisper-ppg 咬字最强 音色泄露、显存占用高

更多的编码器选项,请参考 训练参数详解 - 关于特征编码器 音色泄露指的是输出的音色向底模/推理输入源的原始音色接近,模型说话人越多,音色泄露越严重。考虑到大多数人都希望尽可能还原目标说话人的音色,因此音色泄露被认为是一种不受欢迎的结果。

  1. 如要训练扩散模型或启用响度嵌入,请自行勾选

勾选训练扩散后将会提取扩散模型所需的特征文件,会占用更多硬盘空间。有关扩散模型的详细说明,请参考训练参数详解

⚠️启用响度嵌入需要选择 Vec768L12 编码器,其它编码器没有响度嵌入的底模。

  1. 点击数据预处理

数据预处理的输出信息中可能存在报错信息。如果出现报错,则代表数据预处理未完成。你可以参考常见报错和解决方案自行排障。

⚠️数据预处理可以多线程执行,但会显著占用显存和内存。建议 6G 以下显存不要开启多线程。12G 以下显存不要将线程数设置为 2 以上。

训练参数设置和开始训练

请参考 WebUI 中的说明自行设置参数并开始训练。有关训练参数和聚类模型的更多说明,请参考训练参数详解

Tensorboard

可以用 Tensorboard 来查看训练过程中的损失函数值 (loss) 趋势,试听音频,从而辅助判断模型训练状态。

  1. 双击启动tensorboard.bat运行 Tensorboard

Tensorboard 是根据训练时默认每 200 步的评估生成日志的,如果训练未满 200 步,则 Tensorboard 中不会出现任何图像。

Losses 详解

你不需要理解每一个 loss 的具体含义,大致来说:

  • loss/g/f0loss/g/melloss/g/total应当是震荡下降的,并最终收敛在某个值
  • loss/g/kl应当是低位震荡的
  • loss/g/fm应当在训练的中期持续上升,并在后期放缓上升趋势甚至开始下降

观察 losses 曲线的趋势可以帮助你判断模型的训练状态。但 losses 并不能作为判断模型训练状态的唯一参考, 甚至它的参考价值其实并不大,你仍需要通过自己的耳朵来判断模型是否训练好了

对于小数据集(30分钟甚至更小),在加载底模的情况下,不建议训练过久,这样是为了尽可能利用底模的优势。数千步甚至数百步就能有最好的结果。

⚠️Tensorboard 中的试听音频是根据你的验证集生成的,无法代表模型最终的表现。

训练参数详解

特征编码器

特征编码器起到的作用是将数据集中的特征提取出来以供神经网络学习。你必须在训练时指定一个编码器。目前整合包支持 4 个基础编码器:

编码器名称 优点 缺点
vec256l9 - 不支持扩散模型
vec768l12(推荐) 最还原音色、有大型底模、支持响度嵌入 咬字能力较弱
hubertsoft 咬字能力较强 音色泄露
whisper-ppg 咬字最强 音色泄露、显存占用高

上述四个编码器有预训练模型,能够涵盖绝大部分使用场景。但本整合包还支持额外的 4 个编码器(CNHuBERT-LargeDPHuBERTWavLM-Base+Whisper-PPG-Large), 整合包内不含额外编码器的必备模型和预训练模型 ,因此默认不显示在特征编码器列表。要启用额外编码器,你需要:

  1. 下载对应编码器的必备模型(见后表),以原文件名放置在pretrain文件夹
  2. 重启 WebUI,编码器列表里就会出现新的编码器选项

额外编码器不自带预训练模型,因此训练难度会大幅提升,请谨慎启用。如果你有额外编码器的预训练模型,可以放置在pre_trained_model文件夹下的对应文件夹,训练时会自动加载。

编码器名称 下载地址
CNHuBERT-Large chinese-hubert-large-fairseq-ckpt.pt
DPHuBERT DPHuBERT-sp0.75.pth
WavLM-Base+ WavLM-Base+.pt
Whisper-PPG-Large large-v2.pt

关于浅扩散

So-VITS 4.1 近期的一个重大更新就是引入了浅扩散 (Shallow Diffusion) 机制,将 So-VITS 的原始输出音频转换为Mel谱图,加入噪声并进行浅扩散处理后经过声码器输出音频。经过测试, 原始输出音频在经过浅扩散处理后可以显著改善电音、底噪等问题 ,输出质量得到大幅增强。

要使用浅扩散机制:

  1. 你必须在原有数据集上训练一个新的扩散模型
  2. 数据预处理时勾选“训练扩散模型”
  3. 确保扩散模型和 So-VITS 模型配置文件中的说话人名称一致
  4. 在推理时加载扩散模型

扩散模型与So-VITS模型是独立的,得益于浅扩散机制的向下兼容性,你仍然可以只使用其中任意一个模型进行推理,或者同时使用So-VITS和扩散模型进行完整的浅扩散推理。

关于浅扩散步数

完整的高斯扩散为 1000 步,当浅扩散步数达到 1000 步时,此时的输出结果完全是扩散模型的输出结果,So-VITS 模型将被抑制。 浅扩散步数越高,越接近扩散模型输出的结果 。如果你只是想用浅扩散去除电音底噪,尽可能保留 So-VITS 模型的音色,浅扩散步数可以设定为 50-100.

响度嵌入和音量增强

原版 So-VITS 模型输出音频的响度是与你的数据集响度匹配的。在预处理过程中,你的所有数据集音频会被自动匹配到 0db 的响度,这是一个非常高的数值,会导致你的模型最终输出的响度非常高,并且损坏音质。

启用了响度嵌入后,预处理会对原音频进行响度增强处理,模型会学习音频的响度信息,这样模型输出的响度就会匹配到输入源音频,而非数据集响度。

⚠️(v2.3.1)启用了响度嵌入后,模型需要重新训练,并且仅支持 Vec768L12 编码器。

聚类模型

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

使用聚类只需要额外训练一个聚类模型,虽然效果比较有限,但训练成本也比较低。

⌚️聚类模型现在可以使用 GPU 训练了,只要约不到 1 分钟即可完成训练。

聚类模型的训练基于数据集,因此请在预处理完成后再训练聚类。

特征检索

特征检索和聚类方案一样,可以减少音色泄露,使得模型的输出更像目标音色,但特征检索的咬字比聚类稍好一些。特征检索同样使用了混合比例,可以线性控制特征检索的占比。启用特征检索会稍微降低推理速度(不是很明显)。要启用特征检索:

  1. 需要完成数据集预处理
  2. 需要训练一个特征检索模型

特征检索模型的大小与训练集大小挂钩,较大的数据集将会训练出较大的特征检索模型。

  1. 特征检索和聚类方案共用参数,在推理时启用特征检索将会自动禁用聚类。

推理参数详解

自动 f0 预测

基本上是一个自动变调功能,可以将模型音高匹配到推理源音高,用于说话声音转换时可以打开,能够更好匹配音调。

f0 预测器

在推理时必须选择一个 f0 预测算法。以下是各个预测器算法在推理时的优缺点:

image.png

聚类模型/特征检索混合比例

该参数控制的是使用聚类模型/特征检索模型时线性参与的占比。聚类模型和特征检索均可以有限提升音色相似度,但带来的代价是会降低咬字准确度(特征检索的咬字比聚类稍好一些)。该参数的范围为 0-1, 0为不启用,越靠近 1, 则音色越相似,咬字越模糊。

聚类模型和特征检索共用这一参数,当加载模型时使用了何种模型,则该参数控制何种模型的混合比例。

注意,当未加载聚类模型或特征检索模型时,请保持改参数为 0,否则会报错。

切片阈值

推理时,切片工具会将上传的音频根据静音段切分为数个小段,分别推理后合并为完整音频。 这样做的好处是小段音频推理显存占用低,因而可以将长音频切分推理以免爆显存 。切片阈值参数控制的是最小满刻度分贝值,低于这个值将被切片工具视为静音并去除。因此,当上传的音频比较嘈杂时,可以将该参数设置得高一些(如 -30),反之,可以将该值设置得小一些(如 -50)避免切除呼吸声和细小人声。

开发组近期的一项测试表明,较小的切片阈值(如-50)会改善输出的咬字,至于原理暂不清楚。

自动音频切片

上面提到,推理时,切片工具会将上传的音频根据静音段切分为数个小段,分别推理后合并为完整音频。但有时当人声过于连续,长时间不存在静音段时,切片工具也会相应切出来过长的音频,容易导致爆显存。自动音频切片功能则是设定了一个最长音频切片时长,长于该时长的音频将会被按照该时长强制切分,避免了爆显存的问题。

强制切片可能会导致音频从一个字的中间切开,分别推理再合并时可能会存在人声不连贯。你需要在高级设置中设置强制切片的交叉淡入长度来避免这一问题。

使用 Whisper-PPG 编码器的模型时,会自动设置一个 25 秒的强制切片,否则会无法正常推理。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|金房子

GMT+8, 2024-9-21 06:16 , Processed in 0.048280 second(s), 20 queries .

© 2023 金房子|AI发烧友社区

快速回复 返回顶部 返回列表