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

 

 

posted on 2024-02-06 15:09  fxjwind  阅读(1142)  评论(0编辑  收藏  举报