Press "Enter" to skip to content

长文回顾 | 微软亚洲研究院主管研究员谭旭:低资源场景下的文本到语音合成

 

分享嘉宾:微软亚洲研究院主管研究员 谭旭

 

感谢整理人:Datafun 社区 Hoh Xil

 

基于神经网络端到端的文本到语音合成 (TTS, Text to Speech)在近年来发展迅速,受到了学术界和工业界的广泛关注。然而,数据和计算资源往往制约着TTS在实际场景中的广泛应用,如何构建 低资源场景下 的TTS系统是一个难题。

 

 

本次分享的提纲:

 

TTS(Text to Speech)背景知识,包括TTS系统的组成以及在低资源场景下TTS面临的挑战。

 

低资源场景下TTS的3块工作:FastSpeech(快速语音合成系统)、LightTTS(低数据资源下的语音合成系统)、LightBERT(TTS前端的轻量级解决方案)。

 

最后和大家探讨下,在低资源场景下还有哪些值得被解决的问题。

 

一. 背景知识

 

1. Text to Speech

 

 

首先,介绍的是TTS的背景,TTS任务的本身就是基于文本来合成声音,通俗讲就是让机器说人类的语音。TTS在整个语音及人工智能行业有着非常重要的应用:

 

语音交互:语音助手、智能音箱

 

阅读教育:有声读物、语言教育

 

语音翻译:国际会议、电话会议、旅游翻译机

 

泛娱乐:AI电话、AI主播、AI唱歌

 

TTS在微软:

 

Azure语音云服务,集成了语音相关的大部分解决方案,包括语音识别、语音合成、语音翻译、定制化的语音服务等;

 

微软的Windows、office、小冰、小娜等产品;

 

微软还支持数十种语言和地区的TTS服务。

 

2. TTS系统构成

 

 

TTS系统的构成主要分为3个部分:TTS Frontend(TTS前端)、AcousticModel(声学模型)、Vocoder(声码器)。

 

我们的TTS系统主要是基于近年来发展迅速的神经网络端到端的语音合成系统。这里没有涉及传统的参数法或者拼接法以及基于神经网络的参数法,因为学术界和工业界都在从传统的方法转到基于端到端的神经网络模型。最近学术界也有些更极端的做法,比如完全舍弃了TTS前端,直接把语音的文本作为输入,或者把声码器部分和声学模型部分集成在一起进行端到端的训练。这样的一些前沿的研究探索还没有在工业界得到广泛的应用,所以我们本次的分享,还是基于工业界和学术界广泛认可和接受的合成系统。

 

首先,TTS前端的主要功能就是给定一个文本生产它的发音信息及语言学信息,声学模型基于上述的信息生成声学对应的特征,这里用的比较多的特征是梅尔频谱,然后声码器部分基于生成的声学特征作为条件信息来合成最后的语音波形图。

 

接下来介绍下每个模块,都有哪些特定的任务:

 

① TTS前端

 

前端的主要功能是从文本信息产生发音和语言学的信息,其任务包括:

 

Text Normalization(文本归一化),在语音合成中常见的文字很多是简写或者缩写的,需要把这些文字标准化。如Sep.11th需要展成全写的September Eleventh,方便后面进行语言学分析,

 

Grapheme-to-Phoneme(字形转音形),比如speech是这个文本的字形,需要先把它转化成音素s p iy ch,也就是发音信息,方便后面的声学模型更准确的知道这个文本发什幺样的音。

 

Polyphone Classification(多音字分类),很多语言中都有多音字的现象,比如模型和模样,这里的模字就发不同的音。所以在输入一个句子的时候,前端就需要准确判断出这个字的发音,否则后端的声学模型可能会发音不准。

 

Prosody Prediction(break,rising-fallingtone),还有些任务是对韵律进行预测,包括句子中词与词之间的停顿或者句子整体的升降调信息。如:革命胜利后,又经受了一次次政治风浪的考验,如果停顿信息不准确就会出现:革命胜利后,又经受了一次  次 政治风浪的考验,在一次次的地方有一个停顿,这是不该有的,会导致语音合成的信息不自然,如果再严重点可能会影响语音信息的传达。

 

