整体原理:
- Step1,收集歌手的声音素材
- Step2,人声 和 背景音乐分离
- Step3,对歌手的声音进行切分 5-15秒
- Step4,模型训练
- Step5,模型推理(to 其他歌曲)
语音转换系统Voice Conversion
- A Comparison of Discrete and Soft Speech Units for Improved Voice Conversion. ieeexplore.ieee.org/document/97…
- 语音转换的目标是将源语音转换为目标语音,保持 内容不变。提出了自监督表示学习用于语音转换
- 离散内容编码表示会丢失一些语言内容,导致发音 不准确。为此,提出了通过预测离散单位分布学习 的软语音单位。通过建模,软语音单位捕捉更多的 内容,提高了转换语音的效果。
离散
粗语音的单位 离散内容编码器:将音频特征聚类,生成一系列离散的语音单位序列
软语音
衔接的过程 软内容编码器:被训练用于预测离散语音单位。Acoustic model将离散/软语音单位转换为目标声谱图。vocoder语音合成器将声谱图转换为音频波形
搭建Voice Conversion
colab.research.google.com/drive/12jL-…
步骤
step1 准备内容编码(包括离散内容和软语音)
Step1,下载 HuBERT content encoder
hubert = torch.hub.load("bshall/hubert:main", "hubert_soft").cuda()
Step2,下载 acoustic model
acoustic = torch.hub.load("bshall/acoustic-model:main", "hubert_soft").cuda()
Step3,下载 vocoder
hifigan = torch.hub.load("bshall/hifigan:main", "hifigan_hubert_soft").cuda()
Step4,准备 example.wav
source, sr = torchaudio.load("example.wav")
source = torchaudio.functional.resample(source, sr, 16000)
source = source.unsqueeze(0).cuda()
Step5,转换为目标speaker
with torch.inference_mode():
# Extract speech units
units = hubert.units(source)
# Generate target spectrogram
mel = acoustic.generate(units).transpose(1, 2)
# Generate audio waveform
target = hifigan(mel)
如何训练自己的语音模型?
Step1,数据集准备
数据集 The LJ Speech Dataset, keithito.com/LJ-Speech-D… 每个音频文件是 单通道 16-bit PCM WAV格式,采 样率为 22050 Hz
Step2,提取声谱
用法
使用mels.py in-dir out-dir
参数解释
in-dir: 数据集目录 out-dir: 输出目录
比如
python mel.py path/to/LJSpeech-1.1/wavs path/to/LJSpeech-1.1/mels
Step3,提取离散或软语音单位(DiscreteorSoftSpeech Units)
用法
使encode.py [--extensionEXTENSION]{soft,discrete} in-dir out-dir
参数解释
in-dir: 数据集目录 out-dir: 输出目录
比如
python encode.py soft path/to/LJSpeech-1.1/wavs path/to/LJSpeech-1.1/soft --extension .wav
目录结构
--mels # 提取的内容
--wavs # 原始数据集
--soft/discrete # 离散或软语音单位
Step4,训练语音模型
使用
train.py [--resume RESUME] [--discrete] dataset-dir checkpoint-dir
参数解释
dataset-dir: 数据目录 checkpoint-dir: 模型输出目录
AI Song 实际操作
Step1,歌曲视频下载
要求是wav格式 如 www.youtube.com/watch?v=Uiv…
Step2,切分歌曲 => vocals + accompaniment
pip install -U demucs
<!---->
AUDIO_INPUT = "/content/drive/MyDrive/so-vits-svcfork/youtubeaudio/audio.wav" #@param {type:"string"} !demucs --two-stems=vocals {AUDIO_INPUT}
Step3,vocals切分 => 多个小片段
input_file = "/content/drive/MyDrive/so-vits-svcfork/dataset_spleeter/vocals.wav" output_dir = "/content/drive/MyDrive/so-vits-svcfork/dataset_raw/{SPEAKER_NAME}"
其他工具
声音分离工具:
- SpleeterGUI
- FaceBook demucs 声音切分成小片段 github.com/openvpi/aud…
Step4,声音建模
pip install -U so-vits-svc-fork
预训练模型: huggingface.co/models?sear… 切分好的声音文件,存放在: dataset_raw/{speaker_id}/**/{wav_file}.{any_format}
模型训练流程:
svc pre-resample
svc pre-config
svc pre-hubert
svc train -t
第一步 预处理数
svc pre-resample -i /content/drive/MyDrive/so-vits-svcfork/dataset_raw
## TIPS:如果我们在 /content/drive/MyDrive/so-vits-svcfork目录下执行该 svc 命令,会在当前目录下面得到dataset
第二步 生成训练文件
svc pre-config
## TIPS:会在当前目录中生成filelists 和configs
通过 svc pre-config,生成了 train.txt, val.txt, test.txt 用于后续的训练,验证,测试
第三步 学习
```
svc pre-hubert -fm dio
svc train --model-path /content/drive/MyDrive/so-vits-svc-fork/logs/44k
## TIPS:模型训练时间较长,可以调整config.json的参数,epochs 默认为10000
````
第四步 声音推理
AUDIO = "/content/drive/MyDrive/so-vits-svc-fork/mao/example_0" #@param {type:"string"} MODEL = "/content/drive/MyDrive/so-vits-svc-fork/logs/44k/G_300.pth" #@param{type:"string"}
CONFIG = "/content/drive/MyDrive/so-vits-svc-fork/logs/44k/config.json" #@param{type:"string"}
#@markdown Change According to Your Voice Tone. 12 = 1 Octave | -12 = -1 Octave
PITCH = 0 #@param {type:"integer"} !
svc infer {AUDIO}.wav -c {CONFIG} -m {MODEL}