AdaGAN:adaptive GAN for many-to-many non-parallel voice converison


论文地址:ADAGAN:ADAPTIVE GAN FOR MANY-TO-MANY NON-PARALLEL VOICE CONVERSION

简介

AdaGAN是用于多对多的非平行数据的语音转换。相比较之前用于VC的GAN模型StarGAN,AdaGAN不仅在性能上有所提升,甚至AdaGAN可以实现零次转换(转换为训练集中没有的音色)。另外AdaGAN改进了训练网络,其计算代价很小。

Approach

problem formulation

先简单介绍一下需要用到的符号的含义

Z={Z1,Z2,,Zn}Z=\left\{Z_{1}, Z_{2}, \dots, Z_{n}\right\} 表示说话人的集合ZiZ_{i}表示第ii个说话人

U={U1,U2,,Um}U=\left\{U_{1}, U_{2}, \dots, U_{m}\right\} 表示说话内容,UiU_{i}表示第ii个说话内容

XipX(Zi,Ui)X_{i} \in p_{X}\left(\cdot | Z_{i}, U_{i}\right) 表示第ii个说话人+第ii个说话内容的特征

语音风格转换在于,我们有原说话人的音频特征(Z1,U1)(Z_{1}, U_{1})和目标说话人对的音频特征(Z2,U2)(Z_{2}, U_{2}),我们想得到pX(Z2,U1)p_{X}\left(\cdot | Z_{2}, U_{1}\right),因此我们需要学习到X^Z1Z2\hat{X}_{Z_{1} \rightarrow Z_{2}},同时又要尽可能地保留U1U_{1}

这个过程可以表示为:

pX^Z1Z2(Z1,U1,Z2,U2)=pX^(Z2,U1)p_{\hat{X}_{Z_{1} \rightarrow Z_{2}}}\left(\cdot | Z_{1}, U_{1}, Z_{2}, U_{2}\right)=p_{\hat{X}}\left(\cdot | Z_{2}, U_{1}\right)

AdaIn

AdaGAN中,生成器模型的规范化方法使用了AdaIN,在风格迁移上使用IN效果比BN好很多,AdaIN和IN的不同在于仿射参数来自于样本,即作为条件的样本,也就是说AadIN没有需要学习的参数,这和BN,IN,LN,GN都不同。风格转换中的风格与IN中的仿射参数有很大关系,AdaIN扩展了IN的能力,使用风格图像的均值和标准差作为仿射参数。

AdaIN最初是用在图片的风格迁移,在语音风格迁移中,AdaIN帮助我们得到说话风格,以及声学内容。

AdaIN(x,Y)=σY(xμXσX)+μY\operatorname{AdaIN}(x, Y)=\sigma_{Y}\left(\frac{x-\mu_{X}}{\sigma_{X}}\right)+\mu_{Y}

xx是训练集XX中声学内容的特征,YY是目标说话人的说话风格。AdaIN首先使用方差和标准差规范化xx。现在假定我们有一个潜在向量,可以表示声学内容的分布以及相同分布下说话人风格。为了转换说话风格,需要使用目标说话的分布。由此,AdaIN输出可以找到影响风格的特征,并且保留声学内容。AdaIN没有任何学习参数,他不会影响复杂度。

网络框架

AdaGAN中有一个编码器En,一个解码器De,还有一个判别器Dis,En将输入音频特征转为潜在向量,De由给定潜在向量生成音频特征。生成时假设原音频为x,需要转换为y,计算x,y的潜在向量。

En输入40长度的Mel谱图,输出1*512的特征向量。

De输入1*512的特征向量,输出40长度的Mel谱图。

En和De中所有的层都是线性层。En中,输入和输出层有40和512 cell大小。相对的在De中,输出和出入层有512和40大小,所有的层(除了输出层)都使用ReLU**。

判别器Dis的作用于传统的GAN中的判别器的作用相似。他会判别出音频是原音频还是经过转换得到的。与De和En相似,Dis也是由线性层堆叠而成,他包含输入层,3个隐藏层和输出层,大小分别为40,512,1。同样每层也用ReLU函数**。

转换方法

AdaGAN:adaptive GAN for many-to-many non-parallel voice converison

转换方法是先将原说话人的音频特征x,yx,y音频送入En,得到SxS_{x} SyS_{y},然后进行AdaIN改变准换分布,生成特征表示tt 接着使用De从t中得出音频特征。生成的xZ1Z2\quad x_{Z_{1} \rightarrow Z_{2}}包含了目标说话人的语音风格z2z_{2},以及原说话人的音频特征x1x_{1}