这就是整个前端所涉及到的任务,更多的是涉及NLP的知识。

 

② 声学模型

 

 

声学模型主要是基于前端产生的发音信息或者语言学信息来产生声学的特征,前端的信息其实是可以简化的,甚至不用前端的信息,可以直接用字符作为输入或者简单点用音素做为输入,或者更复杂的,我们可以设计出成百上千维的ID Feature来作为输入。输出的声学特征,目前TTS用的比较多的是梅尔频谱图。声学模型主要包括的模型有:

 

Tacotron 1/2

 

Deep Voice 1/2/3

 

Transformer TTS

 

FastSpeech, LightTTS(本次会重点介绍)

 

在声学模型这部分,既涉及到NLP的知识,也涉及到Speech的知识。

 

③ 声码器

 

 

声码器的主要作用是基于声学模型生成的声学特征来合成最后声音的波形图。常用的声码器有:

 

Griffin-Lim

 

WORLD/STRAIGHT

 

WaveNet/Parallel WaveNet

 

WaveGlow/FloWaveNet

 

WaveRNN/LPCNet

 

Vocoder部分更多涉及到的是语音的知识,如信号处理等相关的知识。

 

3. 低资源

 

 

什幺是资源?资源就是进行生产时所用到的资料,在人工智能行业通常用到的生产资料包括:数据、计算力、人、资本、平台,更具体的,在做人工智能模型或者系统用到的资源为数据资源和计算资源。所以,低资源主要指低数据资源和低计算资源。

 

我们可以定义下低资源学习的目标:在生产资料(数据和计算资源)匮乏的条件下,达到同样或者近似的生产力(生产力:模型或系统的精度或者深度达到某种要求)。

 

4. TTS中涉及的资源

 

 

数据资源:

 

需要高质量的录音数据,其获取成本比一般的语音识别任务所需录音数据高。

 

训练声学模型需要文本和语音配对数据。

 

在做TTS前端模型时,需要很多相关的数据,如文本归一化所用到的规则或者模型、字形转音形的配对数据作为发音的词典或训练模型、以及多音字的数据或者语句停顿、韵律、升降调的标注信息。

 

计算资源 :常见的就是CPU和GPU。

 

离线模型训练

 

在线的serving和inference资源,要求能提供高速或者低延迟的TTS服务,所以计算能力必须足够强,考虑到价格成本的因素,通常线上资源比较匮乏。在有限的计算资源条件下,如何提高TTS模型在线的inference速度,是低计算资源这部分要考虑的核心问题之一。

 

介绍完资源以后,我们看看本次分享涉及到哪些低资源问题:

 

数据资源中的文本和音频配对数据不足的问题

 

计算资源中在线serving和inference计算资源不足的问题,我们要提高它的inference速度。

 

5. TTS低资源工作

 

 

具体的工作包括:

 

FastSpeech:这是一个快速的、轻量级的语音合成系统,能够并行的产生声学特征,所以主要是为了应对低计算资源问题。这个工作今年被NeurlPS 2019接收。

 

LightTTS:在低配对资源情况下,构建TTS系统,来解决低数据资源的问题。这个工作今年被ICML 2019接收。

 

LightBERT for TTS frontend:构建了TTS轻量级的前端模型,能够在线上做快速的inference,也是为了解决在线的低计算资源问题。

 

二. FastSpeech:

 

Fast,Robustand Controllable Text to Speech

 

1. Motivation

 

 

首先了解下FastSpeech面临的问题背景。基于神经网络端到端的TTS已经比传统的拼接法或者参数法都显示出更强的特性。主流的模型包括:Emphasis、Tacotron、Deep Voice、Transformer等。这些模型比较类似的还是用的传统的自回归模型来生成声学特征。

 

这些模型面临的主要问题有:

 

Inference 的速度很慢,如一个几秒的语音在梅尔频谱的帧数上大概几百帧,如果用自回归来生成梅尔频谱,整个生成速度会非常慢。

 

