0


AI 翻唱

本文记录用 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 True
    else: 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+=x
    comb.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_silence

def Cut_data(inf,out_dir):
    audio=AudioSegment.from_wav(inf)
    # 分割音频去除静音部分,下面参数可以自行修改
    chunks=split_on_silence(
        audio,
        min_silence_len=1000,  # 认为是静音的最小长度,单位为毫秒
        silence_thresh=-50,    # 静音判断的阈值,单位为dBFS
        keep_silence=200       # 保留的静音时长,单位为毫秒
    )

    l=3000             # 最小片段时长,单位为毫秒
    r=10000            # 最大片段时长,单位为毫秒
    seg=AudioSegment.empty()
    cnt=0
    for i in chunks:
        st=0
        while st<len(i):
            k=randint(l,r)
            ed=st+k
            if 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+=1
            st=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_silence

def Cut_data(inf,out_dir):
    audio=AudioSegment.from_wav(inf)
    l=5000             # 最小片段时长,单位为毫秒
    r=10000            # 最大片段时长,单位为毫秒
    seg=AudioSegment.empty()
    cnt=0
    st=0
    while st<len(audio):
        k=randint(l,r)
        ed=st+k
        if 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+=1
        st=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

Update 1

训练参数,供参考:

    "train": {
        "log_interval": 200,
        "eval_interval": 800,
        "seed": 1234,
        "epochs": 10000,
        "learning_rate": 0.0002,
        "betas": [
            0.8,
            0.99
        ],
        "eps": 1e-09,
        "batch_size": 12,
        "fp16_run": false,
        "half_type": "fp16",
        "lr_decay": 0.999875,
        "segment_size": 10240,
        "init_lr_ratio": 1,
        "warmup_epochs": 0,
        "c_mel": 45,
        "c_kl": 1.0,
        "use_sr": true,
        "max_speclen": 512,
        "port": "8001",
        "keep_ckpts": 3,
        "all_in_mem": true,
        "vol_aug": false
    }

Update 2

训练效果受多个因素的影响,显存允许的情况下调大 batch_size ,尽量保证数据集声音干净,不要出现杂音。

训练的步数和数据集有关,我有 900 多个数据,可以训练到 8w 步到 10w 步,数据集少可以少训练一点,主要关注损失值,损失值是上下波动的,中途可以把你觉得损失值低的模型另存,保存G和D开头的文件即可,要使用的时候再把模型放到 logs\44k 文件夹。

如果是女声翻唱男声歌曲,建议先用调音器把歌曲中的男声升调为女声,再进行推理。(男翻女同理)

结果中出现咬词不清的情况属于正常现象,特别是跨语言推理时尤其明显,你可以更换编码器或者训练聚类模型,但是有可能会损失音色。

另外,推理的歌曲也尽量选择干净的干声,有合唱或者特殊发音的情况推理效果并不好。翻唱效果不可能完全达到理想,后续工作就交给调音师了。


本文转载自: https://blog.csdn.net/qq_60256199/article/details/143442005
版权归原作者 2,4(1H,3H)-PD are mine 所有, 如有侵权,请联系我们删除。

“AI 翻唱”的评论:

还没有评论