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

Voice Conversion

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

前言

在前几篇中讲解了语音辨识 Speech Recognition 的前世今生,而从本篇起将进入 Voice Conversion 语音转换的篇章。
本篇将讲解 语音转换 的定义、应用 以及在实现技术中重要的Encoder和Decoder部分


I Definition and Application

在这里插入图片描述
Voice Conversion 要做的事情是:
  输入:一段声音。长度为 T T T,维度为d维的acoustic feature的语音表示
  输出:另外一段声音。长度为 T ′ T^{'} T,维度为d维的acoustic feature的语音表示
而这两段声音有一些一样,有一些不一样。通常我们希望这两段声音的内容一样(所对应的文字)。不一样的可以有很多方面,最常见的不一样的是 语者speaker不同。

1 Speaker

在这里插入图片描述
Voice Conversion通常会把 其中一个语者的语音变成另外一个语者的语音(例如,柯南里面的领结变声器),那我们为什么会想把某一个人的声音转换成另外一个人的声音呢?

  1. Same but different 那是因为,我们知道,同一句话不同人说,它的效果是不一样的(举例来说,同学和你说“嗯,你可以毕业了”,你没有什么好高兴的。但是如果是你的老师对你说,“嗯,你可以毕业了”,你可能会很开心。或者把老师的声音转成甜美女声,同学们听课的心情可能会更好一点。)
  2. Deep Fake 骗人。(用你亲近的人的声音来进行诈骗。除了可以欺骗人,还可以用来欺骗另外一个机器,银行可能用声纹比对来判断是否是本人进行操作,如果可以转换声音片便可以骗过银行的语者验证系统。)
  3. TTS。转换语者,可以用来制作个人化的语音合成系统。(我们希望我们的语音合成的系统不是只是Google小姐的机器音,而是把Google小姐的声音转成想要合成的声音。
  4. Singing。将某一个人的歌声转成另外一个人唱歌的声音。
  5. Privacy Preserving。一个人的语音是可以反应一个人一定的基本信息的,如身高、体重、年龄、性别、身体状况、心理状态等。如果我们可以将自己的声音转换成别人的声音,这样是可以保护我们的个人隐私的。一个很棒的例子,通过VC技术将独自在家的孩子声音转成大人的声音来应对到访的陌生人,提高儿童安全。

Speaker 语者的转换是最常见的,除了Speaker的转换,还有很多其他的应用。举例来说,我们可以做Speaking Style的转换,语者风格的转换。

2 Speaking Style

在这里插入图片描述
有什么说话风格的转换呢?比如说,

  1. Emotion:一个人说话的情绪转换
  2. Normal-to-Lombard:把正常的声音转成Lombard的声音,Lombard的声音是指 人在讲话的时候,比如说在酒吧说话,背景噪音很大,这个时候你会不由自主地放大说话的音量,这个就叫做Lombard。但其实,Lombard是有点复杂的过程,不仅仅是单纯地放大声音。在此,你一定会问,做这个系统到底要干什么呢?李老师同样有这个疑惑,在2019的ICASSP上论文笔者现场回答,未来语音合成系统可能会在生活的方方面面出现,有时候机器在说话的时候可能是在酒吧里,可能是在很嘈杂的地方,人类之所以会从Normal转成Lombard的目的也许是因为Lombard的声音可能更容易让人听清楚,未来在嘈杂的地方机器可能也需要有这样的能力来使得机器表现更好。
  3. Whisper-to-Normal:把悄悄话转成正常的声音。比如,在图书馆,你可能不能大声讲话,只能讲悄悄话,但是我们希望另外一边和你沟通的可以听到正常的声音。又比如,在电车上,我们希望我们的沟通是不被别人听到的,就可以把正常的声音转成悄悄话来保护隐私。
  4. Singers vocal technique conversion歌唱技巧技术转换****。可以在唱歌的时候自动加上弹唇或者颤音等。

除了说话风格的转换,还有用 Voice Conversion 的技术来做 Improving Intelligibility,提高语音可理解性。

3 Improving Intelligibility 提高语音可理解性

在这里插入图片描述

  1. Improving the speech intelligibility:增进语音可理解性。举例来说,有些人可能因为先天或后天的发音器官有一些损伤,所以他发出来的声音可能不被理解,但通过VC技术就有可能把这些一般人不容易理解的声音转成容易理解的声音。这就是一个很好的 语音助人 的例子。
  2. Accent conversion:口音转换。可以把一个人的口音去掉,把不标准的英文转成标准的英文,此时,我们只希望语音中口音的部分被转换,但语者的特性完全保留下来。老师讲了一个很棒的例子。通过VC技术将标准的英文正确发音示例转成学习者自己的声音,使得学习者更容易学习如何发出最标准的英文,因为在语言学习研究上表明人们更容易理解自己的声音甚至是同性别的声音。

3 Data Augumentation 数据增强

在这里插入图片描述
还有一个比较神奇的应用,是通过Voice Conversion来做 Data Augumentation 数据增强,举例来说,

  1. 把语音辨识训练资料里面的所有的男生的声音转换成女生声音,和女生的声音都转男生的声音,文字部分不变。这样训练资料就变成了两倍。但这种技术不是总是有用的,详情请阅读文献。
  2. 干净的声音转成有杂讯的声音,为什么我们这么做呢?因为在做语音辨识上,本来就会做Data Augumentation,语音辨识常用的Data Augumentation就是直接把杂讯加到语音上面。有人觉得这样直接把杂讯和语音加起来不是那么的好,通过VC技术把干净的声音直接转成有杂讯的声音可能更好。当然,还有人将有杂讯的声音转成干净的声音,这就是去噪

II Real Implementation

以上,就是 Voice Conversion 的定义和应用
在进入Voice Conversion真正的技术之前,我们要先明晰两件事情。

1 T ′ = T T^{'} = T T=T & Vocoder

在这里插入图片描述

(1) T ′ = T T^{'} = T T=T

通常而言,Voice Conversion系统的输入和输出长度可以是不一样的,甚至不一样的的话应该会更好。(假设我们在做口音的转换,不同的口音间讲话的声音的长度很有可能不一样大,比如韵律这种,也是语者的一种特性。甚至是说,如果语音转换时,前后语音长度一样,听起来可能不真实)但是在很多时候,你在阅读文献的时候会发现,我们会假设输入和输出的声音的长度 T ′ = T T^{'} = T T=T一样,这可以让我们的模型简单一点,直接假设输入和输出的长度是一样的,就不需要用seq2seq模型来处理,可以使用简单的模型如encoder。

(2)Vocoder

今天,Voice Conversion的输出也是acoustic feature,我们知道我们是通过acoustic feature这样的一串向量来表示我们的声音讯号,所以输入是一串向量、输出是另外一串向量。但这一串向量往往不能直接转成真正的声音讯号,可能会差诸如相位等(讯号处理)。
因此,我们需要另外一个模型,叫做 Vocoder:
    输入:acoustic feature
    输出:真正的声音讯号

Vocoder可以通过两种方式实现,这个Vocoder也是很复杂但是应用方向很广的问题。(而我们今天讲的Voice Conversion也会假设输入和输出都是acoustic feature,而不会讲如何将acoustic feature转成真正的声音讯号)。日后会有独立的主题来讲。

  1. Rule-based:Griffin-Lim algorithm
  2. Deep Learning: WaveNet

2 Categories

在这里插入图片描述
Voice Conversion随着我们有什么样的训练数据可以分成两大类:

  1. Parallel Data:有成对的训练资料。也就是做有监督学习(supervised learning),比如,我们要把语者A的声音转成语者B的声音,那么A和B就要都念同样的句子。此时,我们完全可以训练一个简单的seq2seq,输入A的acoustic feature向量,输出B的acoustic feature向量。
    但,很难收集到非常大量的成对的声音讯号。解决这个问题的方法有两种:
            (1)Model Pre-training:使用模型预训练,再通过少量的训练资料来微调。
            (2) Synthesized data::语音合成,将所有搜集到的语音对应的文字通过Google小姐都念一遍,然后训练一个模型,输入每个人的语音,输出同义的Google小姐的语音。
  2. Unparallel Data:没有成对的训练资料。

Unparallel Data

但在实际上,更实用的是直接用Unparallel Data来进行训练,每个语者都有一些声音,但他们念的句子不一样,甚至是语言都不同。那么在这种状况下,我们有没有办法把某个人的声音转换成另外一个人的声音的。
其实是有可能的,我们知道,在影像上,有很多Image Style Transfer将一张图像的风格转成另外一张图像的风格。我们将一个人的语音转成另外一个人的语音,这样的任务很像一种 Audio Style Transfer。Image Style Transfer的研究已经很棒了,可以借鉴其中的技术来实现Audio Style Transfer。

那怎么实现“Audio Style Transfer”呢?有两个可能的方向:

  1. Feature Disentangle:特征分离:将声音讯号分离成 Content文字资讯+ Speaker语者资讯,替换语者资讯的方法实现语者转换。当然,这种方法不是仅仅可替换语者,假如说可以分离出口音的资讯,然后替换口音,就可以做到口音转换。类似情绪转换等。以下都以语者Speaker当作例子
  2. Direct Transformation:直接转换:第一种方法需要分离声音讯号中的特征如语者和内容特征,而直接转换方法将直接把A的语音转成B的语音,而不考虑语音内的特征分离。

Feature Disentangle

在这里插入图片描述
Feature Disentangle要怎么使用呢?我们以语者Speaker转换为例,假设我们可以训练出:
  Content Encoder:将一句话有关内容的部分提取出来。
  Speaker Encoder:将一句话无视内容、与语者特征有关的部分提取出来。
接下来,我们还需要训练一个Decoder,给Decoder输入Content Encoder的输出和Speaker Encoder的输出 ,将输出通过这个Speaker的特征念出Content的内。接下来只需换替换Speaker Encoder就可以做到语音转换。

Encoder & Decoder

可是我们要怎么训练出这样的Encoder和Decoder呢?
在这里插入图片描述
这边实现Feature Disentangle的技术非常类似Auto-Encoder,但是它必须要比Auto-Encoder再多使用一些其他的方法才能让Content Encoder和Speaker Encoder产生不一样的向量。
Feature Disentangle最基本的做法是:
  首先,我们收集一定的声音讯号
  接下来,我们训练一个“Auto-encoder”,Decoder的部分就和普通的Auto-encoder一样,但是Encoder的部分会有好几个,我们期待不同的Encoder encode到不同的资讯(如Content Encoder就只抽content的资讯)。
  最后,我们希望我们的Decoder输出的部分与最开始输入的声音讯号的distance越接近越好。

但是问题是,我们怎么让我们的某个Encoder只处理特定的资讯,如Content Encoder只处理content内容的资讯而不处理Speaker的资讯呢?
在这里插入图片描述
商用系统这张很值得尝试

(1)Speaker Encoder

对于这个问题,有一系列不同的做法,在这一系列里面,有诸如上图的方法,我们直接不考虑Speaker Encoder了,取而代之,用one-hot表示某一语者说的。每一个Speaker就用一个one-hot vector表示。
但是,像这样的不训练Speaker Encoder的方法,仅用one-hot来表示Speaker的方法,会有一个问题
  没有办法合出新的Speaker的声音,除非将新Speaker加入训练集并增加one-hot一维,重新训练

当然还有其他的方法,我们的Speaker Encoder可以提前训练好,有一些其他的方法可以得到这个Encoder。如i-vector,d-vector,x-vector等等。这次我们先不细讲这些vector是什么,我们会在语者验证上还会再提到这些vector(这类Speaker Encoder可以download到)。

(2)Content Encoder

那对于 Content Encoder,我们有没有办法确保这个Encoder只会encode 内容讯息,而不考虑语者等。
一个常见的作法是直接把语音辨识系统Speech Recognition放在Content Encoder上,但如果我们希望将这个Speech Recognition和VC一起训练的话,就不能使用一般的Speech Recognition,因为一般的Speech Recognition的输出是文字,没办法丢到Decoder里。一个常见的作法是(类似HMM,在HMM中也可以加deep learning,训练一个dnn,输入一个acoustic feature,输出这个acoustic feature属于每一个token的几率)所以我们可以直接把这个DNN直接搬过来当作Content Encoder,它的输出就是每一个token的几率,这样就不包含了语者讯息而只有文字信息。

当然,还有其他的想法,可以加上Adversarial Training对抗训练来让Content Encoder不要encode语者的资讯

Adversarial Training

在这里插入图片描述
我们可以另外训练一个 Discriminator 鉴别器,它的功能就是一个Speaker的分类器,判断Content Encoder输出的向量是属于哪个语者,而Content Encoder要训练的目标就是想办法骗过这个Discriminator使得判断错误。而这个 Discriminator 和 Content Encoder是交替训练的,就和一般的GAN的训练方式一样。

Designing network architecture

在这里插入图片描述
以下技术,已经在Image Style Transfer使用了,我们只举出其中的一种方式,不同文献有很多不同的方法

其实,是有可能通过修改网络结构的方法来实现Encoder,给Content Encoder部分加 “IN”,给Speaker Encoder输出的向量加“AdaIN”

  1. IN: instance normalization,将多层1-D CNN 处理声音讯号,然后对每一个channel进行 Normalize,使得这些vector同一个channel的方差为1,均值为0,这样便使得离群值(Speaker特征)处理掉了。对于CNN来说,每一个filter提取到的特征不同,我们可以想象某一个filter提取男声或女声,而Normalize后两者区分不大,因此处理了语者特征。
  2. AdaIN:adaptive instance normalization,参见下图,在 Decoder 经过 IN 后得到的向量z1、z2、z3、z4后,把Speaker Encoder得到的向量分成 Υ 和 β \Upsilon和\beta Υβ,并通过这两个向量来更新所有变量。
    在这里插入图片描述
Experimental Result

在这里插入图片描述

猜你喜欢

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