不鲁棒,传统的模型很多都在用encoder-attenion-decoder的结构,TTS中常遇到的就是重复字和漏字的问题,很大部分原因是由于attention机制导致的整个语音不鲁棒。

 

很难控制语音的速度,由于大部分模型都是自回归模型,很难控制语音合成的速度和韵律。

 

 

TTS在线服务时:

 

目前的自回归模型在在线声学特征生成时,还不能达到实时的生成速度。如1s的语音,在比较贵的GPU显卡的情况下,可能还要花费超过1s的时间来合成。

 

用比好的GPU显卡做在线服务成本比较昂贵。

 

提出的这些问题,也就是对我们的要求:

 

用更便宜的GPU或者CPU做服务,来节省成本。

 

提高语音合成速度。

 

合成的语音具有很强的鲁棒性和可控性。

 

整体的生成质量不能有损失。

 

2. 我们的解决方案:FastSpeech

 

 

核心提升点:

 

并行的生成梅尔频谱,可以极大的加速声学特征的生成。

 

考虑鲁棒性,去除了文本和语音之间对齐的attention机制。

 

抛弃传统的encoder-attention-decoder架构,采用前馈的transformer网络,用长度调节器来调节输入文本的sequence和梅尔sequence长度不匹配的问题,同时长度调节器还有一个副产品,可以控制语音的速度和韵律等。

 

FastSpeech的优势:

 

快:梅尔频谱的合成速度比自回归快270倍,同时,加上额外的vocoder来合成语音,有38倍的加速。

 

鲁棒性:FastSpeech几乎没有bed case,也就是没有重复字和漏字的问题,我们在大规模的测试集上验证了这个功能。

 

可控性:可以控制语音的速度和韵律信息。

 

声音质量:能达到传统的SOTA模型甚至更好。

 

3. Framework:Feed-Forward Transformer

 

 

前馈Transformer网络以phoneme sequence作为输入,以梅尔频谱的声学特征作为输出。整个模型是并行的训练和inference,产生梅尔频谱声学特征之后,再外接一个vocoder来合成最后的语音。

 

Feed-Forward模块在Phoneme端和Mel端都有各自N x FFT Block,这个Block其实就是一个非线性的模块,FFT是Feed-Forward Transformer的缩写,然后在二者之间有一个长度调节器LengthRegulator,主要用来解决phoneme sequence和mel sequence长度不匹配的问题,这就是整个FFT的模型的框架。

 

① FFT block

 

 

FFT block和传统的Transformer中block比较类似,包括Multi-Head Attention以及非线性的计算,在speech问题上把dense connection换成了1D的卷积网络来计算非线性。同时,在Phoneme端和Mel端share了同样的模型结构,只是参数不共享。

 

② Length Regulator

 

 

长度调节器是FastSpeech比较核心的模块,这个长度调节器以Phoneme端的FFT Block输出的hidden sequence(代表了每个Phoneme的hidden sequence)作为输入,对每个hidden(也就每个Phoneme)预测一个Duration,通过这个Duration预测模块,比如在上图中,我们对4个Phoneme输入,预测了 [2,2,3,1] 这个Duration,再根据Duration把相应的Phoneme展开,就得到了新的hidden sequence来作为mel端FFT Block的输入,它的长度和最终生成的mel长度是一样的。通过这个模块我们就解决了Phoneme和Mel sequence长度不匹配的问题。

 

同时,在展开Phoneme sequence时,我们引入了α(长度调节机制),如果α=1,它是一个正常的语音合成的长度,也就代表合成的语音的速度,如果我们想合成更快速的语音,我们可以把α调小一点,如上图右侧部分,把α调成0.5,那幺对应的Duration会降低1倍,这样它展开的Phoneme sequence就变成了一个很短的Speech发音,来实现更快速的发音;如果我们想要慢速的声音,可以把α调大,它展开的Phoneme sequence就变成了很长的Speech发音,来对应比较慢的语音。

 

