文章目录

  • 1. Related Work
  • 1.1. Alignment Estimation between Text and Speech
  • 1.2. Text-to-Speech Models
  • 1.3. Flow-based Generative Models
  • 2. GLOW-TTS
  • 2.1. Training and Inference Procedures
  • 2.2. Monotonic Alignment Search



Glow-TTS: A Generative Flow for Text-to-Speech via Monotonic Alignment Search


来源:NeurIPS 2020


单位:Kakao Enterprise


最近TTS的模型如fastspeech或ParaNet,都是以并行方式产生mel谱。尽管可以并行,但是这些模型在训练时需要一个额外的TTS模型产生对齐(或者采用识别的强制对齐)。本文利用了flow和动态规划,提出了Glow-TTS, 能够自己产生文本和mel谱之间的单调的对齐,不需要借助额外的模型产生对齐。本文采用的强制单调对齐的方法增强了TTS的鲁棒性,由于是基于flow的方法提升了合成的速度。与自回归的模型Tacotron2相比,Glow-TTS实现了一个数量级的加速,并且合成效果与Tacotron2相当。

开源代码链接:glow-tts

1. Related Work

1.1. Alignment Estimation between Text and Speech

首先是文本和语音的对齐问题。传统的方法通过HMM估计文本和语音的对齐。在语音识别中,也可以通过CTC得到文本和语音之间的对齐。这两种方法都可以通过前向后向算法(用到了动态规划)得到文本和语音之间的对齐。本文也引入了一个相似的动态规划的方法得到文本域语音之间的对齐,与CTC不同的是本文的对齐方法是生成性的方法(CTC是区分性的),与HMM不同的是,本文的方法可以并行地对序列采样,并且没有观察之间的条件独立假设。

1.2. Text-to-Speech Models

最近,一些工作尝试并行地生成MEL谱,如Fastspeech、ParaNet,显著地加速了自回归的TTS模型。然而这些并行化的TTS model都需要用事先训好的自回归模型提取语音和文本之间的对齐。本文的方法不需要这样一个额外模型去做预对齐。

1.3. Flow-based Generative Models

Flow-based Generative Model是生成模型的一种flow-based geneative model。和本文工作同期的TTS模型还有AlignTTS, Flowtron , and Flow-TTS,其中AlignTTS和Flow-TTS不需要额外的对齐模型,Flowtron是一个flow based的模型,AlignTTS不是Flow-based模型(是基于Transformer encoder的结构,也可以并行产生MEL谱,不需要自回归的过程),Flowtron和FlowTTS使用了soft attention(不能保证单调性),本文提出的方法既利用了hard monotonic alignment有利用了generativate flow,分别结合了二者在鲁棒性和可控性的优势。

2. GLOW-TTS

2.1. Training and Inference Procedures

android TextToSpeech 如何使用_机器学习表示MEL谱,android TextToSpeech 如何使用_机器学习_02表示文本序列,Glow-TTS对android TextToSpeech 如何使用_sed_03建模,首先将条件先验分布android TextToSpeech 如何使用_深度学习_04通过flow-based的decoder建模android TextToSpeech 如何使用_人工智能_05,可以计算Glow-based的生成模型的log-likelihood为:

android TextToSpeech 如何使用_机器学习_06

右项是一个与模型参数相关的量,现在看左项。

假设网络的分布由参数android TextToSpeech 如何使用_人工智能_07刻画,对齐函数android TextToSpeech 如何使用_深度学习_08android TextToSpeech 如何使用_Text_09是isotropic multivariate Gaussian distribution,刻画分布的android TextToSpeech 如何使用_Text_10 and android TextToSpeech 如何使用_sed_11由encoder android TextToSpeech 如何使用_机器学习_12得到。Encoder将text android TextToSpeech 如何使用_sed_13映射到统计量android TextToSpeech 如何使用_人工智能_14android TextToSpeech 如何使用_机器学习_15, android TextToSpeech 如何使用_sed_16表示文本的长度。对齐矩阵android TextToSpeech 如何使用_深度学习_08中的元素android TextToSpeech 如何使用_sed_18 if android TextToSpeech 如何使用_Text_19,表示第android TextToSpeech 如何使用_机器学习_20帧MEL谱对齐到了第android TextToSpeech 如何使用_深度学习_21个文本上。那么左项还可以写为:

android TextToSpeech 如何使用_深度学习_22

android TextToSpeech 如何使用_机器学习_23表示MEL谱的长度。我们的学习目标是找到参数android TextToSpeech 如何使用_人工智能_07和对齐android TextToSpeech 如何使用_深度学习_08, 使得log-likelihood最大。将这个复杂的问题分成两步:1)根据现有的参数android TextToSpeech 如何使用_人工智能_07搜索最可能的单调的对齐android TextToSpeech 如何使用_Text_27,如下公式4。2)通过最大化android TextToSpeech 如何使用_人工智能_28更新参数android TextToSpeech 如何使用_人工智能_07,如下公式3,这两个步骤迭代进行(本质上是一个EM过程)。在每个训练步,首先推断出android TextToSpeech 如何使用_Text_27,然后通过梯度下降法更新android TextToSpeech 如何使用_人工智能_07。计算对齐的过程中,采用了Viterbi算法,找到最可能的对齐的最大log-likelihood。这样的过程虽然不能保证得到下式的全局最优解,但是可以不断优化log-likelihood的下界。

android TextToSpeech 如何使用_深度学习_32

android TextToSpeech 如何使用_sed_33

在inference阶段,也同fastspeech一样引入了一个Duration预测模型,这个Duration预测模型接在encoder的顶层,训练时采用MSE loss,为了防止Duration预测的梯度影响log likelihood的计算,禁止Duartion预测部分的梯度传到encoder,如公式5、6所示。

android TextToSpeech 如何使用_深度学习_34

android TextToSpeech 如何使用_sed_35

其训练过程的流程图如下图所示,现根据目前网络的参数估计一个android TextToSpeech 如何使用_机器学习_36,根据这个android TextToSpeech 如何使用_机器学习_36得到android TextToSpeech 如何使用_人工智能_38,并得到decoder 的输出,根据 Log-likelihood最大原则,更新decoder部分的参数,并更新了android TextToSpeech 如何使用_人工智能_38,反推A*,更新android TextToSpeech 如何使用_Text_10,android TextToSpeech 如何使用_sed_11,从而梯度可以传到encoder部分。

android TextToSpeech 如何使用_Text_42


其 inference 时的流程图,如下图所示,通过 Duration 模块对时长的预测,将 encoder 的输出进行扩展,扩展为android TextToSpeech 如何使用_人工智能_38,然后通过 glow-based 生成模型,生成 MEL 谱。

android TextToSpeech 如何使用_人工智能_44

2.2. Monotonic Alignment Search

单向的对齐如图所示,即隐式表达android TextToSpeech 如何使用_Text_45对齐文本android TextToSpeech 如何使用_Text_46,那么android TextToSpeech 如何使用_人工智能_47只能对齐到android TextToSpeech 如何使用_Text_46或者android TextToSpeech 如何使用_深度学习_49(不会对齐到android TextToSpeech 如何使用_人工智能_50是因为单调性,不会对齐到android TextToSpeech 如何使用_机器学习_51的位置是因为不允许skip)

android TextToSpeech 如何使用_Text_52


那么单向的对齐android TextToSpeech 如何使用_机器学习_53如何计算呢?这里借助了android TextToSpeech 如何使用_Text_54矩阵。android TextToSpeech 如何使用_深度学习_55表示隐式表达android TextToSpeech 如何使用_Text_45对齐文本android TextToSpeech 如何使用_Text_46的最大似然概率。由于其单调性和不允许skip的特性,android TextToSpeech 如何使用_机器学习_58可以通过其android TextToSpeech 如何使用_机器学习_59android TextToSpeech 如何使用_深度学习_60以及android TextToSpeech 如何使用_Text_45, android TextToSpeech 如何使用_深度学习_62计算得到。计算过程如公示7所示。

android TextToSpeech 如何使用_Text_63

android TextToSpeech 如何使用_Text_54矩阵计算过程就是一个动态规划的过程,如下图所示。

android TextToSpeech 如何使用_深度学习_65


计算完android TextToSpeech 如何使用_Text_54之后,回溯得到最大Log-likelihood的路径,即得到对齐android TextToSpeech 如何使用_机器学习_53