单位:百度谷歌AI Lab
abstract
我们提出一种利用低维度的speaker embedding,仅通过一个模型生成多个说话者的TTS增强技术。和depp voice的思路一致,增加了building block,改善了性能;对于tactron,增加了一个post-processing neural vocoder,改善了性能。在这两个目前最好的TTS系统上都证明了我们方法的有效性。证明一个TTS系统可以通过每个说话者半小时以内的数据学到上百个语音特征,几乎完整的保存了说话者的特性。
1. introduction
常规的TTS只能完成single-speaker的任务,要想要做multi-speaker就需要不同的数据集和模型参数,因此代价比较高。本文实现了all-neural multi-speaker TTS system,在不同的说话者之间共享大量的参数,不仅可以用一个模型生成不同说话者的声音,而且每个说话者所需的数据量比训练一个单说话者所需的更少。
主要贡献:
- 提出deep voice1的改进版deep voice2;
- 将tactron中的GL声码器替换为wavenet-based spec2wav vocoder;
- 以两个单说话者模型为baseline,证明引入可训练的speaker embedding可以实现multi-speaker speech synthesis。
2.related work
3.single-speaker deep voice2
deep voice2和deep voice1的主要区别将音素持续时间和frequency的部分分离,在deep1中,这两部分是由一个模型预测的,在deep2中分成两部分,首先预测音素持续时间,然后将它作为输入预测基频F0。
3.1 Segmentation model
segmentation model是用于估计音素位置,用无监督的方法学习。用CTC loss区分不同的音素,然后找到它们的边界位置。相比于deep1,增加了批量正则化(BN)和残差连接(residual connect)的部分。
该模型在静默帧和其他音素的边缘会判断出错,为此,我们引入一个post-processing step去纠正,当segment model解码到静默帧时,用silence detection heuristic2调整边界的位置。
3.2 duration model
在deep2中,我们不再预测连续值的duration ,取而代之的是把duration prediction看成一个序列标记问题,将它离散化搭配log-scaled bucket,将每个音素按照持续时间分配bucket label。用条件随机场(CRF)对输出层逐对的可能性进行序列建模。在inference的时候,用viterbi 前传后传算法从条件随机场中解码随机的离散序列。发现:量化duration prediction,并且通过CRF引入pairwise dependence改善了合成的性能。
3.3 Frequency Model
从duration model中解码之后,预测的音素duration从一个音素输入特征上采样到frequency model逐帧的输入。
3.4 Vocal Model
deep voice2 的vocal model基于wavenet的结构,包含两层双向QRNN conditioning network,移除了gated 和残差链接之间的1*1卷积,所有层共用一个conditioner bias。
这样可以将模型尺寸缩小7倍,inference time减少25%,并且不影响感知性能。
4 Multi-Speaker Models with Trainable Speaker Embeddings
用一个低维的speaker embedding vector表示说话者,和之前有所区别的是,我们并不依赖每个说话者的权重矩阵或者layers。说话者相关的参数存在低维向量中,因此所有说护者可以共享几乎全部的权重。用speaker embedding生成RNN初始态,非线性偏置,以及乘的gating factor。speaker embedding用【-0.1,0.1】的均匀分布随机初始化,反传训练,每个模型有自己的speaker embedding set。
为了使说话者独特的发声特性影响模型,我们尝试把speaker embedding加到模型的多个位置,最后发现如果在是输入层中加入speaker embeddiing ,仅会对vocal model起作用,对其他部分都没有作用。可能是因为wavenet中高维的残差链接,并且很难学到高质量的speaker embedding。下面有几种改善质量的方法:
- Site-Specific Speaker Embeddings:在模型每一个用的地方,将shared embedding通过affine projection 和nonlinearity转换成合适的维度和形式。
- Recurrent Initialization:用site-specific speaker embedding将循环层的变量初始化;
- Input Augmentation:在循环层的每一个时间步,将Site-Specific Speaker Embeddings和输入拼接;
- Feature Gating:多层逐元素的Site-Specific Speaker Embeddings激活,使其成为可自适应的flow。(5.我们假设模型可以学到所有必要的信息,让speaker embedding 决定说话者的哪些信息可以用,以及他们对激活函数有多大的影响)
4.1 Multi-Speaker Deep Voice 2
Deep Voice2 models的每一个模型有单独的speaker embedding,也可以组合成一个大的speaker embedding数组,但是每个embedding是单独训练的。
4.1.1 segment model
和deep voice1不同的是,激活函数的BN乘以Site-Specific Speaker Embeddings,所有的卷积层之间共享相同的speaker embedding。
4.1.2 duration
speaker embedding一个作为和特征concat作为输入,另外一个作为循环层的初始值。
4.1.3 Frequency Model
将所有的recurrent layer,除了输出层,都用speaker embedding初始化。如3.3所述,single-speaker frequency model预测一个归一化的frequency,然后依赖均值方差,经过一个固定的线性变换变成observed speaker。不同说话者的值相差很大,比如说,男性说话者基频F0通常比较低。为了解决这一问题,我们将均值和标准差作为可以训练的模型参数,将它们乘以与speaker embedding有关的缩放因子。
gf是speakerembeddingg_f是speaker embeddinggf是speakerembedding
μf、σf分别是数据集的均值、标准差 \mu_f、\sigma_f分别是数据集的均值、标准差μf、σf分别是数据集的均值、标准差
Vμ、Vσ是可以训练的均值、标准差V_\mu 、V_\sigma是可以训练的均值、标准差Vμ、Vσ是可以训练的均值、标准差
4.1.4 Vocal Model
multi-speaker vocal model 仅使用输入增强,将site speaker embedding 嵌入到每个输入帧上。和global conditioning不同,它影响的是local condition。
没有speaker embedding也会生成听起来有点特色的声音,因为它接收了frequency 和duration model的distinct(独特的)特征。然而,加了embedding之后语音质量有所提升,并且观察到embedding收敛到一个有意义的latent space。
4.2 Multi-Speaker Tacotron
除了deep voice2,我们也在Tactron上实验,当训练multi-speaker tactron 的版本时,发现模型的性能高度依赖模型的超参数,在speaker的小数据集上学不到attention机制。并且发现,如果不同语音片段的开始时刻不一致的话,模型较难收敛到一个合理的attention曲线并生成可识别的语音。因此,将每个语音中前后的静默帧删除。因为对模型超参数和预处理的高度敏感,后续的优化很大可能会提升性能。
4.2.1 Character-to-Spectrogram Model
Tactron包含CNHG、attention decoder、CBHG post-processing模块。
发现如果将embedding加到post-processing上会使输出性能下降;但是将embedding加到CBHG encoder中是必要的。尝试将site-specific embedding加到highway的输入上,以及加到GRU的每个时间步输入上。
发现将embedding加到decoder上也有效果,分别加在decoder prenet和attention RNN上。还加在decoder rnn的输入,也作为content-based attention的tanh激活函数的bias。
p.s.两个图的结构不一样,不能根据位置对应模块。
4.2.2 Spectrogram-to-Waveform Model
tactron用GL算法作为声码器,迭代的估计未知的相位,但是输入端微小的噪声会在输出端造成很大的误差,为了改进,我们用wavenet vocoder的vocal model作为替换,由表1可以看出,性能得到明显改进。
5. result
5.1 Single-Speaker Speech Synthesis
表1是单说话者的语音合成,每个说话者20h的训练数据,说明1⃣️deep voice2相对于deep voice1 有质量改进;2⃣️wavenet对于tactron有质量改进;
5.2 Multi-Speaker Speech Synthesis
在VCTK(44K,108speaker)上训练,也在audiobook(238小时,447speaker,每人30min)上训练,结果表明模型可以学到上百个不同口音和节奏的说话者的特征,并且learned embedding在一个有意义的latent space中。
用crowdMOS framework评估语音质量,将原始音一同送入进行测试,因为原始音的问题而不是模型的问题,打分会被压低。但是实际上,在考虑低采样率或者扩展的时候,和真实值的差别不大。
6.conclusion
本文探索了将tts从单说话者扩展到多说话者,使用了低纬度的可训练的speaker embedding。未来的工作:模型最多可以学到多少说话者的信息?要合成高质量的语音,每个spaker最少需要多少的语音数据?当新增说话者时,是否可以调整模型参数并且只训练new speaker embedding?speaker embedding是否可以用做一个有效的向量空间,就像词向量一样?