我们可以看到,最核心的模块还是Duration预测期,因为Duration预测准了,后面展开的机制其实是一个确定的机制,很关键的一个点是DurationPredictor如何去预测。

 

③ Duration Predictor

 

 

Duration预测器的构成:

 

主要由几层1D的卷积网络构成,针对每一个Phoneme输出对应的Duration。其中一个核心的问题就是Duration label信息从哪来。

 

我们在FastSpeech中设计了一个自回归的teacher模型,teacher模型训练好之后把相应的Phoneme作为输入,然后再生成语音得到一个attention map,这个attention也就是在speech和text之间的attention。我们可以看对应每个Phoneme有多少连续的mel帧去attention(也就是注意到Phoneme上了),我们就可以认为这个连续帧的帧数就是这个Phoneme的Duration 信息,就是这个Phoneme应该发多少帧的梅尔频谱声音。通过这种方法,我们把Duration的信息抽取出来作为Duration Predictor预测的label信息,通过MSE Loss来训练这个Duration Predictor,Predictor是和FastSpeech模型端到端一起联合训练的。

 

 

这就是整个FastSpeech的模型结构。

 

4. 实验评估

 

① inference speedup

 

 

首先是inference speedup也就是梅尔频谱的生成速度加速的评估:

 

我们把FastSpeech和Transformer TTS进行了合成速度的比较,我们可以看到在V100单卡上有270倍的梅尔频谱合成速度的加速,如果进一步叠加一个vocoder,来合成最终的语音,最终的合成速度达到了38倍的提升。

 

这样就极大的了提高了在线的inference速度,满足了在线在极低的计算资源情况下,实现更快速度的语音合成。

 

② 鲁棒性

 

 

我们在50个句子的测试集上,测试了FastSpeech和Transformer TTS分别在重复字和漏字评测上的指标,我们可以看到FastSpeech没有重复字和漏字的问题。

 

③ 语音合成的质量

 

 

我们通过MOS评估,比较了一下传统的模型,包括Transformer TTS和Tacotron 2等的合成质量,可以看到合成质量是非常接近的。同时,我们在线下也做了更多的语言和speaker声音质量的评测,FastSpeech都可以match上传统的Transformer TTS和Tacotron 2语音合成的质量。大家可以从demo链接中听到更多声音合成的效果。

 

三. LightTTS

 

在很少的文本和语音的配对情况下来实现TTS系统,主要是为了满足低数据资源的要求。

 

1. Motivation

 

 

LightTTS的背景:

 

我们有很强的需求给世界上更多的语言配上TTS系统,目前全世界有6000+种语言,主流的TTS服务大概能覆盖几十种语言,还有很多的语言是没有提供TTS服务的。同时,这些语言尤其缺乏文本和语音配对的数据,且数据的标注成本非常高(保守估计,做一个新的语言,用最少的标注数据,标注成本也在10W美金以上)。

 

那幺,我们如果在有限的配对数据情况下构建一个高效的TTS系统?

 

——无标签数据(文本和语音)

 

我们利用了TTS和ASR(语音识别)任务之间的对偶特性,让它们在训练过程中通过unlabeled data媒介来互相提高、帮助,最终TTS和ASR都能达到不错的性能。

 

2. Method

 

 

我们的方法主要是:

 

Denoising auto-encoder(去噪自动编码器)

 

Back Transformation(和机器翻译中的反向翻译比较类似)

 

Bidirectional(双向的)sequence modeling

 

我们可以看下右边的模型结构图,这个模型的输入可以是语音,也可以是文本,同时输出可以是语音,也可以是文本。如果我们把语音作为输入,经过一个语音的encoder,再经过语音的decoder,就可以输出声音。各颜色箭头代表的含义如上图。下面详细介绍下各个模块:

 

① Denoising auto-encoder

 

 

Denoising auto-encoder基本上是根据语音来重建语音,根据文本来重建文本。同时,在语音或者文章输入的时候会加入一些噪声,来防止Denoising auto-encoder学到一些copy的信息。上图为Denoising auto-encoder在文本和语音上的示意图。

 

