so-vits-svc 4.1 详细使用记录

前几个月在B站听到了许多AI孙燕姿的“作品”,自己也很好奇是如何做到的。这不最近有了点时间,体验实践了一下。

其实so-vits-svc的文档写的已经比较详细了。但实际操作起来,因为环境的原因会遇到各种问题。本篇也是将我遇到的问题整理出来,希望可以帮到你。

首先听一下我的成果,感觉还行:

【AI 周杰伦】乌梅子酱

初体验

首先说一下我的电脑环境:

  • MacBook Pro M1 Pro
  • Python 3.9.6

首先克隆项目到本地:

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

然后进入项目根目录安装依赖:

pip install -r requirements.txt

Mac上安装环境及运行都没有太大问题,但是由于显卡的限制,不能完成训练操作。但是可以用来数据预处理和推理。

所以一开始,我先用了别人训练好的模型来体验了一下推理。具体操作如下:

项目根目录运行命令启动服务:

python webUI.py

终端返回结果:

Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.

浏览器打开上面的地址,选择模型文件和配置文件然后点击右侧加载按钮。

在这里插入图片描述


然后滑到页面下面,上传你需要替换的音频,点击转换即可。

在这里插入图片描述

这里我遇到一个问题,由于使用的是4.0版本训练的模型,直接无法使用。所以为了兼容可通过修改 4.0 模型的 config.json 的配置进行支持,具体需要在 config.jsonmodel 字段中添加 speech_encoder 字段。

"model": {
    .........
    "speech_encoder":"vec256l9"
}

4.1版本 speech_encoder 默认值为 vec768l12。这部分文档也有说明,只是一开始比较懵,没有注意到这点。

准备工作

我自己在推理之后发现效果还不错,所以就有了自己训练一个模型的想法,体验一下整个流程。

  • 准备人物的干声,没有背景音,杂音,伴奏,合声,混响的纯人声。
  • 时长最好1小时以上,即使时长不够也要保证声音的质量。不要滥竽充数,这会大大影响训练结果的质量。
  • 音频需要切割成10s左右的片段,不要过短或者过长,wav格式。

下面我们详细说一下如何准备这些素材。

如果你准备训练自己的声音,那就可以跳过这一步。因为这一步是分离歌曲的人声和伴奏的。使用到的软件是UVR5。

第一步:选择Demucs - v3 | UVR_Model_1分离人声和伴奏。
在这里插入图片描述

第二步:选择VR Architecture - 5_HP-Karaoke-UVR分离上一步人声里面的和声。
在这里插入图片描述

如果有混响和回声,可以选择VR Architecture - UVR-DeEcho-DeReverb去除。

同理,如果推理歌曲,也是先分离出干声再推理,然后使用ffmpeg合成伴奏。

ffmpeg -i 1.wav -i 2.wav -filter_complex "[0]adelay=0s:all=1[0a];[1]adelay=0s:all=1[1a];[0a][1a]amix=inputs=2[a]" -map "[a]" output.wav

PS:上面提到的模型,需要点击图中的扳手图标,进入下载中心下载。

经过上一步我们就得到了干声。接下来我们使用Audio Slicer来进行音频切片。配置如下图:

请添加图片描述
如果切片长度过长,可以降低minimum interval的值。最后挨个听一下这些切片,去掉时长,质量不符合的。

我自己按上述步骤处理了50首歌,累计花费了10个小时。。。好累。。。下图是当时的成果。注意文件名字不要有中文。
请添加图片描述

数据预处理

  • 下载checkpoint_best_legacy_500.pt放在pretrain目录下。
  • 下载预训练底模文件G_0.pthD_0.pth放在logs/44k目录下。
  • 使用浅层扩散需要下载nsf_hifigan_20221211.zip解压后,将四个文件放在pretrain/nsf_hifigan目录下。(推荐)

以上下载链接在文档中都有,为了避免链接失效,这里就不提供了。

然后将上面准备好的数据集放入 dataset_raw 目录即可。结构如下:

dataset_raw
├───speaker0
│   ├───xxx1-xxx1.wav
│   ├───...
│   └───Lxx-0xx8.wav
└───speaker1
    ├───xx2-0xxx2.wav
    ├───...
    └───xxx7-xxx007.wav

重采样至 44100Hz 单声道:

python resample.py

自动划分训练集、验证集,以及自动生成配置文件:

python preprocess_flist_config.py

生成 hubert 与 f0:

python preprocess_hubert_f0.py --f0_predictor dio

f0_predictor 拥有以下选择crepe,dio,pm,harvest,rmvpe,fcpe。如果训练集过于嘈杂,请使用 crepe 处理 f0。如果省略f0_predictor 参数,默认值为 rmvpe

