首页 > > > 11514 语音转换技术综述
上个月浏览了若干个专题的数十篇论文,觉得很有收获。今天来综述一下其中「语音转换」这个专题的文章。文中提到许多机器学习模型,我尽可能保持简略,仅叙述其思想,避免深入数学细节。有些参考文献我可能浏览得不够仔细,如有错漏,欢迎指正、补充。
「语音转换」(voice conversion)是这样一个任务:输入一条语音,在保持说话内容不变的情况下,让它听起来像是另一个人说的。一个典型的用例,就是柯南的蝴蝶领结变声器。
语音转换的一般流程分为三步:1. 提取特征;2. 转换特征;3. 重新合成语音。
提取特征常用的方法有 HNM(harmonic noise model)[1]、STRAIGHT(Speech Transformation and Representation using Adaptive Interpolation of weiGHTed spectrum)[2]等。提取出的特征中,最重要的是频谱包络(或由其导出的 MFCC 等),它表示发的是什么音;除此之外还有基频(表示音高)、语速等等。
在转换特征这一步,绝大多数研究都只专注于频谱包络特征的转换,这也是本文综述的对象。对于基频,一般的系统只在对数域中做一个简单的线性变换,让转换后语音的对数基频的均值和方差与目标说话人匹配。语速等特征则很少有系统触及,一般的系统都是逐帧转换的,输入有多少帧,输出也有多少帧。
重新合成语音一般使用语音编码器(vocoder)。传统的 vocoder 合成出的音质往往较差。2018 年的语音转换挑战赛[3]的报告指出,用 WaveNet[4]来合成语音,音质会有显著提高。
在讲解语音转换的多种具体方法之前,先讲一下比较轻松的评测。
语音转换并没有公认的标准评测数据集。2016、2018 年各举办过一次语音转换挑战赛[5][3],它们使用的数据集有望成为标准。
语音转换的评测方法分为客观评测和主观评测。
2.1 客观评测
语音转换的客观评测标准是 MCD(Mel cepstral distortion),它表示的是转换后语音的 MFCC 特征与标准输出语音的 MFCC 特征的差距。测量 MCD,需要把转换后语音和标准输出语音的 MFCC 特征序列对齐。设某一帧的标准输出特征为
,而转换后语音的特征为
,则这一帧的 MCD 定义为:

