So-VITS-SVC 课程笔记
课程地址,https://www.bilibili.com/video/BV1uj411v7zW/?spm_id_from=pageDriver&vd_source=1eb6e5015a1f70daa97080d8ee786d5d
So-VITS-SVC:SoftVC VITS Singing Voice Conversion
SoftVC,编码技术,用soft聚类来消除说话人的音色特征
VITS,核心技术
Singing Voice Conversion,使用场景
整体架构
和VITS的差别是,
VITS是从文本到声音,文本的编码长度和声音的不一样的,所以需要时长预测,强制匹配复制
SO-VITs是从声音到声音,其实更加简单了,声音的时长是相同的,直接就可以match
但是为了使用VITS,将输入的音频要转换成类似文本的特征,即消除说话人的音色特征
这样就可以套用简化的VITS模型
所以SO-VITS的核心就是如何消除音频中的说话人音色特征,形成类似文本特征编码
这就是红框中的部分
这里首先需要将音频提取4种特征,这里要用到pretrain的模型来提取
这里的spk classerifier,用于check生成的embedding已经不包含说话人特征,会根据输入的embedding预测一个spk,如果预测的和真实的不一样,即满足
这个模型的损失函数,
这里也是用GAN,和VITS一样的
discriminator部分是一样的
generator的部分,主要有两个不同
一个是Spk_loss, 这个定义Spk classerifier的loss,让预测的spk和真实的spk不一致
一个是KL-loss,这里不同的是不光要算KL(Q|P),还要算KL(P|Q)
所以网络里面,由p分布随机采样的zp,需要逆向经过flow生成zreal,然后用zreal和Q分布区计算似然,得到KL(P|Q)
模块
先验编码器
和VITS的先验编码器比,
a. 输入不同,这里输入更加复杂,不是简单的文本,而是音频的3种特征
PPG,音频中的文本特征
Vec,音频自编码特征,应用softvc
Pitch,基频特征
PPG和VEC在预处理的时候,都加入随机扰动,模拟音频的随机性,读一段文字,文字是不会变的,但是多次读,音频是会有差异的
然后把3种特征都处理成size-192,求和作为输入
b. 说话人的预测器
让预测器预测出的spk和真实spk差别越大越好
所以这里加了梯度取反,给梯度加上负号,这样本来下降的,反而上升了
后验编码器
和VITS基本一样,只是传入的说话人信息不是id,是声纹特征
Decode部分
和VITS的不同,
a. 加入说话人的声纹信息
b. 上采样的每一步,加入基频pitch特征,用于更好的拟合非语音的声音
c. 蛇形激活函数,取代relu,更好的适应音频的周期属性
基频f0,经过上采样,copy*320,再加上多次谐波信号,形成har_source
对于输入音频,在特征维度进行正则化,layernorm?
对于size-192的特征维,求均值和方差,然后正则化
spk声纹,线性变换成scale和bias,用于叠加输入音频,达到加入声纹的目的
flow
这里flow和VITS的基本相同
不同是在输入的时候需要增加skp声纹信息adapter
我的理解是,从zq到zp,需要正则化掉skp的声纹信息,因为p分布本身是类似文本特征的分布,不包含spk声纹
从zp到zq,需要添加目标声纹信息,用于decode
损失函数
因为GAN,这里还是要分成D和G的部分
G的部分比较复杂,
其中score_loss和feat_loss,是GAN训练生成器的时候 ,把生成的数据进行判别得到的最终score,以及中间层每层结果和real的loss
mel_loss和stft_loss,是重构损失,mel_loss就是把输入和生成的音频进行mel滤波后比较的loss
stft_loss,在不同的尺度的stft变换下的,损失计算,更加全面
loss_kl_f, loss_kl_r,kl散度,前面说了这里不光要算q||p,还要算p||q,只是权重上p||q不那么重要,乘上0.5
这里kl散度的计算公式推导,其实和VITS里面一样,
spk_loss spk预测器的loss