课程向:深度学习与人类语言处理 ——李宏毅,2020 (P11)

Voice Conversion

李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
课件ppt已上传至资源,可免费下载使用

前言

在上一篇中,我们讲解了语音转换 Voice Conversion 的定义、应用 以及实现技术中重要的Encoder和Decoder、Vocoder等。并着重讲解了 针对Unparallel Data的 Feature Disentangle 一些技术。
而本篇中,我们继续将讲解 语音转换 中的Feature Disentangle 中的问题和解决方法,以及对Unparallel Data的另外一种方法 Direct Transformation 直接转换技术


I Feature Disentangle Issues

在这里插入图片描述
其实我们在做 Feature Disentangle 的时候,就是在做一个像是auto-encoder一样的架构,Encoder部分有Content EncoderSpeaker Enocoder,之后由Decoder产生声音讯号。像auto-encoder这样的架构,训练会有什么样的问题呢?
  用auto-encoder这样的方法,在产生声音的时候,产生出来的声音未必都非常理想,一个可能的原因是模型在训练的时候,它从来没有考虑过要做Voice Conversion这件事情。因为我们在训练Content Encoder和Speaker Encoder的时候,输入的是同一句语音的acoustic feature。在训练的时候,我们是将内容交给Content处理,语者交给Speaker处理,训练目标是最小化Decoder输出的语音和输入的语音的L1或L2距离。但是在测试的时候,模型第一次知道我们要做的是Voice Conversion,不是要做auto-encoder,模型第一次了解到Content Encoder和Speaker Encoder可以输入不同语音的acoustic feature,我们希望最终通过改变Speaker Encoder的输入来实现语音转换。但往往事与愿违,因为 训练 和 测试 是不一样的作法,所以在测试时不一定得到我们想要的理想结果。

为解决上述问题,有人提出了2nd Stage Training的方法

2nd Stage Training

在这里插入图片描述
这种 2nd Stage Training 的训练方式对得到好的Voice Conversion的结果是有很大帮助的,很关键的一种方法。

我们前面提到,之前的训练方法在训练的时候,模型都没有考虑过Voice Conversion,那我们怎么把它考虑进来呢?我们可以给Content EncoderSpeaker Enocoder输入来自不同的语者的不同句子,但为什么我们之前不这样做?因为这样做的问题是将没有训练目标,之前我们的训练目标是最小化经过训练后得到的句子与原本的句子相似,而今输入的句子不同,Decoder应该输出的正确答案便不得而知。所以怎么办呢?
  这边我们引入了 GAN 的概念,再训练一个Discriminator,来判断这句声音讯号是真实的还是通过输入不同语者的不同句子合成的,有了这个Discriminator,Decoder将想办法骗过这个Discriminator,将decode出像是真正的声音讯号。另外还可以加一个Speaker Classifier,判断一段声音讯号是不是某一个语者讲的,举例来说,我们要合成A的声音,如上图,Content Encoder部分输入B的语音信息“hello”,Speaker Encoder输入A的声音讯号,虽然我们不知道A说“hello”的声音讯号,但是至少有了这个Speaker Classifier,Decoder会想办法让Speaker Classifier把decode的合成语音判断成A的声音。当然我们要先训练好一个Speaker Classifier。

但在实际训练中,我们发现这种训练方法效果还是不够好,有这样一种方法可以提高训练效果。

Patcher

在这里插入图片描述
我们发现一个有效的tip是,在Decoder并列的位置加一个 Patcher ”补丁“,它的输入和Decoder的输入一样,并输出一段声音讯号。而Patcher产生的这段声音讯号会加到原来Decoder产生的声音讯号,并加起来的声音讯号再传给Discriminator和Speaker Classifier。这个Patcher的作用就是”打补丁“,Decoder输出的结果不太好,Patcher补充这些输出,使得Discriminator更容易判断输出是真实的,Speaker Classifier判断更容易是输入的Speaker A。

以上,便是Feature Disentangle的全部内容,接下来将讲针对 Unparallel Data 的另外一种方法 Direct Transformation 直接转换技术,无需再考虑语者分离等。

II Direct Transformation

在这里插入图片描述
Direct Transformation 直接转换技术,可以直接把A的声音转成B的声音,这边直接借用了在影像上非常常用的影像风格转换的方法 Cycle GAN和它的进阶。

1 Cycle GAN

在这里插入图片描述Cycle GAN的使用方法大致如下:
  首先,我们收集了两个人的声音X、Y
  然后,我们要训练一个Generator G X − > Y G_{X->Y} GX>Y,它可以把X的声音转成Y的声音。但我们不知道转换生成的这个Y的声音应该是什么样的,因此我们需要一个Discriminator D Y D_{Y} DY,只需要给 D Y D_{Y} DY提供很多Y的声音,然后 D Y D_{Y} DY就会学会去鉴别一段声音讯号是否是Y的声音,这个 D Y D_{Y} DY输入一段声音讯号,输出一个scalar判断这段声音属于Y的概率
  最后,这个Generator G X − > Y G_{X->Y} GX>Y的训练目标就是想办法骗过这个Discriminator D Y D_{Y} DY,如果这个 G X − > Y G_{X->Y} GX>Y成功骗过 D Y D_{Y} DY,那么就代表这个 G X − > Y G_{X->Y} GX>Y生成的声音讯号听起来像是Y的声音