DAE模块的作用:

 

帮助模型理解语音和文本本身。

 

学会如何生成语音和文本。

 

这其实是一个典型的半监督或者无监督的训练,在没有标注或者配对数据的情况下,首先能构建起自己对语音或者文本的理解,包括understanding和generation。

 

② Back transformation

 

 

Back transformation是让TTS和ASR能够互相帮助的核心模块,上图简要示意了如何通过Back transformation让TTS来帮助ASR或者ASR来帮助TTS,我们以ASR帮助TTS为例:

 

首先,我们给定一个无标注的语音,通ASR生成对应的文本,在把生成的文本和原始的语音组成一个训练数据对来训练TTS,同理,可以利用无标签的文本,通过TTS合成语音,再通过语音和原始文本组成配对数据训练ASR。这样进行不断的迭代,就能从初始状态来逐渐的提升TTS或者ASR,来达到理想的性能。

 

③ Bidirectional sequence modeling

 

 

在序列生成中有一个常见的问题,就是error propagation错误传播,因为前面元素的错误,会影响后面元素的生成,在语音的序列尤其明显,因为语音的序列比文本或者其它的序列会长很多,一般单个语音的序列会有几百帧或者上千帧,由于error propagation生成的语音在后半部分的质量比前半部分的差,而Backtransformation会利用生成的语音继续学习另外一个模块,比如用ASR帮助训练TTS,如果ASR生成的文本在后端质量很差,再训练TTS,会导致后端部分依然很差,这会导致这个模型在处理sequence后半部分的能力不够强或者后半部分的质量很差。

 

因此,我们提出了双向的训练建模,其基本思想是:

 

把语音和文本,在模型中同时从左到右训练,以及从右到左训练。这样,模型不会总是后半部分差,也可能会前半部分差后半部分好,这样可以均衡模型的训练。

 

3. 实验评估

 

 

我们的方法是:

 

只用了200条的语音和文本数据以及无标注的语音和文本数据。

 

Baseline只用了200条的语音和文本配对训练处的模型。

 

同时,和supervised upper bound(采用12500条配对数据)做比较

 

我们可以看下左边的图,我们的方法在TTS中合成的MOS很接近supervised upper bound,baseline只用200条语音和文本数据训练出的模型几乎是不能产生能听懂的声音,所以MOS表示为0。

 

同理,右图为语音识别的效果,是简单通过音素的错误率来评判。

 

下图为简单的demo,大家可以打开链接或者扫描二维码,体验下。

 

 

四. LightBERT for TTS frontend

 

轻量级的TTS前端模型,主要解决在线的低计算资源的问题,这部分工作目前处于paper的submission阶段。

 

1. Motivation

 

 

近1~2年Pre-training和fine-tuning已经成了NLP学习新的范式,如:BERT、GPT-2、RoBERTa、MASS等,在很多低数据资源的下游任务中都能取得不错的效果。因为TTS前端很多的任务属于自然语言理解的任务,所以BERT很适合这样的任务,我们也用BERT在前端任务取得了非常好的效果,相比传统TTS前端模型在精度上有很大的提升。

 

然而,现在很多模型在线上的pre-trained 模型都非常大,线上实际使用时会导致inference时延特别高,不能满足当前的需求。上图为BERT在前端多音字分类任务上inference时间的情况。

 

在单核CPU的情况下,我们在线一般的时延要求是小于20~30ms。

 

2. LightBERT

 

 

所以,在线上资源有限的情况下,我们该如何提高inference时间?

 

直观的办法就是压缩BERT模型的大小,目前常用的方法是知识蒸馏,以前的任务中蒸馏的使用通常是在下游的任务中,我们发现,在pre-trained模型中也含有非常重要的信息,也可以在这个阶段做蒸馏。所以,我们提出了两阶段的知识蒸馏方法,来把预训练的大模型和fine-tune的大模型来蒸馏到小模型上。

 

具体的工作流程如上图:

 

