A卡配置sovits4.0(AI配音/翻唱)详细步骤参考(Ubuntu20.04)
之前用A卡配置过AI绘画,最近发现AI配音/翻唱挺火的,这里也来尝试一下。(N卡用户直接使用整合包就行,别来凑热闹)
一、基础环境配置
最开始的步骤还是一样,安装双系统、显卡驱动、ROCm,步骤和之前一样,就不重复写了,可以去看我之前Novel的文章
https://www.cnblogs.com/strawberryPudding/p/17091563.html
安装完成后重启,可以执行这两条命令看一下
/opt/rocm/bin/rocminfo
/opt/rocm/opencl/bin/clinfo
这里要注意的是,我使用的6700xt是RDNA2架构的显卡,这里可以看到有个gfx1031,这里圈起来要考哦,RDNA2架构的显卡应该都是大于1030的。
如果是其他架构的老显卡,后面torch和环境变量的配置有区别,我参考的是这个文章,可以去原文看看:
https://www.bilibili.com/read/cv22017901
二、so-vits4.0的安装配置
考虑到很多人可能不会使用git,并且官方目前暂停提供底模文件,我在百度云给你们整了一份资源合集:
链接:https://pan.baidu.com/s/1_Cx19msrqCoK62TeX_TdRA
提取码:p6dd
1,从git拉取项目
去github找到这个项目:https://github.com/svc-develop-team/so-vits-svc
我当时使用的是这个提交的节点,如果你们拉最新的项目下来跟本文章有所出入,请自行随机应变
2,放入模型文件
按照github上面说明文档的要求,将checkpoint_best_legacy_500.pt放入hubert目录,这个如果没有百度云会员,建议你们直接去项目说明文档的链接去下载,挺大的。
目前官方暂未开放底模文件下载,没有底模也可以训练,但是最好还是去我的百度云链接里面下一个。个人猜测底模文件是给梯度下降算法一个合适的初始值,避免被带入奇怪的局部最优解。
3,依赖库安装
按照官方的说明,这个代码可以在python3.8的环境下运行,Ubuntu20.04自带的python版本就是3.8。
不过我建议各位先确认一下python和pip版本是否都是3.8,不然装错了还得重头来,如果你们像我一样折腾过AI绘画,可能导致有更多的py版本。
如果python版本不对,可以使用以下命令添加、查看、管理python版本
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2
update-alternatives --list python
update-alternatives --config python
在python版本正确的情况下,如果pip版本对不上(截图中的情况),可以使用以下命令更新pip
python -m pip install --upgrade pip
后续操作全部在python3.8,pip是对应版本,并且不在管理员权限下运行!!!(注意,sudo/su之后,python环境可能与初始环境不同,检查一下,千万不要输入过su或者加上sudo)
先提前安装专门的torch-ROCm,用依赖文档的话下载的不是ROCm版本的。
pip install torch==1.13.1+rocm5.2 --extra-index-url https://download.pytorch.org/whl/rocm5.2
2023.12补充:torchaudio的版本要与torch对应,torchaudio0.x对应torch1.x,torchaudio2.x对应torch2.x
然后修改依赖文档requirements.txt,首先删除刚刚已经安装过的torch,然后指定numpy版本1.23.4,调整scipy版本1.8.1
这里每一个调整都是必须的,不然会有报错。首先项目中会使用numba0.56.4,这个库最高支持numpy1.23.4(不加限制会下载到1.24的)。这里下调之后,原本的scipy版本依然不支持,它需要更低的numpy版本,此处我并没有继续下调numpy版本,而是上调scipy版本。你们不按我这个版本来也行,反正保证这些库都正常运行不报错就可以了。
建议先换源再安装依赖文档,这里面东西挺多,还有依赖库的依赖库,实际安装过程并不止依赖文档里这些。从境外下载可能会三天三夜睡不着觉。
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements.txt
4,检验torch是否安装正确
更改环境变量,注意这个更改是一次性的,每次重启,执行命令前都要改。(注:这个设置仅适用于RDNA2架构的显卡)
export HSA_OVERRIDE_GFX_VERSION=10.3.0
以下这个函数如果返回true就是安装正确的。
python3
import torch
torch.cuda.is_available()
5,训练
按照官方说明里面要求的文件结构,放入人声文件(我稍后会说明如何提取人声),注意命名建议全部英文+字符
依次执行以下三个脚本(需要先用cd命令打开项目路径哦)
python resample.py
python preprocess_flist_config.py
python preprocess_hubert_f0.py
可以修改configs/config.json来适应你的显卡,batch_size根据显存大小具体设置,我这里12G显存就先不动了,batch_size默认是6。如果你修改了batch,根据Linear Scaling Rule,你应该等比调整learning_rate。
接下来就可以开始训练了
python train.py -c configs/config.json -m 44k
等待几分钟,如果没有报错并且看到类似下图的内容时,就开始训练了。我这里每次输出大约9s,200步有67次输出大概是10分钟,如果训练完10000步大概要8个小时吧(这个速度仅供参考)
可以使用tensorboard来监控训练,正常来说Loss会逐步下降并收敛的
tensorboard --logdir=logs/44k
此处我还遇到了一个大坑,就是有可能会默认多卡协同训练,比如说我CPU是AMD 5700G,带一个核显。这样会导致离奇的内存错误。
Memory access fault by GPU node-2 (Agent handle: 0x933de20) on address (nil). Reason: Page not present or supervisor privilege.
in join raise ProcessExitedException(torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGABRT
此时需要修改代码,在主函数之前,指定只有6700xt参与训练,这里你们的显卡不一定是0号显卡,如果遇到类似问题,先确认一下你的独显是几号设备
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
6,推理
根据官方的说明,使用以下命令进行推理
python inference_main.py -m "logs/44k/G_30400.pth" -c "configs/config.json" -n "君の知らない物語-src.wav" -t 0 -s "nen"
其中pth是刚刚训练的文件(默认保存最后3个,可以修改配置的keep_ckpts的数量进行修改),每800步都会保存一个(大概吧,我也没有再往后跑了)。wav是切成小段的要模仿的人声,我这个显卡推理1分钟以下的音频没有问题。把这个音频放入raw文件夹下。nen是默认的人物名字,请修改成之前训练时dataset_raw下面文件夹的名字。
这三处都要修改,比如说我此处改成
python inference_main.py -m "logs/44k/G_800.pth" -c "configs/config.json" -n "BGM1.wav" -t 0 -s "Mahiro"
三、音频处理方法参考
1,剪辑后导出
之前的训练,使用的是别当欧尼酱了第一集的声音,比如说这里我已经将男主说话的声音全部切到轨道2中,如何导出呢。
(补充:声音最好要有1-2小时,但是没有的话不要硬凑,噪音太大去不干净的建议剪掉。甚至我这里只有几分钟也是可以训练的,就是结果差一点)
首先复制一份序列,删除轨道1和3上面的资源(最开始最好不要取消链接,不然根本搞不清哪里对哪里),这样中间会有很多空隙。选择封闭间隙,就缩到一起啦。
2,安装ffmpeg
去下载官方的,不要用pip安装,下载完之后把bin目录加入环境变量的Path(后面可能需要这个),不装可能在音频格式转换时有问题。
3,人声提取
不管是要模仿的歌曲,还是之前的声音剪辑,往往带有BGM和其他噪音,这里使用UVR5进行提取(相关资源在之前的百度云链接里面有,也可以自行下载)
这里就不多赘述了,网络上有很多资料,个人感觉Demucs去BGM好用,VR5卡拉OK去除和声好用,VR7大模型提取BGM好用(连不上服务器可能下不了模型,我把这俩已经放在百度云分享里)
我们A卡用户就不要奢望GPU加速了,勾不上的,能让我们用CPU慢慢跑起来就不错了。
4,音频切割
推理音乐的话用AU自己手动切开,长度看你的显存,反正我12G大概1分钟以内。
训练用的人声需要切成10s出头的小块,别人的N卡sovits攻略里面的Audio Slicer是可以用的哈,我这里给大家表演一手花活,让newbing来给我们切音频。经过我跟newbing长达两个半小时的拉扯,它终于……开摆了,不过最终还是留下一段稍微能用的代码,我给小小改动了一下。
其实这个函数的参数和Audio Slicer挺像的,应该都是根据最小分贝和静默时长,找到不说话的地方切开,只不过newbing并没有把切开的语音合起来,我给它修改了切割参数,并加了一句拼接音频的代码,实测可以用。
from pydub import AudioSegment from pydub.silence import split_on_silence import os def split_audio_file(file_path): # 读取音频文件 audio = AudioSegment.from_file(file_path) print(1) # 将音频文件切分成10秒以上、20秒以下的小段 min_silence_len = 300 # 最小静默时间(毫秒) silence_thresh = -50 # 静默阈值(分贝) keep_silence = 200 min_chunk_len = 10000 # 每一段的最小长度(毫秒) max_chunk_len = 20000 # 每一段的最大长度(毫秒) chunks = [] chunks = split_on_silence(audio, min_silence_len=min_silence_len, silence_thresh=silence_thresh,keep_silence = keep_silence) print(2) # 将每一段切分成20秒以下的小段 new_chunks = [] for chunk in chunks: if(len(new_chunks) > 0 and len(new_chunks[-1]) < min_chunk_len and len(chunk) < min_chunk_len): new_chunks[-1] += chunk #俩小于10s的接在一起 elif len(chunk) > max_chunk_len: new_chunks += chunk[::max_chunk_len] else: new_chunks.append(chunk) print(3) # 保存每一段 for i, chunk in enumerate(new_chunks): chunk.export(os.path.splitext(file_path)[0] + '_chunk{0}.wav'.format(i), format='wav') # 测试代码 split_audio_file('1_b.wav')
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业