需要浅扩散功能(个人推荐),需要增加--use_diff 参数,例如:

python preprocess_hubert_f0.py --f0_predictor dio --use_diff

主模型训练

python train.py -c configs/config.json -m 44k

扩散模型(个人推荐)
尚若需要浅扩散功能,需要训练扩散模型,扩散模型训练方法为:

python train_diff.py -c configs/diffusion.yaml

模型训练结束后,模型文件保存在logs/44k目录下,扩散模型在logs/44k/diffusion下。


4.1的一个变化就是有了浅扩散,4.0的vec256l9编码器不支持扩散模型。4.1默认的vec768l12编码器优点是还原音色,缺点是咬字能力较弱,有时转换的歌曲会出现发音不准。但是浅扩散可以显著改善电音、底噪等问题。

实操

上面也提到了我自己的电脑不支持,所以只能尝试使用云端训练。方法和平台有很多,也有可以白嫖算力的。我自己最后使用的是智星云服务,前前后后折腾花了快两百块钱(租的是一小时两块的GeForce RTX 3090),具体配置和环境如下:

请添加图片描述
当然配置好的机子也有,价格也更贵。我的经验是为了节省租用费用,我们最好提前做好上面的准备工作,上传到服务提供的云盘,云端上去就是下载装环境然后训练。

但是说到装环境,或者说装Windows的环境,是我遇到问题最多的环节。下面我来分享我遇到的坑。。。

1.远程连接到云服务器后,第一件事就是确认gpu的情况是否正常。

import torch
print(torch.cuda.is_available()) #是否有可用的gpu
print(torch.cuda.device_count()) #有几个可用的gpu

我一开始有租用两个gpu的4090设备,直到训练时提示torch.cuda.OutOfMemoryError: CUDA out of memory,我就纳闷24显存的设备,我的配置也设置正常为啥提示爆显存了。后面发现只有一个gpu可用,然后我修改了代码(os.environ["CUDA_VISIBLE_DEVICES"] = "1"),指定了可用gpu,然后正常了。但是租用两个gpu价格是一个的双倍,我为啥花这个冤枉钱。这种问题的原因不清楚,可能是驱动?但我没必要花时间去处理这种问题,直接换机子最快。

2.安装依赖前先安装C++ 组件,否则会提示C++ extension is not available.。下载地址:https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/

请添加图片描述
按图中选择然后点击安装。安装后可以运行pip install -r requirements_win.txt --user 安装依赖了。

3.AttributeError: module ‘numpy’ has no attribute ‘bool’.

解决方法:pip install numpy==1.23.4 --user ,安装指定numpy版本1.23.4(不加限制会下载到1.24的),所以可以一开始在requirements_win.txt文件中修改。

4.No module named ‘faiss’
解决方法:pip install faiss-cpu --user

5.Cannot uninstall ‘llvmlite’.
解决方法:pip install librosa --ignore-installed llvmlite --user

6.TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.

解决方法:pip install protobuf==3.19.0 --user

7.module ‘PIL.Image’ has no attribute ‘ANTIALIAS’
解决方法:pip install Pillow==9.5.0 --user

8.OSError: [WinError 1455] 页面文件太小,无法完成操作 或 torch.multiprocessing.spawn.ProcessExitedException: process 0 terminated with exit code 3221225477
解决方法:按文中内容操作设置。

9.torch.cuda.OutOfMemoryError: CUDA out of memory
解决方法:修改configs/config.json文件中的batch_size参数。比如24G显存我设置的18。

10.TypeError: init() got an unexpected keyword argument ‘dtype’
解决方法:我直接删除了train.py代码中的dtype参数。

11.ImportError: cannot import name ‘Mish’ from ‘torch.nn’
这个是训练扩散模型时遇到的,需要升级torch。首先是我租用设备的版本信息如下:

>>> import torch
>>> torch.__version__
'1.8.0+cu111'
>>> import torchvision
>>> torchvision.__version__
'0.9.0+cu111'

所以升级选择的是:

pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html

经过上述一系列的坑,现在我上去装这一套环境到能正常跑起来只需要三四十分钟(主要是下载耗时,虽然下载速度已经很快了)。真是熟练的让人心疼,哈哈。

过程记录

我准备了379个音频片段,时长45分钟。(一开始有六百多片段,一个半小时。后面发现训练出来的效果不理想,删除了一些效果不好的。)

主模型训练过程图:

请添加图片描述
这个截图是当时训练六百多条数据时的,如果没有将configs/config.json文件中all_in_mem改为true,大概一次epoch 60s左右。七八分钟两百步的样子。图中是开启后的效果,提升了30%的样子。后面三百多条数据时,大概一次epoch 25s左右。

