本文记录用 So-vits-svc 4.1 训练模型全过程。
需要用到的工具
UVR:用于人声歌声分离,降噪。 (项目传送门)
Slicer-gui(Audio-Slicer):用于音频裁剪。(项目传送门)
So-vits-svc 4.1:训练模型,GitHub项目中详细介绍了模型使用方法,本文使用 4.1 版本。(项目传送门)
Adobe Audition:后期音频编辑。(天翼云下载)
数据准备
准备一段需要训练的音频文件,说话干声或者是清唱,时间最好在 1-2 小时,如果有伴奏需要进行人声分离。
本次使用锁那的生放送弹唱录音,时长 2.5 小时左右。
如果有多个音频需要合成一个方便后面处理:
import os
from pydub import AudioSegment
def che_audio(f):if f.endswith('.mp3') or f.endswith('.mp4') or f.endswith('.wav'): return Trueelse: return False
def merge_audio(inf,outf):comb=AudioSegment.empty()files=os.listdir(inf)files.sort(key=lambda x:os.path.getctime(os.path.join(inf,x)))for f in files:if che_audio(f):f_pth=os.path.join(inf,f)x=AudioSegment.from_file(f_pth)comb+=xcomb.export(outf,format="wav")if __name__ == "__main__":inf="D:\\study\\AI\\ai_music\\data"outf="combined.wav"merge_audio(inf,outf)
人声分离
如果音频数据中含有歌曲伴奏,需要进行这一步。
打开 UVR ,选择输入音频就是待处理的音频文件,输出路径,模型选择 Demucs,其他默认设置即可。注意 UVR 的安装目录中不能包含中文名。
Start Processing 后会生成两个文件,后面带有 _(Vocals) 是需要的干声文件,_(Instrumental) 为分离出的伴奏。
降噪
还是使用 UVR ,输入音频换成刚才处理好的干声音频,模型选择 VR Architecture,其他保持默认设置。
处理结果:
音频切割
这里可以自行写脚本完成,分为两步:一是去除数据集中静音部分,然后把音频分割为时长在 3~15 秒之间的数据段。
import os
from pydub import AudioSegment
from random import randint
from pydub.silence import split_on_silencedef Cut_data(inf,out_dir):audio=AudioSegment.from_wav(inf)# 分割音频去除静音部分,下面参数可以自行修改chunks=split_on_silence(audio,min_silence_len=1000, # 认为是静音的最小长度,单位为毫秒silence_thresh=-50, # 静音判断的阈值,单位为dBFSkeep_silence=200 # 保留的静音时长,单位为毫秒)l=3000 # 最小片段时长,单位为毫秒r=10000 # 最大片段时长,单位为毫秒seg=AudioSegment.empty()cnt=0for i in chunks:st=0while st<len(i):k=randint(l,r)ed=st+kif ed>len(i): ed=len(i)seg=i[st:ed]pth=os.path.join(out_dir,f"{cnt}.wav")seg.export(pth,format="wav")cnt+=1st=ed
if __name__ == "__main__":inf="D:\\study\\AI\\ai_music\\data\\1_1_【音频】[鎖那_sana]生放弹唱精选合集_(Vocals)_(Vocals).wav"out_dir="D:\\study\\AI\\ai_music\\data\\cut_data"Cut_data(inf,out_dir)
也可以通过音频切割工具 Audio-Slicer 完成
处理后的数据保存到文件夹中。
模型训练
把数据文件放到 dataset_row 目录下:
打开 启动webui,在训练窗口识别数据集。
识别出数据集后进行数据预处理,没有报错信息进行下一步
下面根据提示结合本机性能设置参数
写入配置文件后,可以在 configs 文件中的 config.json 查看训练参数和数据参数,也可以直接修改该文件来设置参数
第一次训练选从头开始训练,如果从上一个训练进度继续训练选择继续上一次训练进度。
设置是每 200 步生成一次 Epoch,主要关注损失值 reference_loss,该值越小越好。在训练的过程中 reference_loss 的值是震荡的。
在文件夹 logs/44k 中保存了G开头的文件为最近的模型文件,后面是步数。
打开脚本文件 启动tensorboard.bat 可以查看训练可视化图形
访问网址,找到 loss 图像,可以选择一个 loss 值较低的模型来使用。
推理
在推理窗口选择推理模型和配置文件,编码器按照默认设置。
上传需要转换的音频,音频也需要是经过处理后的不含伴奏的干声。如果电脑性能不够好的话把音频切割为几个部分再分别推理。
但是还是推荐把音频拆开批量上传,进行推理后把结果合到一起。这样不仅速度快,还可以对产生哑音或者拟合不好的音频段进行单独处理。
推理可以保留静音,不影响推理,也方便后期音频合成
import os
from pydub import AudioSegment
from random import randint
from pydub.silence import split_on_silencedef Cut_data(inf,out_dir):audio=AudioSegment.from_wav(inf)l=5000 # 最小片段时长,单位为毫秒r=10000 # 最大片段时长,单位为毫秒seg=AudioSegment.empty()cnt=0st=0while st<len(audio):k=randint(l,r)ed=st+kif ed>len(audio): ed=len(audio)seg=audio[st:ed]pth=os.path.join(out_dir,f"{cnt}.wav")seg.export(pth,format="wav")cnt+=1st=ed
if __name__ == "__main__":inf="D:\\study\\AI\\ai_music\\Inference\\data\\似水流年\\1_1_【音频】吳若希 Jinny - 似水流年 (劇集 _(Vocals)_(Vocals).wav"out_dir="D:\\study\\AI\\ai_music\\Inference\\data\\似水流年\\cut"Cut_data(inf,out_dir)
如果推理是男转女或者女转男,需要修改变调的值,男声翻唱女声为负值,女生翻唱男生为正值。男转女变调可以设置到 6~10,根据具体情况进行调整。
使用批量转换,结果会被保存到 results 文件夹中。
最后把推理出的切片声音整合到一起形成干声,再用 Adobe Audition 调节音频后多轨合成即可。
结果
【AI鎖那】-《似水流年》Cover. 吴若希_哔哩哔哩_bilibili