端到端合成论文——声学模型——FastSpeech

端到端合成论文——声学模型——FastSpeech

==Ren, Yi, et al. “Fastspeech: Fast, robust and controllable text to speech.” Advances in Neural Information Processing Systems 32 (2019).==citations:575 浙大和微软

github:https://github.com/ming024/FastSpeech2

试听音频:https://speechresearch.github.io/fastspeech/

  • 解决什么问题

    相比于拼接和统计参数的合成方法,神经网络的端到端合成方法的有几个问题:

      1. 推理过程中mel谱生成的速度慢,这是因为mel谱产生是自回归方式;
      1. 合成语音不够鲁棒(一些词会跳读、重复读),这是因为error会传播、text和语音之间错误的attention alignments;
      1. 缺少可控性(语速控制或韵律控制),这是因为自回归的方法一帧帧生成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]$$ ,

  1. 在没有加速减速(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]$$;

  2. 在减速(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]$$;

  3. 在加速(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的时长;

标签时长来自于自回归的教师模型;

  1. 首先先训练一个自回归的encoder-attention-decoder TTS模型

  2. 得到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;(理想情况,一般在注意力矩阵作图看上去像对角线)

  3. 得到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 浙大和微软

试听音频:https://speechresearch.github.io/fastspeech2

  • 解决什么问题
    • 解决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

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会遇到几个问题:

  1. 波形比mel谱包含更多变化的信息(比如phase),输出信息量越多,只凭简单的输入想要预测该输出就更难;
  2. 每帧的波形向量很大,如果波形一长的话,输出矩阵就很大,很难训练,因此一般就只训练音频片段,但是这样会失去一些上下文关系;

本文提出的解决方法:

  1. 因为相位很难预测,因此要用更难一点的训练方法,本文用的在waveform decoder中引入对抗训练,(Yamamoto et al., 2020).
  2. 利用同一个模型预测的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

实现过程

https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

使用PyWorldVocoder提取pitch包络,但先做一些预处理工作:

  1. 由于CWT算法对不连续信号很敏感,因此先对清音(unvoiced)(没有pitch的)帧进行线性插值,插出pitch来;
  2. 对提取的pitch包络转到log域;
  3. 对每个句子归一化到 $\mu=0,\delta=1$,保留原始均值方差,为了重建pitch 包络;
  4. 用CWT公式把归一化的pitch包络变换到pitch谱,作为groundtruth;

训练阶段,pitch predictor预测的是pitch谱和pitch包络的均值方差,整个pitch模块输入给下一个模块的是groundtruth的pitch包络;pitch谱来自于groundtruth的pitch包络通过CWT得到;

推理阶段,pitch predictor预测了pitch谱和pitch包络的均值方差后,通过iCWT转换为pitch包络,作为下一个模块的输入特征之一;

image-20221116155025671

实验

TODO

总结

核心在于用了一些“物理”特征,先验地认为这几个物理量和合成效果最相关,然后训练这几个物理量的生成器,结果产生了很不错的效果;说明合成也许就和这几个物理量最相关,这几个物理量生成得好,合成效果自然就好;

这几个物理量和合成最相关也许之前的研究者也很清楚,但是都没怎么用到,输入的只有文本,标签只有音频,让模型自己训,fastspeech2有点像是减轻模型工作量的思路,减轻模型训练的难度,先提取一些分别的物理量,让模型去训练,各个模块都有点分开的意思,再得到一个总体的模型;

因此,从这个角度出发,如果能找到这几个物理量哪些性质对于合成韵律最重要,进一步抽取这些性质,也许能进一步减轻模型训练的难度;比方说pitch的变化大?短时周期性?等等,看看哪一个性质对韵律影响最大,进一步分别抽取,也许能合成出更好的音质;

直接生成waveform的结构也比较巧妙,考虑到waveform很难预测好,输入不是像其他预测器一样只用来自文本的特征(或者说encoder),而是用的预测的mel谱作为特征;并且因为很难预测好,没有用简单的结构+mseloss,而是用了GAN的训练策略;

思考

合成是一个一对多的过程,输入(文本)相比于输出(变化的音频)来说很简单,在这种输入输出复杂度不对等的前提下,思考如何设计模型这个问题,可以转化成思考如何缩小输入和输出之间的gap这个问题;问题解决方法之一是输出太复杂了,那把输出特征多利用一点,多榨干一点,音频重要的特征全都分解出来,让输入一一去拟合它们,有点化简(文本特征)为繁(多个特征)的意思;有点欠拟合的意思?需要从输入增加特征,才能把模型训练好;

而识别,是一个多对一的过程,和合成反过来,输入很复杂,输出很简单,于是也有一个输入输出之间存在gap的问题,因此是不是可以把输入删掉一些特征,不要那么多输入特征信息,从而减少这个gap(特征工程来删除冗余特征);或者说输入分解很多个特征,让输出一一拟合他们;所以识别模型容易过拟合?所以识别模型可以往简单地靠,可能参数量越多层数越多反而效果越不好?