扩散模型训练过程图:

请添加图片描述
浅扩散速度就很快了,跑了大约三小时5万步就出来了。

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

TensorBoard:(查看命令:tensorboard --logdir=logs/44k

请添加图片描述

下面引用大佬关于loss的指标说明:

  • loss/g/total上升,loss/d/total收敛:考虑数据集质量问题。
  • loss/g/fm上升为正常现象。
  • loss/g/total先下降后上升:考虑是否过拟合。
  • loss/g/lf0应收敛在1e-4以下,loss/g/kl应收敛在0.5以下,loss/g/mel应震荡下降。
  • 这绝不是衡量模型的唯一标准,最好的loss计算器就是你自己。

总结

目前我主模型和扩散模型都训练了5万步,效果还可以。硬伤还是音频数据集质量不高,再练下去感觉提升也不会太多了。

请添加图片描述

以我目前的亲测尝试,选择crepe作为f0预测器可以减少一些哑音,但是会跑调(具体数值需要自己去调整)。使用浅扩散模型可以减少电流音。当然这两个同时打开推理的时间也会变得很长。但是效果也是相对较好的。另外发现rmvpe的效果也不错。

请添加图片描述


文末,我也贴出来了我参考过的一些相关内容,希望可以帮到你。

到此,就是我最近对so-vits-svc-4.1的完整心得记录,后面如果有新的发现也会继续更新。如果你也有好的经验及建议,欢迎评论区讨论。文中如果有理解不对的地方也欢迎指出,让我们共同进步!

参考

  • 最强 AI 人声伴奏分离工具 UVR5
  • So-VITS-SVC 4.0 训练/推理常见报错和Q&A
  • 【AI变声/翻唱】so-vits-svc指南
  • so-vits-svc4.0 中文详细安装、训练、推理使用教程
  • 手把手教你声音克隆(so-vits-svc)
  • 喂饭级SO-VITS-SVC教程,轻松生成AI歌曲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/86253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows使用MobaXterm远程访问ubuntu20.04桌面

参考ubuntu 2020.4 安装vnc 一、脚本文件 remote_setup.sh脚本文件内容: #! /bin/bash #参考链接:https://blog.csdn.net/hailangdeyingzi/article/details/124507304 sudo apt update sudo apt install x11vnc -y sudo x11vnc -storepasswd telpo.12…

LeetCode算法心得——k-avoiding 数组的最小总和(标记数组)

大家好,我是晴天学长,这是一个细节题和一部分的思维题哈! 2) .算法思路 k-avoiding 数组的最小总和 1,填充一个1到n 的Boolean的数组 要n个数,但是数组大小不能确定。 所以建立1000的大小。 2.遍历筛选,如果数组中有这…

测试框架pytest教程(5)运行失败用例-rerun failed tests

# content of test_50.py import pytestpytest.mark.parametrize("i", range(50)) def test_num(i):if i in (17, 25):pytest.fail("bad luck") 运行这个文件,2个失败,48个通过。 要运行上次失败的测试用例,可以使用--l…

vue 简单实验 自定义组件 综合应用 传参数 循环

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"todo-list-app"><ol><!--现在我们为每个 todo-item 提供 todo 对象todo 对象是变量&#xff0c;即其内容可以是动态的。…

Postman 如何进行参数化

前言 Postman作为一款接口测试工具&#xff0c;受到了非常多的开发工程师的拥护。 那么做为测试&#xff0c;了解Postman这款工具就成了必要的了。 这篇文章就是为了解决Postman怎么进行参数化的。 全局变量 全局变量是将这个变量设置成整个程序的都可以用&#xff0c;不用去…

深度学习3:激活函数

一、激活函数的简介与由来 激活函数&#xff1a;是用来加入非线性因素的&#xff0c;解决线性模型所不能解决的问题。 线性函数的组合解决的问题太有限了&#xff0c;碰到非线性问题就束手无策了。如下图。 通过激活函数映射之后&#xff0c;可以输出非线性函数。 最后再通过…

OpenHarmony应用实现二维码扫码识别

本文转载自《OpenHarmony应用实现二维码扫码识别》&#xff0c;作者zhushangyuan_ 概念介绍 二维码的应用场景非常广泛&#xff0c;在购物应用中&#xff0c;消费者可以直接扫描商品二维码&#xff0c;浏览并购买产品&#xff0c;如图是购物应用的扫描二维码的页面。 本文就以橘…

网络防御与蓝队实践:探讨网络防御策略、入侵检测系统、安全事件响应等蓝队方面的实际案例和方法

