如何训练自己的AI歌手

如何训练自己的AI歌手

结论

  1. 进行voice conversion时,拥有的训练集越长,覆盖的音域越广,则效果越好
  2. 注意使用男声训练的模型去推理女声/童声的歌时要进行变调,反过来也一样
  3. 如果需要非常好的效果,最好能够对模型推理的音频使用专业的音频软件做后期处理

常见概念

伴奏:伴奏是一首音乐曲目中除去主唱或主旋律部分的音轨。它通常包括鼓、贝斯、吉他、键盘和其他乐器,用来支持和衬托主旋律。伴奏通常用于伴唱或混音时,以便歌手可以在其上表演主旋律。

混响:混响是指声音在各种表面上反射、折射和散射后所产生的回声效果。在音频处理中,混响通常通过数字信号处理来模拟。它可以让音频听起来更加自然,仿佛是在一个具有反射的房间中录制的,而不是在一个干燥的声音环境中。

和声:和声是指多个声音同时响起,以创造和谐的音乐效果。和声可以是由多个乐器或歌手演奏的不同音符组成的。和声可以丰富音乐的声音质量,并增加音乐的复杂性和情感深度。在合唱中,不同的歌手通常会唱不同的和声部分。

干声:干声是指未经任何效果处理或混音的原始音频信号。它是音乐或声音录制的初始状态,没有添加混响、均衡或其他音频效果。通常,音频制作中会先录制干声,然后再根据需要添加混响、均衡、压缩等效果,以获得所需的音乐或声音效果。

音色泄露:输出声音贴近输入源声音,与训练集声音不一致

训练集要求

去掉乐器,伴奏,混响,和声,只有人的干声,尽量覆盖各个音调的数据,训练数据集最好在1个半小时以上

微调经验

  1. 无论sovits还是diff-svc,为了获得比较好的效果都推荐1000条以上或2小时以上时长的语音(单声道wav格式并且采样率尽可能高),单条语音尽量控制在2-15s左右的长度,长音频切割可使用自动切片机(audio-slicerUI:https://github.com/flutydeer/audio-slicer)(本次实验采用的whisper),假如游戏角色语音过少找代餐是不错的选择,数据集音频质量>音频数量。

  2. 语音尽量去除底噪和混响,使用歌声作为数据集需要考虑混响的问题,否则推理出来可能会自带噪声和混响(惨痛教训),降噪我用的是AU。直播录制的音频需要去除BGM和杂音,如果数据集来源并不统一可能需要使用AU进行响度匹配。

  3. 另外要是您不能保证数据集均处在一个比较高的质量,训练sovits模型是更好的选择,(diff-svc的上限虽然更高,但对数据集质量要求也更高)。

  4. 训练多人模型存在音色泄露的风险,但模型可能会获得更好的音域。

    作者:米饭芋头 https://www.bilibili.com/read/cv21951047/ 出处:bilibili

  5. 如果训练集音质差底噪大,20~30足够了,调太高,底模音质无法带高你的低音质训练集
    如果训练集音质高底噪低时长多,可以调高,200是ok的

    此处引用: https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI

过程

数据集获取
NamePath
Linjunjiehttp://192.168.1.199/software/song/linjunjie_resample/
Xuezhiqianhttp://192.168.1.199/software/song/xuezhiqian_resample/
Xusonghttp://192.168.1.199/software/song/xusong_resample/
Zhaoshaohanhttp://192.168.1.199/software/song/zhaoshaohan_vocal/
Nayinghttp://192.168.1.199/software/song/naying/
音频重采样

此处进行重采样是因为,后续调用uvr5的模型进行去噪的时候,不进行重采样,去噪会失败

# 打开wav文件
audio = AudioSegment.from_file(input_path, format="wav")

# 设置采样率为44100 Hz
audio = audio.set_frame_rate(44100)

# 保存为新的wav文件
audio.export(output_path, format="wav")
音频切片
import subprocess
from pathlib import Path
import librosa
from scipy.io import wavfile
import numpy as np
import torch
import csv
import whisper

def split_long_audio(model, filepaths, character_name, save_dir="data_dir", out_sr=44100):
    if isinstance(filepaths, str):
        filepaths = [filepaths]

    for file_idx, filepath in enumerate(filepaths):

        save_path = Path(save_dir) / character_name
        save_path.mkdir(exist_ok=True, parents=True)

        print(f"Transcribing file {file_idx}: '{filepath}' to segments...")
        result = model.transcribe(filepath, word_timestamps=True, task="transcribe", beam_size=5, best_of=5)
        segments = result['segments']

        wav, sr = librosa.load(filepath, sr=None, offset=0, duration=None, mono=True)
        wav, _ = librosa.effects.trim(wav, top_db=20)
        peak = np.abs(wav).max()
        if peak > 1.0:
            wav = 0.98 * wav / peak
        wav2 = librosa.resample(wav, orig_sr=sr, target_sr=out_sr)
        wav2 /= max(wav2.max(), -wav2.min())

        for i, seg in enumerate(segments):
            start_time = seg['start']
            end_time = seg['end']
            wav_seg = wav2[int(start_time * out_sr):int(end_time * out_sr)]
            wav_seg_name = f"{character_name}_{file_idx}_{i}.wav"
            out_fpath = save_path / wav_seg_name
            wavfile.write(out_fpath, rate=out_sr, data=(wav_seg * np.iinfo(np.int16).max).astype(np.int16))
            
whisper_size = "medium"
whisper_model = whisper.load_model(whisper_size)
split_long_audio(whisper_model, "filename.wav", "test", "dataset_raw") # 请在{filename}处填写您上传的wav文件名
去伴奏

注:音频的均处理采用https://github.com/Anjok07/ultimatevocalremovergui以及https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main所提供的模型进行处理

1. 带和声的音频使用h5模型去除伴奏,该模型可以去除和声以及伴奏
2. 不带和声的音频可以选用h2,h3,h4
3. 训练过程中 统一使用了h5模型去伴奏
去和声
1. 使用h5模型去和声
去混音
1. 使用DeEcho-DeReverb去混音
2. 使用DeEcho-Aggressive
去噪声
1. 使用DeEcho-Denoise去除噪音
训练参数

本次训练过程基于Retrieval-based-Voice-Conversion-WebUI实现,训练参数:重采样率:48k,并使用rmpve进行音高提取。其它均采用默认参数

推理注意事项

训练数据集为男生,推理女生的歌时,需要进行变调,本次的变调参数为+5,同理女转男也需要进行变调,本次实验中所使用的变调参数为-5,男唱童歌:-12,女唱童歌-8

实验数据
modelloss_discloss_genloss_fmloss_melloss_klEpochdes
a3.1764.31114.75027.7032.17850音色泄露有点严重
b3.4263.90811.68324.9181.70150a
cMissingMissingMissingMissingMissing20模型效果较差,存在很多杂音
d3.2873.91516.79726.0731.652200模型效果并没有比epoch 50的更优
e3.4263.90811.68324.9181.70150效果一般
fMissingMissingMissingMissingMissing20效果较差
g3.5033.54912.85425.8531.79250效果一般
优化方向
  1. 不同的声音模型进行融合
  2. 优化数据集
  3. 使用diff-vit或者sovits
  4. 对生成的音频使用专业的音频软件进行后处理

主要参考项目

  1. https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI
  2. https://github.com/svc-develop-team/so-vits-svc

相关论文

  1. https://arxiv.org/abs/2106.06103
  2. https://arxiv.org/abs/2305.17651
  3. https://arxiv.org/abs/2212.04356
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Saber_Alpha

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值