文章目录
- 1 内容简述
- 2 CycleGAN
- 3 StarGAN
本文为李弘毅老师【Voice Conversion - CycleGAN and StarGAN】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 2-1 Feature Disentangle
下篇 - 3-1 Deep Clustering, PIT
总目录
1 内容简述
上一篇主要讲了我们在没有多个说话人说同一句话这样的数据集的情况下,用feature disentangle来做voice conversion。这篇来讲一下另一种direct transformation,也就只直接转换的意思,不用像上一篇那样要考虑content和speaker。而用到的方法就是图像中的CycleGAN和StarGAN。
2 CycleGAN
假设我们现在有一堆李老师的音频,又有一堆新垣结衣的音频。我们希望李老师在给我们上课的时候,听到的是新垣结衣的声音。于是,我们就需要一个GX→YG_{X \rightarrow Y}GX→Y来输入李老师的声音,吐出新垣结衣的声音。然还需要一个DYD_YDY来判断输出的声音是不是新垣结衣说的。但是,这样,我们并无法保证GX→YG_{X \rightarrow Y}GX→Y出来的声音的内容是保持一致的,也许所有的XXX进来,都变成了同一个YYY,这样也可以骗过DYD_YDY。
所以,我们需要cycle。
所谓的cycle就是说,我们现在有四个网络GX→YG_{X \rightarrow Y}GX→Y,GY→XG_{Y \rightarrow X}GY→X,DXD_XDX和DYD_YDY,然后把speaker X说的话塞进GX→YG_{X \rightarrow Y}GX→Y之后,它会吐出一个Y^\hat{Y}Y^,我们会把$Y^\hat{Y}Y^塞进DYD_YDY中,企图骗过DYD_YDY,让DYD_YDY认为这个是真的YYY。同时,我们也会把Y^\hat{Y}Y^塞进GY→XG_{Y \rightarrow X}GY→X当中,输出X^\hat{X}X^,希望XXX和X^\hat{X}X^越接近越好。这就是下图中上半部分的过程,下班过程也是如是,这里不赘述了。
这里还有一个训练时的技巧就是,我们也会把YYY塞进GX→YG_{X \rightarrow Y}GX→Y当中,希望它吐出的Y^\hat{Y}Y^和YYY是一致的。
3 StarGAN
通过上文的叙述不难推测出,CycleGAN只能把X的声音转成Y的声音,或者把Y的声音转成X的声音,如果我们要有一个Z的话,这个方法就不灵了。理论上来说,如果有nnn个speaker的话,就需要n(n−1)n(n-1)n(n−1)个generator。那这种方法显然在实际场景中是不适用的。为了解决这个问题,就需要StarGAN。
StarGAN是CycleGAN的进阶版。如下图所示,StarGAN的generator(G)和Discriminator(D)都会多一个代表着是哪个speaker的输入。这个speaker的输入可以认为和feature disentangle中的speaker encoder的输出是一致的。
然后整个StarGAN的框架如下图的下半部分所示,上半部分是CycleGAN,放在一起方便做一个直观的比较。可以看出,本质上就是多了一个表示speaker信息的输入而已,但却一下子可以转换成任意一个speaker的声音了。