第一章&#xff1a;引言 网络安全一直是当今信息社会中至关重要的话题。随着技术的不断发展&#xff0c;网络威胁也愈发复杂和隐匿。在这样的背景下&#xff0c;网络防御变得尤为重要&#xff0c;蓝队作为网络防御的重要一环&#xff0c;起着至关重要的作用。本文将深入探讨网…

部署FTP服务(二)

目录 2.访问FTP服务 1.使用ftp命令行工具 2.使用浏览器 3.使用FileZilla Client 3.Serv-U 1.定义新域 2.创建用户 4. windowsserver搭建ftp服务器 一、FTP工具 二、Windows资源管理器 三、IE浏览器访问 2.访问FTP服务 下面在一台装有Windows10操作系统的计算机中&#…

unity 之 Vector 数据类型

文章目录 Vector 1Vector 2Vector 3Vector 4 Vector 1 在Unity中&#xff0c;Vector1 并不是一个常见的向量类型。 如果您需要表示标量&#xff08;单个值&#xff09;或者只需要一维的数据&#xff0c;通常会直接使用浮点数&#xff08;float&#xff09;或整数&#xff08;in…

ONES × 鲁邦通|打造研发一体化平台,落地组织级流程规范

近日&#xff0c;ONES 签约工业互联网行业领先的解决方案提供商——鲁邦通&#xff0c;助力鲁邦通优化组织级流程规范&#xff0c;落地从需求到交付的全生命周期线上化管理。 依托于 ONES 一站式研发管理平台&#xff0c;鲁邦通在软硬件设计开发、项目管理和精益生产等方面的数…

大语言模型之四-LlaMA-2从模型到应用

最近开源大语言模型LlaMA-2火出圈&#xff0c;从huggingface的Open LLM Leaderboard开源大语言模型排行榜可以看到LlaMA-2还是非常有潜力的开源商用大语言模型之一&#xff0c;相比InstructGPT&#xff0c;LlaMA-2在数据质量、培训技术、能力评估、安全评估和责任发布方面进行了…

Gitlab服务部署及应用

第四阶段 时 间&#xff1a;2023年8月21日 参加人&#xff1a;全班人员 内 容&#xff1a; Gitlab服务部署及应用 目录 一、Gitlab简介 二、Gitlab工作原理 三、Gitlab服务构成 四、Gitlab的优点 五、Gitlab环境部署 &#xff08;一&#xff09;安装部署 &#xf…

数据结构(3)

线性表是多个具有相同特征的数据的有限序列。 前驱元素&#xff1a;A在B前面&#xff0c;称A为B的前驱元素。 后继元素&#xff1a;B在A后面&#xff0c;称B为A的后继元素。 线性表特征&#xff1a; 1.一个元素没有前驱元素&#xff0c;就是头结点&#xff1b; 2.最后一个…

Promise.all和promise.race的应用场景举例

Promise.all( ).then( )适用于处理多个异步任务&#xff0c;且所有的异步任务都得到结果时的情况。 <template><div class"box"><el-button type"primary" plain click"clickFn">点开弹出框</el-button></div> &…

【React】生命周期和钩子函数

概念 组件从被创建到挂载到页面中运行&#xff0c;再到组件不用时卸载的过程。 只有类组件才有生命周期。 分为三个阶段&#xff1a; 挂载阶段更新阶段销毁阶段 三个阶段 挂载阶段 钩子函数 - constructor 创建阶段触发 作用&#xff1a;创建数据 之前定义状态是简写&…

arm: day8

1.中断实验&#xff1a;按键控制led灯 流程&#xff1a; key.h /*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒***************************************…

海外网红营销中的创新技术与趋势:AI、AR和VR的应用探索

随着全球数字化时代的不断发展&#xff0c;互联网已经成为连接人们的桥梁&#xff0c;而社交媒体则在其中扮演着举足轻重的角色。在这个全球性的社交媒体网络中&#xff0c;海外网红以其独特的个人魅力和内容创作能力迅速崭露头角。而为了在竞争激烈的市场中脱颖而出&#xff0…

LeetCode150道面试经典题-- 二叉树的最大深度(简单)

1.题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 2.示例 3.思路 深度优先遍历 一个二叉树要查询到最大深度&#xff0c;可以将问题转为从根节点出发&#xff0c;查看左右子树的最大深度&am…

AMBA总线协议(8)——AHB(六):分割传输

一、前言 在之前的文章中&#xff0c;我们重点介绍了AHB传输的仲裁&#xff0c;首先介绍了仲裁相关的信号&#xff0c;然后分别介绍了请求总线访问&#xff0c;授权总线访问&#xff0c;猝发提前终止&#xff0c;锁定传输和默认主机总线&#xff0c;在本文中我们将继续介绍AHB的…
最新文章