如何训练自己的AI歌手
结论
- 进行voice conversion时,拥有的训练集越长,覆盖的音域越广,则效果越好
- 注意使用男声训练的模型去推理女声/童声的歌时要进行变调,反过来也一样
- 如果需要非常好的效果,最好能够对模型推理的音频使用专业的音频软件做后期处理
常见概念
伴奏:伴奏是一首音乐曲目中除去主唱或主旋律部分的音轨。它通常包括鼓、贝斯、吉他、键盘和其他乐器,用来支持和衬托主旋律。伴奏通常用于伴唱或混音时,以便歌手可以在其上表演主旋律。
混响:混响是指声音在各种表面上反射、折射和散射后所产生的回声效果。在音频处理中,混响通常通过数字信号处理来模拟。它可以让音频听起来更加自然,仿佛是在一个具有反射的房间中录制的,而不是在一个干燥的声音环境中。
和声:和声是指多个声音同时响起,以创造和谐的音乐效果。和声可以是由多个乐器或歌手演奏的不同音符组成的。和声可以丰富音乐的声音质量,并增加音乐的复杂性和情感深度。在合唱中,不同的歌手通常会唱不同的和声部分。
干声:干声是指未经任何效果处理或混音的原始音频信号。它是音乐或声音录制的初始状态,没有添加混响、均衡或其他音频效果。通常,音频制作中会先录制干声,然后再根据需要添加混响、均衡、压缩等效果,以获得所需的音乐或声音效果。
音色泄露:输出声音贴近输入源声音,与训练集声音不一致
训练集要求
去掉乐器,伴奏,混响,和声,只有人的干声,尽量覆盖各个音调的数据,训练数据集最好在1个半小时以上
微调经验
-
无论sovits还是diff-svc,为了获得比较好的效果都推荐1000条以上或2小时以上时长的语音(单声道wav格式并且采样率尽可能高),单条语音尽量控制在2-15s左右的长度,长音频切割可使用自动切片机(audio-slicerUI:https://github.com/flutydeer/audio-slicer)(本次实验采用的whisper),假如游戏角色语音过少找代餐是不错的选择,数据集音频质量>音频数量。
-
语音尽量去除底噪和混响,使用歌声作为数据集需要考虑混响的问题,否则推理出来可能会自带噪声和混响(惨痛教训),降噪我用的是AU。直播录制的音频需要去除BGM和杂音,如果数据集来源并不统一可能需要使用AU进行响度匹配。
-
另外要是您不能保证数据集均处在一个比较高的质量,训练sovits模型是更好的选择,(diff-svc的上限虽然更高,但对数据集质量要求也更高)。
-
训练多人模型存在音色泄露的风险,但模型可能会获得更好的音域。
作者:米饭芋头 https://www.bilibili.com/read/cv21951047/ 出处:bilibili
-
如果训练集音质差底噪大,20~30足够了,调太高,底模音质无法带高你的低音质训练集
如果训练集音质高底噪低时长多,可以调高,200是ok的此处引用: https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI
过程
数据集获取
Name | Path |
---|---|
Linjunjie | http://192.168.1.199/software/song/linjunjie_resample/ |
Xuezhiqian | http://192.168.1.199/software/song/xuezhiqian_resample/ |
Xusong | http://192.168.1.199/software/song/xusong_resample/ |
Zhaoshaohan | http://192.168.1.199/software/song/zhaoshaohan_vocal/ |
Naying | http://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
实验数据
model | loss_disc | loss_gen | loss_fm | loss_mel | loss_kl | Epoch | des |
---|---|---|---|---|---|---|---|
a | 3.176 | 4.311 | 14.750 | 27.703 | 2.178 | 50 | 音色泄露有点严重 |
b | 3.426 | 3.908 | 11.683 | 24.918 | 1.701 | 50 | a |
c | Missing | Missing | Missing | Missing | Missing | 20 | 模型效果较差,存在很多杂音 |
d | 3.287 | 3.915 | 16.797 | 26.073 | 1.652 | 200 | 模型效果并没有比epoch 50的更优 |
e | 3.426 | 3.908 | 11.683 | 24.918 | 1.701 | 50 | 效果一般 |
f | Missing | Missing | Missing | Missing | Missing | 20 | 效果较差 |
g | 3.503 | 3.549 | 12.854 | 25.853 | 1.792 | 50 | 效果一般 |
优化方向
- 不同的声音模型进行融合
- 优化数据集
- 使用diff-vit或者sovits
- 对生成的音频使用专业的音频软件进行后处理
主要参考项目
- https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI
- https://github.com/svc-develop-team/so-vits-svc
相关论文
- https://arxiv.org/abs/2106.06103
- https://arxiv.org/abs/2305.17651
- https://arxiv.org/abs/2212.04356