首先,预训练一个大模型,然后把大模型fine-tune到下游的任务中,得到一个预训练和fine-tune的模型,接下来做知识蒸馏,首先预训练一个小模型,在小模型预训练的过程中,我们引入了大的预训练模型作为teacher模型,来做知识蒸馏把相应的知识传递给小模型,同时,等小模型预训练完以后,在下游任务fine-tune阶段同样使用fine-tune以后的大模型来进行知识蒸馏,这样经过两阶段的知识蒸馏,小模型在下游任务的Pre-train和fine-tune的精度就会变得很高,相比传统方法会有极大的提升。

 

3. LightPAFF

 

 

我们两阶段的框架,不仅仅适用于BERT模型,我们还做了更多的模型,包括大家常见的近几年比较火的模型。所以我们提出的是一个通用的框架LightPAFF。

 

LightPAFF(中文名:小泡芙)的全称是A lightweight Pre-training And Fine-tuning Framework:

 

支持大部分的Pre-training和Fine-tuning模型:如BERT,GPT/GPT-2,XLNet,RoBERTa,MASS,XLM,MTDNN,UniLM,ERNIE等。

 

支持不同的下游任务:如自然语言理解(BERT),languagemodeling/generation(GPT-2),seq2seq语言生成任务(MASS)等。

 

因此,针对LightPAFF框架,我们有不同的版本:如LightBERT,LightGPT,LightMASS等。

 

4. Results of LightBERT

 

 

我们还是主要评测下LightBERT在TTS前端任务的性能:包括Accuracy(精度)和latency(时延),这个任务是多音字的分类任务,我们比较的模型有LSTM、Transformer、Transformer(pre-train)、BERT-base、LightBERT。

 

可以看到,我们比原本的大模型参数量上减少了5倍,同时在多音字分类的任务上的精度可以match上原来的大模型,同时比之前的模型精度要高很多。

 

我们还做对两阶段的蒸馏做了分析,来看下每个阶段知识蒸馏的作用,结果可以看右边的表,两阶段都不用的效果是93.6%,只在pre-train阶段用蒸馏的效果是94.2%,最后在两阶段都采用知识蒸馏的效果是95.6%。

 

最后,在时延上,从原来250ms达到了23ms,满足了线上产品的需求。

 

五. Discussions

 

 

接下来,针对低资源场景下文本到语音的合成,下一步还有哪些可以解决或者值得被解决的问题:

 

首先,前面介绍的工作主要是在数据资源的文本和语音配对的低资源情况下,以及在计算资源中的online serving 和inference条件下做的工作。那幺在其他资源的场景下能不能做一些工作,如语音合成中需要高质量的recording,是否可以利用一些带有噪声的数据或者更多说话人的数据来做这件事情;或者在前端的TN规则,Grapheme 和phonemedata,韵律的停顿,prosody标注数据很少的情况下来实现比较好的前端模型性能,甚至不用前端模型。同时,在Offine training阶段能不能加速离线的训练。另外,在线服务阶段vocoder也是比较耗时的,是否可以做一些轻量级的vocoder进一步来提升TTS合成的实时性。

 

 

如何构建轻量级的vocoder:

 

进一步减小模型的大小,如WaveRNN。

 

从传统的信号处理中获取一些知识,如LPCNet。

 

把自回归的生成变成并行的生成,如Parallel WaveNet,WaveGlow,FloWaveNet,或者今年新提交的paper:WaveFlow和GAN-TTS等。

 

上述这些方案并不是既满足高的语音合成的精度,又满足线上很低的时延要求。我们是否还有一些新的思路来设计vocoder?

 

低数据资源TTS合成:

 

标签数据很贵

 

是否可以利用一些噪声的数据

 

或者multi-speaker数据来帮助TTS的训练

 

是否可以舍弃TTS前端模型,或者不需要那幺多的资源

 

致谢:

 

最后,感谢我们的团队成员,包括实习生、合作者、以及我的老板TaoQin和Tie-Yan Liu;同时,感谢将门的观众和将门提供的平台。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注