MCD 的单位为分贝(dB)。式 (1) 前面的系数,就是为了把单位转化成分贝的,其中除以
是为了把本身就是自然对数值的 MFCC 转换成常用对数,但
的作用我没搞懂。MCD 可以在所有测试数据上取平均值。
MCD 的优点是可以全自动计算,但研究发现,它与人们主观感受到的音质的相关性并不够强。因此,语音转换更可靠的评测方法是主观评测。
2.2 主观评测
主观评测的指标主要有两个:转换后语音的音质,以及与目标说话人的相似度。
评价单个系统时,一般采用 MOS(mean opinion score)。对于音质,一般采用 5 分制,1 分为最差,5 分为最好。对于相似度,则常常让被试分别听取源说话人的语音、目标说话人的语音(顺序不定)、转换后的语音,并在下列四个或五个等级中做出选择:
● 转换后的语音更像源说话人,且十分肯定;
● 转换后的语音更像源说话人,但不确定;
● 完全不确定转换后的语音更像哪个说话人(可能没有这个等级);
● 转换后的语音更像目标说话人,但不确定;
● 转换后的语音更像目标说话人,且十分肯定。
比较两个系统时,可以分别评价然后比较分数;也可以按如下方法进行 preference test。对于音质,一般是让被试听取两个系统的输出,选择哪一个音质更好;对于相似度,一般是让被试听取两个系统的输出(顺序不定)以及目标说话人的语音,选择哪一个系统的输出更像目标说话人。后面这种测试又常称为 ABX test 或 XAB test,其中 A、B 指两个系统的输出,X 指目标说话人的语音。
主观评测需要大量的被试来参与,这些被试常常在 Mechanical Turk 上招募。由于可能有些被试打分不认真、不自洽,所以被试的回答需要筛选。同时,由于被试的回答带有主观性、随意性,在比较不同的系统时,需要进行显著性测试,确保比较结果有意义。
本节讲述几种传统的语音转换方法,它们主要流行于 2000 年代。它们的共同特征是:
● 源和目标说话人的身份固定;
● 需要帧级对齐的训练数据。
帧级对齐的训练数据,一般是在平行数据(parallel data,即源和目标说话人说同样的内容)上运行 DTW(dynamic time warping)算法得到的。如果没有平行数据,也可以在非平行数据上进行语音识别,然后寻找对应的音素去对齐。因为有数据对齐的要求,传统的语音转换方法一般无法进行跨语言的语音转换,即源和目标说话人的训练数据不能来自不同的语言。
3.1 高斯混合模型(Gaussian mixture models, GMM)
高斯混合模型是传统方法中最主流的一种。它的基本思路是,用一个 GMM 去拟合输入特征与输出特征的联合分布,在转换时根据输入特征和 GMM 去推断输出特征。
GMM 通过许多高斯分布的加权平均,可以拟合任意分布。语音转换使用的 GMM 的每一个分量采用如下形式:
![\left[ \begin{array}{c} \bm{X} \\ \bm{Y} \end{array} \right] \sim \mathcal{N} \left( \left[ \begin{array}{c} \bm{\mu_X} \\ \bm{\mu_Y} \end{array} \right], \left[ \begin{array}{cc} \bm{\Sigma_{XX}} & \bm{\Sigma_{XY}} \\ \bm{\Sigma_{XY}} & \bm{\Sigma_{YY}} \end{array} \right] \right) \qquad (2) \\](https://image.z.itpub.net/zitpub.net/JPG/2020-06-19/8D15CDEC704DD701968BE166D877F6F8.jpg)
其中
分别代表输入特征与输出特征。为了控制 GMM 的参数数量,各分量的协方差矩阵
常采用「分块对角」形式,即
均为对角阵。这就是说,只有
的对应维度之间允许相关,
内部各维、
内部各维,以及
的不同维度之间都是独立的。由于这种独立性的要求,输入、输出特征最好选取 MFCC 这样各维本就几乎独立的特征,而不要选取频谱包络本身这样各维相关性强的特征。
在训练数据上拟合好输入、输出特征的联合分布
后,得到的 GMM 还有多种用法,从粗暴到精致排列如下:
1. 对每一帧输入特征
,先找到它最可能属于的分量,然后在这个分量上求使得
最大的
作为输出特征。在一个分量上,使得
最大的
就是条件期望
,这个
与输入特征
满足线性关系
。当 GMM 分量的协方差矩阵采用「分块对角」形式时,这里的
也是对角矩阵。代表作:[6]。
2. 对每一帧输入特征
,求出它属于各个分量的概率,对每个分量的条件期望
进行加权平均作为转换后的特征。这相当于在整个 GMM 上求条件期望
。代表作:[7]。
3. 仍采用用法 2 中「线性变换的加权平均」的形式,但其中的线性变换不采用条件期望,而是重新拟合,使得训练集上变换后的特征与输出特征的误差尽可能小。代表作:[8](其实这才是用 GMM 做语音转换的开山之作)。
上面的讲解假设了各帧的特征都是无关的。实际中常常使用带有差分的特征,相邻帧的特征之间的差分关系会使得数学变复杂很多。
用 GMM 进行语音转换有一个缺陷:由于转换过程中常常进行「求期望」或「加权平均」的操作,转换后的特征往往过于平滑,听起来显得沉闷。一种典型的补救方法是用全局方差(global variance,GV)进行正则化(regularization),让转换后特征的方差符合训练数据特征方差的分布。这里说的「全局」,其实指的是在一条语音的范围内。用全局方差进行正则化的具体做法是:在训练数据上测量每条语音各维特征的全局方差,并拟合出一个分布
(通常用高斯分布就可以)。在转换阶段求解输出特征
时,把转换后的语音特征的全局方差在
上的概率也包含进目标函数中[6]。如果 GMM 采用用法 3,那么在拟合各分量的线性变换时也可以使用全局方差进行正则化[9]。
除了全局方差以外,也有使用调制频谱(modulation spectrum,MS)进行正则化的[10]。调制频谱的意思是,把语音特征看成一个时域信号,再求它的频谱。用调制频谱进行正则化,实质上是要求转换后特征的波动情况与真实特征序列相似,这一要求比仅考虑全局方差更苛刻。
GMM 方法的前身是向量量化(vector quantization,VQ),GMM 可以看成是向量量化的「连续版本」。由于向量量化方法实在太简陋,这里就不详述了。
3.2 频率弯折法(frequency warping)
GMM 如果采用「分块对角」形式的协方差矩阵,其每个分量的线性变换
实质上是在对特征的各个维度分别进行转换。如果把特征画成函数图像,这个转换是沿纵轴进行的。「频率弯折法」则采用了一个完全不同的角度:它是把频谱包络特征沿频率轴进行伸缩,相当于沿横轴变换特征。
频率弯折法也是一种比较简陋的方法,它的基本步骤如下[11]:
1. 对训练数据中的输入、输出语音分别提取共振峰;
2. 从配对的输入、输出共振峰数据中,拟合一个分段线性的弯折函数(如下图);
3. 转换时,用弯折函数对语音的频谱包络进行伸缩。

分段线性的弯折函数如上图所示,它可以调整频谱包络上各个共振峰的位置和宽度,让输入、输出语音的频谱包络尽可能相似。频率弯折法的局限性非常明显:它对频谱包络的改动太少了,甚至连共振峰的高度都不能修改。不过正因为改动比较少,重新合成出的音质往往较好。
对语音中的所有帧都使用同一个弯折函数,显得不太合理。所以也可以先对语音的各帧进行无监督聚类(如 k-means)或有监督分类(如音素识别),然后对每个类分别拟合一个弯折函数。
对语音帧进行硬分类,感觉很像向量量化;当相邻两帧语音分属不同类别时,弯折函数会发生突变,导致转换后的语音不自然。于是也可以引入 GMM 来进行软分类[12]:对于一帧输入语音,求出它属于 GMM 各个分量的概率,把各个分量的弯折函数按概率加权平均后,再用来伸缩频谱包络。这样一来,弯折函数在帧间就是渐变而不是突变的了。
3.3 基于样例的方法(exemplar-based method)[13]
基于样例的方法的思路是:把语音的语谱图分解成许多基本单元(称为「样例」)的叠加。如下图所示,矩阵
表示语音的语谱图(仅含幅度,不含相位);矩阵
称为「词典」,它的每一列是一个样例;矩阵
称为「增益矩阵」,其元素代表每一帧每一个样例的强度。矩阵
可以看成是对语音内容的一种抽象表达。矩阵
、 都必须是非负的,根据
求
、
中一者或两者的过程叫做非负矩阵分解(non-negative matrix factorization,NMF),它可以使得
、
的乘积与
在某种意义下最接近。一般还要求
是稀疏的,否则它可以把各个样例叠加得面目全非,就与分解的初衷相违背了。

基于样例的语音转换,步骤如下:
1. 在训练时,把经过对齐的源、目标说话人的语谱图进行非负矩阵分解。用
、
分别表示源、目标说话人第
条语音的语谱图,则分解的形式如下:

注意右边各个矩阵的下标:词典矩阵
是只与说话人有关的,同一个说话人的所有语音都使用同一个词典;而增益矩阵
是跟说话人无关的,源、目标说话人的对应语音是用相同的系数把不同的样例进行组合的结果。
2. 在转换时,先把输入语音的语谱图
用源说话人的词典
分解,得到增益矩阵
,再根据这个增益矩阵
和目标说话人的词典
合成转换后语音的语谱图
:

上面的讲解中,默认了样例都是单帧的,这使得转换后的语音容易有不自然的突变。事实上样例也可以是多帧的。此时,词典矩阵
变成了三维的,它除了样例序号、频率两个轴以外,还多了一个时间轴。增益矩阵
仍然只有样例序号、时间两个轴,它与
进行运算时,在样例序号这个轴上是通常的矩阵乘法,而在时间轴上是卷积,于是结果矩阵
不再有样例序号这个轴,而仍有时间、频率两个轴。在这种运算下,根据
依然可以估计
、
中的一者或两者,这个过程叫做非负矩阵解卷积(non-negative matrix deconvolution,NMD)。
除了高斯混合模型、频率弯折法、基于样例的方法之外,在早期也有一些利用神经网络进行语音转换的尝试,例如[7]。神经网络的好处是,它可以对语音特征进行非常灵活的非线性变换,另外 CNN、RNN 等网络结构可以更好地处理帧与帧之间的关系。不过,这些早期的尝试并没有打破「说话人身份固定」、「训练数据需要帧级对齐」这两个限制。
本节介绍 2010 年代新出现的几种语音转换方法。除了在音质、相似性两方面超越传统方法以外,这些方法更重要的成就是打破了「训练数据需要帧级对齐」这个限制,其中有一些也打破了「说话人身份固定」这个限制。
4.1 生成对抗式网络(generative adversarial networks, GAN)
生成对抗式网络(GAN)[14]是一种新兴的生成式模型。它的特点是,模型中除了有一个生成器
以外,还有一个判别器
。判别器的任务是判断一个数据是由生成器生成的,还是来自真实数据;而生成器的训练目标,则是要「骗」过判别器,让它无法分辨生成的数据与真实数据。在训练过程中,生成器
和判别器
就像假币贩子和警察一样,「道高一尺、魔高一丈」地互相促进对方的进化,最终结果是生成器
能够使得生成的数据分布与真实数据分布一致,而判别器
则「功成身退」。GAN 应用于图像、语音等数据时,生成的结果往往能以假乱真,这是它最大的优点;当然它也有缺点,比如训练比较困难。
文献[15]利用 GAN 的一种特殊架构 CycleGAN[16]进行了语音转换。CycleGAN 中有两个生成器
和
,前者负责把源说话人的语音
转换成目标说话人的语音
,后者则反过来,负责把
转换成
。这里的
、
都是指整条语音而不是单帧;语音的具体表示形式(语谱图甚至波形)可以自由选取,因为生成器
和判别器
都是神经网络,它们能够处理任意形式的语音。

CycleGAN 训练时的损失函数由以下三部分组成:
1. 对抗损失(adversarial loss):CycleGAN 中除了两个生成器以外,还有两个判别器,用于分辨两个生成器的输出与两个说话人的真实语音。注意,这里不需要生成器的输出与真实语音对齐,连平行数据都不需要!
2. 循环一致性损失(cycle-consistency loss):GAN 有一个臭名昭著的缺陷,就是在训练过程中容易发生 mode collapsing,通俗点儿说就是不管输入是什么,都给出一样的输出。循环一致性损失的设置,就是为了防止 mode collapsing,让两个生成器能够保持语音的内容。其具体做法是,要求语音在 CycleGAN 中转一圈后,与初始时基本一致,即
尽可能接近
,
尽可能接近
。如果发生了 mode collapsing,在一个方向上损失了的信息是不可能在另一个方向找回来的。
3. 全等映射损失(identity-mapping loss):即使使用了循环一致性损失,CycleGAN 里的生成器还是有可能对语音的内容做手脚。打个极端的比方,两个生成器除了转换说话人的身份之外,还把语音的内容变成了原来的反义句,这样的 CycleGAN 同样可以让循环一致性损失很小,因为语音内容取了两次反之后又变回了原样。全等映射损失,就是让
尽可能接近
、
尽可能接近
,即当
的输入已经是目标说话人的语音、
的输入已经是源说话人的语音时,两个生成器应当充当一个全等映射,不要对语音的内容做任何的改动。
用 CycleGAN 进行语音转换,打破了「需要平行训练数据」的限制,但源和目标说话人的身份仍然需要事先指定。
4.2 i-vector + PLDA(probabilistic linear discriminant analysis)
到此为止介绍的所有语音转换方法,都需要事先指定源和目标说话人的身份。而文献[17]借鉴了说话人识别中的 i-vector 与 PLDA,打破了这一局限,只需要训练一个系统,就能处理许多源和目标说话人。
i-vector 与 PLDA 的数学推导是出了名的复杂,我曾在 2011 年的夏天推导过一个多星期。在这里,我尽可能避开数学细节,用最简洁的语言引入相关概念和方法。
1. i-vector 与 PLDA 方法利用的语音特征是 MFCC 特征。首先,使用很多背景语音的 MFCC 特征拟合出一个高斯混合模型,称为通用背景模型(universal background model,UBM)。
2. 对每一条语音,微调 UBM 中每个分量的均值,使得这条语音的各帧 MFCC 特征的总概率最大。上一句话描述的是最大似然估计(maximum likelihood estimation,MLE),但实际使用的是最大后验估计(maximum a posteriori,MAP)。把这些分量的均值串起来,称为超向量(supervector),这可以作为一条语音的固定长度的表达方式。超向量忽略了语音中各帧的顺序,不过我们关心的是说话人的身份,所以丢失这点信息无关紧要。
3. 超向量的维数一般特别高(常常有上万维),不方便使用。但可以考虑把它压缩至数百维,压缩后的向量称为 i-vector。这里的压缩看似可以使用主成分分析(principal component analysis,PCA),但实际上使用的方法比 PCA 复杂得多。i-vector 中的 i 来自 identity(身份)的缩写,但其实它包含的不只是说话人的身份信息,也有一部分语音的内容信息(但丢失了各帧的顺序)。
4. PLDA 则继续为 i-vector 建模,试图分离其中的身份与内容信息。具体地说,PLDA 认为一条语音的 i-vector
可以如下分解:
,其中
是一个固定的向量,
代表说话人的身份,
是一个线性变换,而
是代表语音内容的噪声项,它服从特定的分布。使用许多说话人的许多语音(每个说话人都要有多条语音),就能训练出模型中的所有参数,以及每个说话人的身份向量
。
以上说的是训练过程,这个过程也不需要平行数据。转换过程则是这样进行的:
1. 提取输入语音的 i-vector
。
2. 设源、目标说话人的身份向量分别为
,则按此式计算转换后语音的 i-vector:
。此式的效果就是,保持语音的内容信息不变,更换了说话人的身份信息。
3. 由 i-vector 的改变量,逆推出超向量的改变量,这就是说话人身份转换导致的 GMM 中各个分量的偏移量。
4. 求出每帧语音特征属于 GMM 各个分量的概率,并以这些概率为权重对各个分量的偏移量进行加权平均,这就是每帧语音应当改变的量。
5. 用修改后的 MFCC 特征重新合成语音。
不难看出,i-vector + PLDA 方法不再要求源、目标说话人固定,而只需要知道两个说话人的身份向量
、
。如果两个说话人都在训练数据中,那么两个身份向量是在训练阶段就已经求出了的。即使两个说话人不在训练数据中,只要有他们的多条语音,也能够用 PLDA 估计出他们的身份向量,从而实现语音转换。
4.3 自编码器(autoencoders)
除了 i-vector + PLDA 之外,自编码器也能打破「说话人身份固定」的限制。并且,自编码器是用神经网络实现的,数学上比 i-vector + PLDA 友好许多。
自编码器是这样一种模型:模型中含有一个编码器和一个解码器,编码器负责把数据的表层特征转换成隐表示,解码器负责从隐表示中恢复出表层特征。在语音转换任务中,数据的表层特征可以是波形、语谱图、MFCC 序列等,隐表示则蕴含了语音的内容和说话人的身份信息。如果能通过某种手段,把隐表示中「内容」和「身份」两部分信息分开 —— 这称为解纠缠(disentanglement),那就可以自由地替换隐表示中的身份信息,实现语音转换啦!另外,自编码器的训练目标是让经过编码和解码后的语音与原始语音尽可能相似,所以它天然就不需要平行的训练数据。
文献[18]就提出了一种实现「解纠缠」的方法。如下图所示,它把身份信息作为了解码器的条件,这样编码器就不需要编码输入语音中的身份信息,而可以专注于编码内容信息了。身份信息可以采用 one-hot 编码,这样目标说话人就可以从参与训练的多个说话人中随意选取。如果采用上一小节讲的身份向量
来表示说话人的身份,那么甚至可以合成训练时没有见过的说话人的声音;并且,与 i-vector + PLDA 方法相比,自编码器只需要知道目标说话人的身份向量,而不需要知道源说话人的身份向量。文献[18]采用的自编码器是变分自编码器(variational autoencoder,VAE),但其中「变分」的部分并不本质,所以就不展开讲了。

上一篇文献虽然提出了一种可能实现「解纠缠」的网络结构,但它并没有通过目标函数去促使编码器舍弃身份信息,实现解纠缠。另外,它转换出的语音也存在过度平滑的问题。文献[19]就借鉴了 GAN 的思想,用「对抗式训练」解决了这两个问题。具体地说,它是把编码器和解码器看成两个生成器,并针对它们增设了如下两个判别器:
● 第一个判别器根据隐表示来做说话人识别,编码器的任务就是「骗」过它,让它无法从隐表示中识别出说话人的身份;
● 第二个判别器用来分辨解码器的输出与真实语音,解码器的任务就是「骗」过它,即克服过度平滑的问题,让输出与真实语音无法分辨。
如果说文献[19]是「有为而治」地实现了隐表示解纠缠,并克服了输出过度平滑的问题,那么文献[20]则是「无为而治」:它用数学证明了,只要自编码器中隐表示的维数选得合适,使它刚好能够容纳内容信息而容不下身份信息,那么就能自动做到隐表示解纠缠、输出语音自然。当然,在实践中,隐表示的最佳维数并不需要由理论计算得出,而是可以通过实验来找到。
在上述三种现代方法之外,RBM(restricted Boltzmann machines)也能利用非平行训练数据进行非特定说话人的语音转换[21]。不过,由于 RBM 在 2010 年代后半已经不太流行了,这篇文献我就没有细看了。
原文作者:;如有侵权,请联系管理员删除。