草莓♭布丁

导航

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')

 

 

posted on 2023-04-02 17:14  草莓♭布丁  阅读(8429)  评论(0编辑  收藏  举报

Live2D