本文为李弘毅老师【Voice Conversion - CycleGAN and StarGAN】的课程笔记,课程视频youtube地址,点这里(需)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 2-1 Feature Disentangle
下篇 - 3-1 Deep Clustering, PIT
总目录
上一篇主要讲了我们在没有多个说话人说同一句话这样的数据集的情况下,用feature disentangle来做voice conversion。这篇来讲一下另一种direct transformation,也就只直接转换的意思,不用像上一篇那样要考虑content和speaker。而用到的方法就是图像中的CycleGAN和StarGAN。
假设我们现在有一堆李老师的音频,又有一堆新垣结衣的音频。我们希望李老师在给我们上课的时候,听到的是新垣结衣的声音。于是,我们就需要一个 G X → Y G_{X \rightarrow Y} GX→Y来输入李老师的声音,吐出新垣结衣的声音。然还需要一个 D Y D_Y DY来判断输出的声音是不是新垣结衣说的。但是,这样,我们并无法保证 G X → Y G_{X \rightarrow Y} GX→Y出来的声音的内容是保持一致的,也许所有的 X X X进来,都变成了同一个 Y Y Y,这样也可以骗过 D Y D_Y DY。
所以,我们需要cycle。
所谓的cycle就是说,我们现在有四个网络 G X → Y G_{X \rightarrow Y} GX→Y, G Y → X G_{Y \rightarrow X} GY→X, D X D_X DX和 D Y D_Y DY,然后把speaker X说的话塞进 G X → Y G_{X \rightarrow Y} GX→Y之后,它会吐出一个 Y ^ \hat{Y} Y^,我们会把$ Y ^ \hat{Y} Y^塞进 D Y D_Y DY中,企图骗过 D Y D_Y DY,让 D Y D_Y DY认为这个是真的 Y Y Y。同时,我们也会把 Y ^ \hat{Y} Y^塞进 G Y → X G_{Y \rightarrow X} GY→X当中,输出 X ^ \hat{X} X^,希望 X X X和 X ^ \hat{X} X^越接近越好。这就是下图中上半部分的过程,下班过程也是如是,这里不赘述了。
这里还有一个训练时的技巧就是,我们也会把 Y Y Y塞进 G X → Y G_{X \rightarrow Y} GX→Y当中,希望它吐出的 Y ^ \hat{Y} Y^和 Y Y Y是一致的。
通过上文的叙述不难推测出,CycleGAN只能把X的声音转成Y的声音,或者把Y的声音转成X的声音,如果我们要有一个Z的话,这个方法就不灵了。理论上来说,如果有 n n n个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的声音了。