在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。
地址:https://www.zhihu.com/people/xuan-yun-77-83
01
Definition and Application
输入: 一段声音。长度为 ,维度为d维的acoustic feature的语音表示 输出: 另外一段声音。长度为 ,维度为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 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技术将标准的英文正确发音示例转成学习者自己的声音,使得学习者更容易学习如何发出最标准的英文,因为在语言学习研究上表明人们更容易理解自己的声音甚至是同性别的声音。 4. Data Augumentation 数据增强 还有一个比较神奇的应用,是通过Voice Conversion来做 Data Augumentation 数据增强,举例来说, 1. 把语音辨识训练资料里面的所有的男生的声音 转换成女生声音 ,和女生的声音都转男生的声音,文字部分不变。这样训练资料就变成了两倍 。但这种技术不是总是有用的,详情请阅读文献。 2. 把干净 的声音转成有杂讯 的声音,为什么我们这么做呢?因为在做语音辨识上,本来就会做Data Augumentation,语音辨识常用的Data Augumentation就是直接把杂讯加到语音上面。有人觉得这样直接把杂讯和语音加起来不是那么的好,通过VC技术把干净的声音直接转成有杂讯 的声音可能更好。当然,还有人将有杂讯的声音转成干净 的声音,这就是去噪 。 02
Real Implementation
以上,就是 Voice Conversion 的定义和应用 在进入Voice Conversion真正的技术之前,我们要先明晰两件事情。 1. & Vocoder(1) 通常而言,Voice Conversion系统的输入和输出长度可以是不一样 的,甚至不一样的的话应该会更好。(假设我们在做口音的转换,不同的口音间讲话的声音的长度很有可能不一样大,比如韵律这种,也是语者的一种特性。甚至是说,如果语音转换时,前后语音长度一样,听起来可能不真实)但是在很多时候,你在阅读文献的时候会发现,我们会假设输入和输出的声音的长度 一样,这可以让我们的模型简单一点,直接假设输入和输出的长度是一样的,就不需要用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. 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:没有成对的训练资料。 3. 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的语音,而不考虑语音内的特征分离。 4. Feature Disentangle Feature Disentangle要怎么使用呢?我们以语者Speaker转换为例,假设我们可以训练出: Content Encoder: 将一句话有关内容的部分提取出来。 Speaker Encoder: 将一句话无视内容、与语者特征有关的部分提取出来。 接下来,我们还需要训练一个Decoder,给Decoder输入Content Encoder的输出和Speaker Encoder的输出 ,Decoder将输出通过这个Speaker的语音念出Content的内容。接下来只需换替换Speaker Encoder就可以做到语音转换。 模型训练好后,当我们需要转换语者信息的时候就可以将语者B说的话丢到语者的encoder中,结合之前的内容C的特征,经过Decoder就可以得到最后的结果。 比如我们想把李宏毅的声音转换为新垣结衣的声音,但保持说话的内容不变。我们只需要把李宏毅的声音丢给内容编码器,提取出内容向量,再把新垣结衣的声音丢给音色编码器,提取出音色向量。最后把这两个向量接起来丢给解码器,就能得到说李宏毅内容的新垣结衣的声音。 Encoder & Decoder 可是我们要怎么训练出这样的Encoder和Decoder呢? 这边实现Feature Disentangle的技术非常类似Auto-Encoder,但是它必须要比Auto-Encoder再多使用一些其他的方法才能让Content Encoder和Speaker Encoder产生不一样的向量。 Feature Disentangle最基本的做法是: 2. 接下来,我们训练一个“Auto-encoder ”,Decoder的部分就和普通的Auto-encoder一样,但是Encoder的部分会有好几个,让输入语音序列分别输入两个编码器,我们期待不同的Encoder encode到不同的资讯(如Content Encoder就只抽content的资讯)。 3. 最后,我们希望我们的Decoder输出的部分与最开始输入的声音讯号的distance越接近越好 。重构损失计算可以用L1或L2距离。 但是问题是,我们怎么让我们的某个Encoder只处理特定的资讯,如Content Encoder只处理content内容的资讯而不处理Speaker的资讯呢? (1) Using Speaker Information 一种简单的做法是,我们不要音色编码器,而是直接通过监督信息,输入一个标识说话者的独热编码向量让模型去学。 但这样对新的说话者不友好。如果有10个说话者,我们就开10个向量。每个 Speaker 用一个独热编码标识。但如果有第11个说话者进来。模型就不能完成音色转换。 没有办法合出新的Speaker的声音 ,除非将新Speaker加入训练集并增加one-hot一维,重新训练 (2)Pre-training Encoders 第二种方法是预先训练好Speaker Encoder 这个Speaker Encoder 吃一段语音信号,可以输出得到这个语音信息的语者的向量表示,这个方法也叫:Speaker embedding,通常有:i-vector, d-vector, x-vector …,这里不深入,后面有专题讲语者验证再讲。 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的几率,这样就不包含了语者讯息而只有文字信息。 这里也可以用现有的表现较好的LAS模型来做编码器。HMM也可以加深度神经网络。这个深度神经网络输出的是HMM的发射矩阵,可以当做是内容编码器的输出。 (3)Adversarial Training 当然,还有其他的想法,可以加上Adversarial Training对抗训练来让Content Encoder不要encode语者的资讯。 我们可以另外训练一个Discriminator鉴别器,它的功能就是一个Speaker的分类器,判断Content Encoder输入内容编码器的内容嵌入,输出的向量判断是属于哪个语者,而Content Encoder要训练的目标就是想办法骗过这个Discriminator使得判断错误。这样就会使得它编码出的信息要尽可能地不包含音色信息。而这个 Discriminator 和 Content Encoder是交替训练的,就和一般的GAN的训练方式一样。 03
Designing network architecture
借鉴图像上用过的技术,修改网络构架,使得每个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 然后经过一组CNN的1D的filter,得到一组数值:
3 然后再经过另外一组1D的filter,得到另外一组数值,以此类推,若干组后,每一小段声音信号都对应到一个vector:
4 instance normalization就作用在这些vector上: 5 instance normalization会作用在这些vector相同的维度上,把这些维度上的mean和variance处理(前者减,后者除)后变成: 最后是mean为0,variance为1。 这样为什么能去掉语者特征?因为每个vector的维度(就是上图中的黑色矩形框内的东西)都代表一种CNN抽取出来的某个特征,假设图中矩形框是性别特征,那么男生低频特征会明显,女生高频特征会明显,如果经过instance normalization后,就相当于抹去了这些特征。 当我们的内容嵌入喂给解码器的时候,我们希望音色编码器对解码器的影响是在音色信息层面上。我们会用一个 Adaptive Instance Normalization 把音色编码器的输出加在解码器的后面。这样一来,解码器就只能根据音色编码器的输出去改变内容嵌入的信息。把内容嵌入和音色嵌入加入到解码器的方式有很多种。目前还没法说出,哪种方式接是最好的。 AdaIN: adaptive instance normalization,这个only influence speaker information,参见下图,在 Decoder 经过 IN 后得到的向量z1、z2、z3、z4后,把Speaker Encoder得到的向量分成 ,并通过这两个向量来更新所有变量。 首先,Decoder也有instance normalization,对CNN输出的vector每个维度做normalization,去掉语者的信息,去掉语者的信息后又如何输出语者的信息?
这些信息要从speaker encoder这里提取这些信息。speaker encoder的输出通过两个transform后分别得到 这两个变量:
这两个变量会去影响上图中Decoder的输出(做了instance normalization之后): ,影响的公式如下: 可以看到这个影响是对所有的vector都有,是全局的。 这里的IN加上 的影响两块合起来就是AdaIN。 最后整个模型按AE进行训练即可。 实作结果 从上图可以看到加入IN后,speaker classifier的正确率降低了,说明IN效果不错,过滤掉了语者信息,导致正确率降低。 如果我们想验证音色编码器的效果,我们可以把它输出的嵌入做一个可视化聚类。如图我们可以看出 不同特征音色之间存在明显的界限,说明音色编码器对人声特质有很好的分离效果。 本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“综述专栏”历史文章
更多综述专栏文章, 请点击文章底部“阅读原文 ”查看
分享、点赞、在看,给个三连击呗!