Sx=En(x),Sy=En(y),t=AdaIN(Sx,Sy),xZ1Z2=De(t)S_{x}=\operatorname{En}(x), \quad S_{y}=\operatorname{En}(y), \quad t=\operatorname{Ad} a I N\left(S_{x}, S_{y}\right), \quad x_{Z_{1} \rightarrow Z_{2}}=D e(t)

训练和测试方法

AdaGAN:adaptive GAN for many-to-many non-parallel voice converison

训练:为了实现多对多转换和零次转换,使用非平行数据集进行训练。首先针对两个说话人Z1,Z2Z_{1}, Z_{2},随机选取两段音频特征x,yx,y。使用上述的转换方法将xxZ1Z_{1}转换为Z2Z_{2},得到XZ1>Z2X_{Z_{1}->Z_{2}},接着选取原说话人Z1Z_{1}另一个特征x2x_{2},将得到的音频XZ1>Z2X_{Z_{1}->Z_{2}}再转换为Z2Z_{2}风格,得到XZ1>Z2>Z1X_{Z_{1}->Z_{2}->Z_{1}}

其中判别器需要判断的应该是第一次转换得到的XZ1>Z2X_{Z_{1}->Z_{2}}

同理我们可以生成XZ2>Z1>Z2X_{Z_{2}->Z_{1}->Z_{2}}
AdaGAN:adaptive GAN for many-to-many non-parallel voice converison

Loss函数

整个模型的Loss函数为

Ltotal=Ladv(En,De)+Ladv(Dis)+λ1Lcyc+λ2LCXY+λ3LCYX+λ4LstyXY+λ5LstyYX\mathcal{L}_{\text {total}}=\mathcal{L}_{\text {adv}}(\operatorname{En}, D e)+\mathcal{L}_{\text {adv}}(\text {Dis})+\lambda_{1} \mathcal{L}_{\text {cyc}}+\lambda_{2} \mathcal{L}_{C_{X \rightarrow Y}}+\lambda_{3} \mathcal{L}_{C_{Y \rightarrow X}}+\lambda_{4} \mathcal{L}_{s t y_{X \rightarrow Y}}+\lambda_{5} \mathcal{L}_{s t y_{Y \rightarrow X}}

文章使用的超参数为λ1=10,λ2=2,λ3=2,λ4=3,λ5=3\lambda_{1}=10, \lambda_{2}=2, \lambda_{3}=2, \lambda_{4}=3,\lambda_{5}=3

Adversarial loss

Adversarial loss包括Ladv(En,De)\mathcal{L}_{\text {adv}}(\operatorname{En}, D e)Ladv(Dis)\mathcal{L}_{\text {adv}}(\text {Dis}),这个Loss计算的是转换转换得到的数据与元数据的差别。

Ladv(En,De)=(Dis(yZ2Z1)1)2+(Dis(xZ1Z2)1)2\mathcal{L}_{a d v}(E n, D e)=\left(\operatorname{Dis}\left(y_{Z_{2} \rightarrow Z_{1}}\right)-1\right)^{2}+\left(\operatorname{Dis}\left(x_{Z_{1} \rightarrow Z_{2}}\right)-1\right)^{2}

Ladv(Dis)=(Dis(x1)1)2+(Dis(y1)1)2\mathcal{L}_{a d v}(D i s)=\left(\operatorname{Dis}\left(x_{1}\right)-1\right)^{2}+\left(D i s\left(y_{1}\right)-1\right)^{2}

Reconstruction Loss

只使用Adversarial loss的话,可能会丢失声学内容。这里使用Reconstruction Loss来尽可能保留声学内容。

Lcyc=xZ1Z2Z1x11+yZ2Z1Z2y11\mathcal{L}_{c y c}=\left\|x_{Z_{1} \rightarrow Z_{2} \rightarrow Z_{1}}-x_{1}\right\|_{1}+\left\|y_{Z_{2} \rightarrow Z_{1} \rightarrow Z_{2}}-y_{1}\right\|_{1}

Content Preseve Loss

这个Loss是为了在AdaIn期间保留声学内容,同时保证我们的en和de没有噪音

LCXY=SxZ1Z2t11\mathcal{L}_{C_{X \rightarrow Y}}=\left\|S_{x_{Z_{1} \rightarrow Z_{2}}}-t_{1}\right\|_{1}

Style transfer Loss

这个AdaGAN的核心,有助于实现多对多转换和零次转换。在相同的声学内容下,尽可能地保证说话风格的潜在空间在相同的分布。

LstyXY=t2SX11\mathcal{L}_{s t y_{X_{\rightarrow} Y}}=\left\|t_{2}-S_{X_{1}}\right\|_{1}