SO-VITs-SVC
本文是该系列的第一篇,采用倒序的方式,先从推理过程开始介绍人声克隆的工作流,以及各个模型的功能,之后再去详细介绍各个模型,因此不涉及具体的使用方法,这个官方文档里面已经讲的很清楚了,所以本文主要聚焦于整个项目中对音频数据的预处理、特征提取和最终的推理过程(音频生成的过程)进行介绍,最后放上我制作的两段音频,给大家看看效果。
- 人声预处理流程
- 人声特征提取流程
- 人声的合成流程
- Demo展示
1. 预处理阶段
- source audio : 是指我们要转换的源音频
- Vocals.wav : 要通过人声分离软件,过滤出源音频中的纯人声
- Vocals.wav 44k : 模型只能处理采样率为44k的音频,所以对人声音频进行重采样
2. 特征提取阶段
特征提取流程图如下:
为了完美的复刻人声对源人声的特征提取还是比较丰富的,主要分为下面几类:
- 预训练模型,通过预训练模型对音频进行特征提取
- 乐理特征,基音频率f0,高音的频率
- 频域特征,频谱/梅尔频谱:mel spectrogram
- 能量特征,音频音量: audio volume
- 增强特征,增加随机噪声后再进行特征提取
2.1 预训练特征提取
预训练模型三选一即可,不同模型,特征表示维度不一样,如果显存较小可以选择低维的特征编码,Contextvec可以选择不同隐藏层的特征表示。
- Hubert : 基于BERT改进的HuBERT使用BERT的架构,并做了修改以适应语音序列。HuBERT可以学习出高质量的语音表示,在多种下游任务上都取得了state-of-the-art的结果,如语音情感识别、语言识别、语音生成与理解和人声克隆等。
- Whisper:是openai提出利用大规模弱监督学习实现了端到端语音识别模型,在少量标注数据的条件下,可以达到很好的识别性能,同时也学习到了语音的高质量表示。其创新之处在于设计的弱监督学习框架,这为利用海量无标注数据提高语音识别系统的鲁棒性提供了一个值得借鉴的范例。
- Contextvec : 一种新的语音自监督表示学习方法,通过Hubert生成训练标签,通过学生网络来学习音频的表征,其在人声验证和语音理解等任务上达到SOTA的性能,是一种非常有效的语音表示学习框架
2.2 乐理特征
so-vits-svc提供了四种不同的f0计算方法,选一即可,uv
是基于f0的衍生特征,计算方式如下,不同方法略有不同。
data = np.reshape(f0, (f0.size, 1))
vuv_vector = np.zeros((data.size, 1), dtype=np.float32)
vuv_vector[data > 0.0] = 1.0
vuv_vector[data <= 0.0] = 0.0
2.3 频域特征
-
spectrogram : 通过对人声音频的时域信号进行短时傅里叶变换(STFT)得到。
-
mel spectrogram : 频谱经过梅尔滤波后得到梅尔频谱。
2.4 能量特征(可选)
能量特征是可选,可有可无。
- aug volume、aug mel :是在音频数据上增加了随机噪声后,在进行特征提取得到的增强特征。
3. 推理阶段(音频合成)
推理阶段,提供三种方案来生成目标音频,最后还可以选择是否采用预训练模型NSF_HifiGAN
对结果进行增强修饰。
- 纯生成,输入源音频特征到生成器生成目标音频。
- 纯扩散,输入源音频特征到扩散模型生成目标音频。
- 生成+扩散,在生成模型结果的基础上,再次计算梅尔频谱,输入扩散模型,生成目标音频。
- 增强,可选。
流程图如下:
3.1 生成模型
生成模型主要用到,预训练训练模型的特征编码和乐理特征,在生成音频同时,也预测乐理特征,用于生成+扩散的方案。
3.2 扩散模型
扩散模型基本全部用到之前的特征,扩散模型的预测不直接生成目标音频数据,而是生成目标音频的梅尔频谱,然后通过转换得到最终的目标音频。
3.3 生成+扩散
- 生成阶段和纯生成模型一样
- 扩散阶段,音频的编码特征和能量特征仍采用源音频提取的,乐理特征和梅尔频谱分别从生成器和生成音频中得到。
3.4 增强
HiFiGAN是较为常用的声码器,能够将声学模型产生的频谱转换为高质量的音频,从名字可以看出采用的是生成对抗网络模型。
4. Demo展示
展示两段demo,分别克隆了懂王(建国)、睡神(振华)、观海的声音,翻唱《All out of Lvoe》,原唱:Air Supply。
Demo 1: 翻唱:乔振华、奥观海
《All out of Love》乔振华,奥观海翻唱
Demo 2: 翻唱:川建国、乔振华
懂王、睡神深情合唱《All Out Of Love》