端到端合成论文——声学模型——FastSpeech
==Ren, Yi, et al. “Fastspeech: Fast, robust and controllable text to speech.” Advances in Neural Information Processing Systems 32 (2019).==citations:575 浙大和微软
解决什么问题
相比于拼接和统计参数的合成方法,神经网络的端到端合成方法的有几个问题:
- 推理过程中mel谱生成的速度慢,这是因为mel谱产生是自回归方式;
- 合成语音不够鲁棒(一些词会跳读、重复读),这是因为error会传播、text和语音之间错误的attention alignments;
- 缺少可控性(语速控制或韵律控制),这是因为自回归的方法一帧帧生成mel谱,没有利用整条文本和整条语音之间的对齐关系;
用了什么方法
以文本和语音是单调对齐作为出发点,提出一种输入文本(音素)序列,非自回归产生mel谱序列的方法(并行),解决了上面的问题1;
为了解决音素序列和mel谱序列不等长问题,根据每个音素的时长对相应的mel谱进行上采样,来扩大mel谱长度;调整每个音素时长length regulator的基础是音素时长预测器,它预测每个音素的时长;Phoneme duration predictor 和之前的 attention alignments一旦不好就会影响合成质量 很不同,因此解决了上面的问题2;
通过调整length regulator,很容易调整语速,还可以通过在相邻音素之间添加break来控制部分韵律,解决了上面的问题3;
效果如何
- 该并行模型在语音质量方面与自回归模型相匹配,几乎消除了特别困难情况下的跳过和重复的问题,并能平稳地调整语音速度。
- 主要特点是合成速度快,使得端到端语音合成快了38倍,是mel谱生成快了270倍,因此叫 FastSpeech;
存在什么问题
- 根据时长直接复制特征扩展特征长度,会不会一个音素的时长里特征都是一模一样的?
- 要额外训练一个教师模型,比较耗时;
- 从教师模型抽取的时长信息不是一定准确的;
- 因为是用的模型蒸馏,教师模型生成的语音mel谱作为target,因为不是用真实音频提取的mel谱,因此丢失了一些音高、能量、韵律等变化信息,比训练数据中用真实音频相比简单得多,多样性也少得多。
Background
Non-Autoregressive Sequence Generation
非自回归序列生成的应用:
neural machine translation :
Jiatao Gu, James Bradbury, Caiming Xiong, Victor OK Li, and Richard Socher. Non-autoregressive neural machine translation. arXiv preprint arXiv:1711.02281, 2017.
Junliang Guo, Xu Tan, Di He, Tao Qin, Linli Xu, and Tie-Yan Liu. Non-autoregressive neural machine translation with enhanced decoder input. In AAAI, 2019.
Yiren Wang, Fei Tian, Di He, Tao Qin, ChengXiang Zhai, and Tie-Yan Liu. Non-autoregressive machine translation with auxiliary regularization. In AAAI, 2019
audio synthesis :
Aaron van den Oord, Yazhe Li, Igor Babuschkin, Karen Simonyan, Oriol Vinyals, Koray Kavukcuoglu, George van den Driessche, Edward Lockhart, Luis C Cobo, Florian Stimberg, et al. Parallel wavenet: Fast high-fidelity speech synthesis. arXiv preprint arXiv:1711.10433, 2017.
Wei Ping, Kainan Peng, and Jitong Chen. Clarinet: Parallel wave generation in end-to-end text-to-speech. In International Conference on Learning Representations, 2019.
Ryan Prenger, Rafael Valle, and Bryan Catanzaro. Waveglow: A flow-based generative network for speech synthesis. In ICASSP 2019-2019 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), pages 3617–3621. IEEE, 2019.
上面都是在推理阶段用非自回归,但是训练阶段还是自回归;
非自回归vocoder:
Parallel WaveNet [16]
ClariNet [18]
WaveGlow [20]
这些方法输入mel谱到输出waveform过程是并行的(非自回归),但是由于生成mel谱过程是自回归的,因此总的来说还是自回归的;
完全非自回归的:
Kainan Peng, Wei Ping, Zhao Song, and Kexin Zhao. Parallel neural text-to-speech. arXiv preprint arXiv:1905.08459, 2019.
这个和fastspeech一样都是完全自回归的,但是参数量比fastspeech大,因此推理速度没fastspeech快;
FastSpeech模型结构
用了教师模型(相当于蒸馏)模型较小;
训练和推理都是非自回归生成mel谱,mel谱到waveform也是并行的(非自回归);
模型总体结构:
由FFT层、时长规整器、FFT、线性层堆叠而来,结构相比于tacotron来说简单很多,没有用到RNN,只有attention+conv就足够!
FFT是先attention再conv;dutation predictor是只用conv;
时长预测器比较巧妙,我们不知道音素实际时长groundtruth,可能可以通过识别方法获得,但是文章采用的是一个attention-based的合成模型获得,去学习音素和谱的时长关系,然后直接把特征复制几份,扩展特征长度了;
Feed-Forward Transformer
每个FFT Block组成:音素embedding输入 👉 multi-head attention 👉 conv 1D 👉 输出(最后是mel谱输出)
多个FFT Block串联起来;
multi-head attention作用:抽取cross-position information,抽取不同位置之间的关系信息;
使用卷积的原因是:在语音任务中,相邻hidden state的字符/音素和mel-谱图序列中很相关。
Length Regulator
输入不同音素时长,复制对应帧数那么多份的变换函数
length regulator $\mathcal{L} \mathcal{R}$ 表示为:
$$
\mathcal{H}{m e l}=\mathcal{L} \mathcal{R}\left(\mathcal{H}{p h o}, \mathcal{D}, \alpha\right)
$$
举例:音素序列的隐状态为 $$\mathcal{H}_{p h o}=\left[h_1, h_2, h_3, h_4\right]$$ ,
在没有加速减速(normal speed) 的情况下($\alpha = 1$ ):对应的音素持续时长序列为 $$\mathcal{D}=[2,2,3,1]$$(所有持续时长加起来的和等于mel谱序列长度),扩展序列 $\mathcal{H}_{m e l}$ 变成$$\left[h_1, h_1, h_2, h_2, h_3, h_3, h_3, h_4\right]$$;
在减速(slow speed)情况下($\alpha=1.3$):对应的音素持续时长序列为 $$\mathcal{D}_{\alpha=1.3}=[2.6,2.6,3.9,1.3] \approx [3,3,4,1]$$ ,扩展序列变成 $$\left[h_1, h_1, h_1, h_2,h_2, h_2, h_3, h_3,h_3,h_3, h_4\right]$$;
在加速(fast speed)情况下($\alpha=0.5$):对应的音素持续时长序列为 $$\mathcal{D}_{\alpha=0.5}=[1,1,1.5,0.5] \approx[1,1,2,1]$$,扩展序列变成 $$\left[h_1, h_2, h_3, h_3, h_4\right]$$;
可以通过调整空格字符的持续时长,来调整单词之间的停顿。比如增加单词间的停顿,就在音素持续时长序列里增加空格这个字符的持续时长,这样子很容易就能调整发音波形的韵律了!
Duration Predictor
预测时长和标签时长之间的均方误差作为loss之一,预测的时长是取log的时长;
标签时长来自于自回归的教师模型;
首先先训练一个自回归的encoder-attention-decoder TTS模型
得到attention alignment
decoder和encoder之间用attention连接,这个attention是multi-head attention,不是每个head都能有好的alignement,因此对多头里的每个头都计算attention alignment,选一个focus fate最大的作为对齐序列;
这里把注意力对齐效果好坏(对齐结果越接近对角线越好) 用focus rate $F$来表示:$$F=\frac{1}{S} \sum_{s=1}^S \max {1 \leq t \leq T} a{s, t}$$
其中,$S$是标签谱的时长,$T$是音素的时长,$\alpha_{s,t}$ 是注意力矩阵里第$s$行(谱),第$t$列(音素)的元素;注意力矩阵横坐标是decoder的谱(帧),纵坐标是encoder的音素序列,每次遍历音素序列,找到第s帧对应注意力最大值的音素,认为是该帧的音素,然后遍历所有帧,就能得到每一帧对应的音素,以及平均注意力值,叫做focus rate;(理想情况,一般在注意力矩阵作图看上去像对角线)
得到attention alignments之后,可以通过抽取每个音素的时长 $d_i=\sum_{s=1}^S[\arg \max_t\alpha_{s,t}=i]$,因此得知音素序列持续时长 phoneme duration sequence $$\mathcal{D}=[d_1,d_2,…,d_n]$$ 。一个音素的持续时间是根据上述步骤中选择的注意头关注到它的mel-谱图的数量。
loss function
loss1:预测的时长和教师target的时长之间的mse loss;
loss2:mel谱的,是教师模型(teacher模型)预测的mel谱作为fastspech模型(student模型)的target;(模型蒸馏)
实验
todo
总结
用了很特别的方法来解决文本和音频长度不匹配的问题,不是用自回归的,也许我们可能可以想到用一个时长预测器,来复制特征以扩大特征长度,但是用attention来对齐获得时长的方法还是比较巧妙。FastSpeech最巧妙的是时长预测器,我们不知道音素实际时长groundtruth,可能可以通过识别方法获得,但是文章采用的是一个attention-based的合成模型获得,去学习音素和谱的时长关系,然后直接把特征复制几份,扩展特征长度了;
==Ren, Yi, et al. “Fastspeech 2: Fast and high-quality end-to-end text to speech.” arXiv preprint arXiv:2006.04558 (2020).==citations:481 浙大和微软
- 解决什么问题
- 解决one-to-many mapping问题中存在的问题;
- 自回归TTS唯一的输入信息是文本,这不足以完全预测语音中的方差。在这种情况下,模型容易对训练集中目标语音的变化进行过拟合,导致泛化能力较差。(语音太复杂 变化,只输入文本容易过拟合)
- 用了什么方法
- 提出fastspeech2模型,直接用ground-truth目标训练时长模型(fastspeech1是用教师模型);
- 不仅只预测时长duration(时长预测器),还训练了pitch 预测器、energy预测器。推理时,模型预测出波形的duration、pitch、energy,使得生成的语音波形更真实;
- 提出fastspeech 2s模块,训练中有一个分支是直接输出波形的,(不使用mel-谱图作为中间输出),在推理中直接从文本生成语音波形,推理延迟低。
- 效果如何
- 通过简化训练pipeline,训练比fastspeech快三倍;推理比fastspeech更快;
- 音质超过fastspeech、也超过自回归方法的合成模型;
- 解决了TTS中的一对多映射问题,实现了更好的语音质量;
- fastspeech 2s 更进一步简化推理pipeline,直接从text产生waveform;
- 存在什么问题
- 音素的持续时长groundtruth来自识别强制对齐,这基于一个已训练好的识别模型,因此还要先训练一个识别模型(或者用预训练模型);
模型结构
总体结构很简单,输入是音素序列,做embedding,然后encoder抽取高级特征,经过提取不同特征的模块variance adaptor,于positional encoding相加,经过decoder,输出波形和mel谱;
输出不仅输出mel谱,同时也送入waveform decoder输出波形,这个模块称为FastSpeech 2s,在推理阶段就直接用这里的输出波形,使得合成速度很快,推理延迟低;
/image-20221110112621377.png)
Encoder
feed-forward Transformer block,就是self-attention和1D-conv的结构堆好几层;
Variance adaptor
由duration predictor、pitch predictor、energy predictor组成,对input分别抽取三类信息,然后再特征相加,相当于把input分离出它的某些特征分量,重视了这些特征,然后得到一个很容易就能起作用的特征,相当于人为帮带有冗余信息的input提了有用的稀疏特征;
PS. 文章虽然只用了这三种特征,但提到将来的研究中可以用其他的特征,比如emotion、style、speaker。
variance adaptor中的每个predictor都是由2层1维卷积、relu激活、layer norm dropout组成的;
duration predictor
音素持续时长的标签来自于强制对齐(识别方法)(Montreal forced alignment (MFA) (McAuliffe et al., 2017) ),这比用attention map得到的更准;
输出是log域的音素时长序列;
MSE loss;
pitch predictor
prosody中pitch特征很重要,考虑到时间轴一长,pitch变化很大,使用连续小波变换(continuous wavelet transform (CWT) )将pitch轮廓转换为pitch谱图(Suni et al., 2013; Hirose & Tao, 2015) ,并且在频域里预测(之前的方法是直接预测pitch包络,但是预测出来的和groundtruth区别很大);
输出pitch spectrogram;
MSE loss;
推理时,pitch predictor预测出pitch spectrogram,再利用连续小波反变换(iCWT)将其进一步转换回pitch包络。
pitch值:训练和推理过程中的groundtruth、predict的pitch $F_0$特征都要进行量化,量化到256个可能的数值(8bit表示?),该pitch值再embedding成向量vector $v$,然后加到之前特征里;
Energy Predictor
逐帧进行快速傅里叶变换STFT,求功率(模方),L2-norm , 量化到256个可能的值,再embedding成向量vector $e$,然后加到之前特征里;
注意,predictor输出是未量化的功率!然后才对输出进行量化的;
MSE loss;
FASTSPEECH 2S
直接预测waveform会遇到几个问题:
- 波形比mel谱包含更多变化的信息(比如phase),输出信息量越多,只凭简单的输入想要预测该输出就更难;
- 每帧的波形向量很大,如果波形一长的话,输出矩阵就很大,很难训练,因此一般就只训练音频片段,但是这样会失去一些上下文关系;
本文提出的解决方法:
- 因为相位很难预测,因此要用更难一点的训练方法,本文用的在waveform decoder中引入对抗训练,(Yamamoto et al., 2020).
- 利用同一个模型预测的mel谱作为输入;??
waveform decoder结构
类似wavenet,非因果卷积、gate激活;
输入是短音频片段,上采样为和输出一样长的音频片段(通过一维卷积上采样),输出是groundtruth音频片段;
对抗网络中的判别器discriminator 的结构和Parallel WaveGAN(Yamamoto et al., 2020) 一样,包含10层的非因果空洞1维卷积,leaky relu激活;
loss是multi-resolution STFT 和 LSGAN discriminator loss;
推理阶段不需要mel谱,只使用waveform decoder来合成波形;
MODELING PITCH WITH CONTINUOUS WAVELET TRANSFORM
公式的目的是得到pitch谱,这个pitch谱才是我们想要的特征,也就是pitch提取器的输出groundtruth,和预测的对象;
因此我们有了pitch包络,先变换到pitch谱,作为pitch特征;
具体计算公式如下:
给一个连续pitch包络函数 $F_0$ ,用(Tuteur, 1988; Grossmann & Morlet, 1984)转换成pitch谱 $W(\tau,t)$:
$$
W(\tau,t)=\tau^{-1/2}\int_{-\infty}^{+\infty}F_0(x)\psi(\frac{x-t}{\tau})dx
$$
其中,$\psi$ 是Mexican hat mother wavelet,$F_0(x)$是位置$x$的pitch值(位置?),$\tau$ 是wavelet的scale,$t$ 是wavelet的position(第 $t$ 帧);
而原始的pitch包络也能从pitch谱中恢复(通过inverse continuous wavelet transform (iCWT)),他们是可以互相转换的;
$$
F_0(t)=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}W(\tau,t)\tau^{-5/2}\psi(\frac{x-t}{\tau}) dxd\tau
$$
(不知道这公式怎么来的,先不管?)
假设把$F_0$分解为10个scales,
/image-20221116162902354.png)
实现过程
https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder
使用PyWorldVocoder提取pitch包络,但先做一些预处理工作:
- 由于CWT算法对不连续信号很敏感,因此先对清音(unvoiced)(没有pitch的)帧进行线性插值,插出pitch来;
- 对提取的pitch包络转到log域;
- 对每个句子归一化到 $\mu=0,\delta=1$,保留原始均值方差,为了重建pitch 包络;
- 用CWT公式把归一化的pitch包络变换到pitch谱,作为groundtruth;
训练阶段,pitch predictor预测的是pitch谱和pitch包络的均值方差,整个pitch模块输入给下一个模块的是groundtruth的pitch包络;pitch谱来自于groundtruth的pitch包络通过CWT得到;
推理阶段,pitch predictor预测了pitch谱和pitch包络的均值方差后,通过iCWT转换为pitch包络,作为下一个模块的输入特征之一;
/image-20221116155025671.png)
实验
TODO
总结
核心在于用了一些“物理”特征,先验地认为这几个物理量和合成效果最相关,然后训练这几个物理量的生成器,结果产生了很不错的效果;说明合成也许就和这几个物理量最相关,这几个物理量生成得好,合成效果自然就好;
这几个物理量和合成最相关也许之前的研究者也很清楚,但是都没怎么用到,输入的只有文本,标签只有音频,让模型自己训,fastspeech2有点像是减轻模型工作量的思路,减轻模型训练的难度,先提取一些分别的物理量,让模型去训练,各个模块都有点分开的意思,再得到一个总体的模型;
因此,从这个角度出发,如果能找到这几个物理量哪些性质对于合成韵律最重要,进一步抽取这些性质,也许能进一步减轻模型训练的难度;比方说pitch的变化大?短时周期性?等等,看看哪一个性质对韵律影响最大,进一步分别抽取,也许能合成出更好的音质;
直接生成waveform的结构也比较巧妙,考虑到waveform很难预测好,输入不是像其他预测器一样只用来自文本的特征(或者说encoder),而是用的预测的mel谱作为特征;并且因为很难预测好,没有用简单的结构+mseloss,而是用了GAN的训练策略;
思考
合成是一个一对多的过程,输入(文本)相比于输出(变化的音频)来说很简单,在这种输入输出复杂度不对等的前提下,思考如何设计模型这个问题,可以转化成思考如何缩小输入和输出之间的gap这个问题;问题解决方法之一是输出太复杂了,那把输出特征多利用一点,多榨干一点,音频重要的特征全都分解出来,让输入一一去拟合它们,有点化简(文本特征)为繁(多个特征)的意思;有点欠拟合的意思?需要从输入增加特征,才能把模型训练好;
而识别,是一个多对一的过程,和合成反过来,输入很复杂,输出很简单,于是也有一个输入输出之间存在gap的问题,因此是不是可以把输入删掉一些特征,不要那么多输入特征信息,从而减少这个gap(特征工程来删除冗余特征);或者说输入分解很多个特征,让输出一一拟合他们;所以识别模型容易过拟合?所以识别模型可以往简单地靠,可能参数量越多层数越多反而效果越不好?