上个月浏览了若干个专题的数十篇论文,觉得很有收获。今天来综述一下其中「语音转换」这个专题的文章。文中提到许多机器学习模型,我尽可能保持简略,仅叙述其思想,避免深入数学细节。有些参考文献我可能浏览得不够仔细,如有错漏,欢迎指正、补充。


一、语音转换概述

「语音转换」(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 的每一个分量采用如下形式:


其中[公式]分别代表输入特征与输出特征。为了控制 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. 转换时,用弯折函数对语音的频谱包络进行伸缩。


分段线性的频率弯折函数(图片取自 [12])

分段线性的弯折函数如上图所示,它可以调整频谱包络上各个共振峰的位置和宽度,让输入、输出语音的频谱包络尽可能相似。频率弯折法的局限性非常明显:它对频谱包络的改动太少了,甚至连共振峰的高度都不能修改。不过正因为改动比较少,重新合成出的音质往往较好。

对语音中的所有帧都使用同一个弯折函数,显得不太合理。所以也可以先对语音的各帧进行无监督聚类(如 k-means)或有监督分类(如音素识别),然后对每个类分别拟合一个弯折函数。

对语音帧进行硬分类,感觉很像向量量化;当相邻两帧语音分属不同类别时,弯折函数会发生突变,导致转换后的语音不自然。于是也可以引入 GMM 来进行软分类[12]:对于一帧输入语音,求出它属于 GMM 各个分量的概率,把各个分量的弯折函数按概率加权平均后,再用来伸缩频谱包络。这样一来,弯折函数在帧间就是渐变而不是突变的了。


3.3 基于样例的方法(exemplar-based method)[13]

基于样例的方法的思路是:把语音的语谱图分解成许多基本单元(称为「样例」)的叠加。如下图所示,矩阵[公式]表示语音的语谱图(仅含幅度,不含相位);矩阵[公式]称为「词典」,它的每一列是一个样例;矩阵[公式]称为「增益矩阵」,其元素代表每一帧每一个样例的强度。矩阵[公式]可以看成是对语音内容的一种抽象表达。矩阵[公式]、[公式]都必须是非负的,根据[公式]求[公式]、[公式]中一者或两者的过程叫做非负矩阵分解(non-negative matrix factorization,NMF),它可以使得[公式]、[公式]的乘积与[公式]在某种意义下最接近。一般还要求[公式]是稀疏的,否则它可以把各个样例叠加得面目全非,就与分解的初衷相违背了。


非负矩阵分解示意图(图片取自:https://www.slideshare.net/DaichiKitamura/robust-music-signal-separation-based-on-supervised-nonnegative-matrix-factorization-with-prevention-of-basis-sharing)

基于样例的语音转换,步骤如下:

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


注意右边各个矩阵的下标:词典矩阵[公式]是只与说话人有关的,同一个说话人的所有语音都使用同一个词典;而增益矩阵[公式]是跟说话人无关的,源、目标说话人的对应语音是用相同的系数把不同的样例进行组合的结果。

2. 在转换时,先把输入语音的语谱图[公式]用源说话人的词典[公式]分解,得到增益矩阵[公式],再根据这个增益矩阵[公式]和目标说话人的词典[公式]合成转换后语音的语谱图[公式]:


上面的讲解中,默认了样例都是单帧的,这使得转换后的语音容易有不自然的突变。事实上样例也可以是多帧的。此时,词典矩阵[公式]变成了三维的,它除了样例序号、频率两个轴以外,还多了一个时间轴。增益矩阵[公式]仍然只有样例序号、时间两个轴,它与[公式]进行运算时,在样例序号这个轴上是通常的矩阵乘法,而在时间轴上是卷积,于是结果矩阵[公式]不再有样例序号这个轴,而仍有时间、频率两个轴。在这种运算下,根据[公式]依然可以估计[公式]、[公式]中的一者或两者,这个过程叫做非负矩阵解卷积(non-negative matrix deconvolution,NMD)。

除了高斯混合模型、频率弯折法、基于样例的方法之外,在早期也有一些利用神经网络进行语音转换的尝试,例如[7]。神经网络的好处是,它可以对语音特征进行非常灵活的非线性变换,另外 CNN、RNN 等网络结构可以更好地处理帧与帧之间的关系。不过,这些早期的尝试并没有打破「说话人身份固定」、「训练数据需要帧级对齐」这两个限制。


四、几种现代的语音转换方法

本节介绍 2010 年代新出现的几种语音转换方法。除了在音质、相似性两方面超越传统方法以外,这些方法更重要的成就是打破了「训练数据需要帧级对齐」这个限制,其中有一些也打破了「说话人身份固定」这个限制。

4.1 生成对抗式网络(generative adversarial networks, GAN)

生成对抗式网络(GAN)[14]是一种新兴的生成式模型。它的特点是,模型中除了有一个生成器[公式]以外,还有一个判别器[公式]。判别器的任务是判断一个数据是由生成器生成的,还是来自真实数据;而生成器的训练目标,则是要「骗」过判别器,让它无法分辨生成的数据与真实数据。在训练过程中,生成器[公式]和判别器[公式]就像假币贩子和警察一样,「道高一尺、魔高一丈」地互相促进对方的进化,最终结果是生成器[公式]能够使得生成的数据分布与真实数据分布一致,而判别器[公式]则「功成身退」。GAN 应用于图像、语音等数据时,生成的结果往往能以假乱真,这是它最大的优点;当然它也有缺点,比如训练比较困难。