但是呢,如果我们只是训练一个Generator G X − > Y G_{X->Y} GX>Y和一个Discriminator D Y D_{Y} DY是不够的,这个 G X − > Y G_{X->Y} GX>Y可能不会管输入的是什么,就合出Y最常讲的一句话就结束了,很可能会完全无视输入部分。那怎么办呢?我们还需要加另外一个Generator G X − > Y G_{X->Y} GX>Y
在这里插入图片描述
这个新加的Generator G Y − > X G_{Y->X} GY>X 会把从Generator G X − > Y G_{X->Y} GX>Y输出的Y的声音再转换成一段声音讯号,我们希望这段声音讯号和最初输入的X的声音讯号的L1或L2距离越小越好。也就是说,我们先把X的声音转成Y的声音,再把Y的声音转成X的声音,我们希望输入输出这两段声音讯号越接近越好,这叫做Cycle Consistency
在训练Cycle GAN的时候,还有一个tip,在我们想要训练一个Generator G X − > Y G_{X->Y} GX>Y,可以不只是给它输入X的声音让它转成Y,还可以给它多加一个训练目标,直接给这个Generator G X − > Y G_{X->Y} GX>Y Y的声音,让它可以合成出一模一样的Y的声音,这会让我们的训练更稳定。

当然,这个Cycle GAN还可以是双向的,参见下图,训练方法同单向。
在这里插入图片描述

2 Star GAN

在这里插入图片描述
Star GAN 可以说是 Cycle GAN的进阶版。
对于 Cycle GAN ,有一个Speaker X和Y,可以把X转Y的声音,Y转X的声音,但是如果我们有多个如N个语者,那 Cycle GAN 就不太适用,我们要在N个语者间做两两训练,需要训练 N x (N-1)个Generator。如上图的4个语者的互转,需要12个Generator。为解决这样多语者的问题,就有了 Cycle GAN的进阶版 ,Star GAN

在这里插入图片描述
在 Star GAN 中,我们将修改 Generator G G G 和一个Discriminator D D D ,在上面的Cycle GAN里 G G G 只有一个训练目标,会把X的声音转成Y的声音,或把Y的声音转成X的声音。在 Star GAN 里面 G G G 将设计更强大,它可以把输入的声音讯号转换成不同的语者的声音。那怎么设计这个 G G G呢?
   首先,给 G G G 一段声音讯号(如将 s i s_{i} si的声音讯号转成 s j s_{j} sj)并给出要转成谁的声音讯号( s j s_{j} sj),在上一篇中,我们在讲 Feature Disentangle 的时候,讲到过有两种方法可以代表这个第j个语者的表示方式(1) ont-hot表示;(2) i-vector,j-vector等。
   其次,Discriminator D D D 也做了一些改变,它也要输入哪一个Speaker的讯息 , 比如我们要 D D D 鉴别一段声音讯号是不是 s i s_{i} si 讲的,我们也要给 D D D 输入 s i s_{i} si 语者信息。

在了解 Star GAN 中 Generator G G G 和一个Discriminator D D D 的改变后,我们就可以来了解模型的具体结构了,请参见下图。
在这里插入图片描述
Star GAN 的运作方式和 Cycle GAN大同小异,
  首先,随意给 G G G 输入 Star GAN 某一个人的声音,如 s k s_{k} sk
  然后,再随意给 G G G 输入 某个人的语者特征,如 s i s_{i} si。现在, G G G 就知道我们是要把 s k s_{k} sk的声音转成 s i s_{i} si,然后就把 s i s_{i} si的声音合成出来
  之后,Discriminator D D D 就会去判断这段声音讯号是不是 s i s_{i} si的声音,当然,语者特征也会输入给 D D D
  接下来,把同一个 G G G 拿来,但这次给 G G G 不同的语者特征 s k s_{k} sk ,此时 G G G 就会把生成的声音讯号再转成 s k s_{k} sk 的声音讯号。此时,训练目标就可以是最初输入的 s k s_{k} sk的声音讯号与最终输出的声音讯号的距离越小越好

这就是 Star GAN 的训练方式。但其实在训练 Star GAN 的时候,还会再加上一个 classifier,这次我们就省略了这个部分,你可以自己阅读原始论文看看这个 classifier 是怎么被加上来的。

那至此,对Unparallel Data的 Feature Disentangle 特征分离 和 Direct Transformation 直接转换 方法,这两种方法孰优孰劣?

我觉得你不应该把这两个方法直接拿来比较,当然,比较这两个方法不太容易了,不同的文献上用了不同的network架构来做,所以有点难来做side by side的比较,但问题是,这两个方法也没有冲突,其实你可以把这两个方法整合在一起,你可以把Direct Transformation里的 G G G 换成 Feature Disentangle 的Encoder+Decoder。但我在文献上还没有看到有人这么做。

3 Blow

在这里插入图片描述
还有一个比 Star GAN更进阶的方法,Blow,用Flow-based model来做 Voice Conversion。如果你想要复习Flow-based model可以参照链接进行学习。

VC Summary

至此,就是Voice Conversion的部分(P10、P11),主要告诉大家今天在研究上,都专注在Unparallel Data上做VC,而对这样不成对的数据可以有两种方法:Feature Disentangle 特征分离 和 Direct Transformation 直接转换 方法。

下一篇将进入 Speech Separation 语音分离的部分。

猜你喜欢

转载自blog.csdn.net/qq_44574333/article/details/108163549