Fastspeech系列&MegaTTS1/2

Fastspeech2

前身—Fastspeech

首先说一下Fastspeech,Fastspeech是一种基于Transformer的端到端TTS。在当时传统的端到端TTS模型比如Tacotron2面临着许多问题:推理速度较慢;合成语音不鲁棒;缺乏可控性。所以Fastspeech的作者基于上述问题提出了一种基于transformer的非自回归的模型来并行地生成mel谱图,大大提高了合成速度。

Fastspeech的网络架构如图所示,整个流程:输入音素序列,将音素转换成embedding格式,然后经过N个FFT Block处理,处理后通过Length Regulator来预测音素对应的mel谱图长度,最后再经过N个FFT Block输出mel谱图。Fastspeech将一个大模块拆成两个小模块,一个模块去解决每个文本的发音时长,另一个模块根据文本以及文本预测时长去得到mel谱图。

各个模块的作用:

1.FFT Block:与transformer的编码器结构类似,每个 FFT 块都由一个自注意力和一维卷积网络组成,(用1D卷积代替了全连接),1D 卷积能够更好地捕捉输入序列中的局部模式和特征。与全连接层相比,它对相邻位置的元素有更强的关联感知能力。

2.length regulator:是用来解决FFT中音素和频谱图序列之间的长度不匹配问题,来控制语速和部分韵律。通过调整超参数a来控制语速,通过调整空格字符的持续时长来控制韵律。

3.duration predictor:音素持续时间预测对于长度调节器很重要。预测出这个值之后,我们才能去进行匹配音素和频谱序列之间的长度。此模块堆叠在音素侧的 FFT 块之上,如图 1d 所示,持续时间预测器由一个具有 ReLU 激活的 2 层 1D 卷积网络组成,每层之后都有层归一化和丢弃层,还有一个额外的线性层来输出一个标量,这正是预测的音素持续时间。训练后的持续时间预测器仅在 TTS 推理阶段使用,因为在训练中我们可以直接使用从自回归教师模型中提取的音素持续时间。

训练:FastSpeech模型的训练依赖于自回归教师模型进行时长预测(提供更多的信息作为输入)和知识蒸馏(简化输出中的数据分布),可以缓解TTS中的一对多映射问题(即多个语音变体对应同一个文本)。

Fastspeech2背景:

FastSpeech这个非自回归TTS模型合成语音的速度明显快于以前的自回归模型,且质量相当。但是FastSpeech有几个缺点:(1)师生蒸馏管道复杂且耗时;(2)从教师模型中提取的持续时间不够准确;(3)由于数据简化导致mel谱图信息丢失。这些都限制了语音质量。

FastSpeech 2是为了解决FastSpeech中的问题,通过:

1.直接用ground-truth目标训练模型,而不是教师的简化输出

2.引入更多的语音变化信息(如音高、能量和更准确的持续时间)作为条件输入,并在推理中使用预测值,更好地解决了TTS中的一对多映射问题。

Fastspeech2网络架构

总的来说,Fsatspeech2在encoder和decoder上采用了Fsatspeech相同的FFT结构。不同的是Fastspeech2使用了Variance Adaptor来代替了length regulator。整个工作流程就是:编码器将音素嵌入序列转换为音素隐藏序列,然后Variance Adaptor将诸如时长、音高和能量等不同的方差信息添加到隐藏序列中,最后梅尔频谱解码器并行地将经过适配的隐藏序列转换为梅尔频谱序列。

优化的创新点

(1)训练目标:Fastspeech2摒弃了从外部的自回归教师模型进行蒸馏获取预测的方式,直接用ground-truth梅尔谱图作为训练目标,提高了语音质量的上限。

(2)Variance Adaptor:利用Variance Adaptor将方差信息添加到隐藏序列中,Variance Adaptor是由时长预测器/音高预测器/能量预测器组成的。在训练中,我们将从录音中提取的时长、音高和能量的真实值作为输入添加到隐藏序列中,以预测目标语音。同时,我们使用时长、音高和能量的真实值作为目标来训练时长、音高和能量预测器,这些预测器在推理中用于合成目标语音。

a.时长预测器:时长预测器将音素隐藏序列作为输入,并预测每个音素的时长,这代表了这个音素对应多少个梅尔帧,并转换到对数域以方便预测。时长预测器使用均方误差(MSE)损失进行优化,将提取的时长作为训练目标。在 FastSpeech2使用蒙特利尔强制对齐(MFA)工具来提取音素时长,以提高对齐精度,从而减少模型输入和输出之间的信息差距。

MFA主要用于从语音的录音数据中提取诸如音素时长等信息,在语音相关研究和技术(如语音合成等)中,通过这种工具提取的标注数据(这里是音素的时长等标注)可以用于模型的训练和评估等,文中提到使用它来替代预训练的自回归TTS模型提取音素时长,目的是提高对齐精度,减少模型输入输出间的信息差距(因为直接用模型提取可能存在一定的偏差和不准确性等问题,而专门的对齐工具在这方面可能表现更好)

b.音高预测器:音高是传达情感的关键特征,能够极大地影响语音的韵律。为了更好地预测音高轮廓的变化,作者使用连续小波变换(CWT)将连续的音高序列分解为音高频谱图,并将音高频谱图作为音高预测器的训练目标,使用均方误差损失进行优化。在推理中,音高预测器预测音高频谱图,然后使用逆连续小波变换(iCWT)将其进一步转换回音高轮廓。为了在训练和推理中都将音高轮廓作为输入,作者将每一帧的音高 F0(分别为训练/推理的真实值/预测值)在对数尺度上量化为 256 个可能的值,并进一步将其转换为音高嵌入向量 p,并将其添加到扩展的隐藏序列中。

c.能量预测器:能量表示梅尔声谱图的帧级幅度,能够影响语音的音量和韵律。作者将每个短时傅里叶变换(STFT)帧的幅度的 L2 范数计算为能量。然后我们将每一帧的能量均匀量化为 256 个可能的值,将其编码为能量嵌入 e,并像音高一样将其添加到扩展的隐藏序列中。我们使用一个能量预测器来预测能量的原始值而不是量化值,并使用均方误差损失来优化能量预测器。

(3)text-to-waveform:作者提出了一个Fastspeech2s,利用waveform decoder直接生成波形。

对于文本到波形生成中的挑战,作者是这样应对的:

a.由于波形包含比梅尔频谱图更多的方差信息(例如,相位),输入和输出之间的信息差距比文本到频谱图生成中的更大。同时使用方差预测器来预测相位信息是有难度的。所以,作者在波形解码器中引入了对抗训练。使得波形解码器自己去隐性地恢复相位信息,而不是通过传统的预测方式。

b.由于极长的波形样本和有限的 GPU 内存,很难在对应于完整文本序列的音频片段上进行训练,这使得模型难以捕捉不同部分文本序列中音素之间的关系,从而损害了文本特征提取。 所以作者利用已有解码器辅助特征提取—— FastSpeech 2 的梅尔频谱解码器,因为这个解码器是基于完整的文本序列进行训练的,所以能够对文本特征的提取有所帮助。

如图(d)所示,波形解码器中做了一些特定的设计:

  • 波形解码器的结构基于 WaveNet,其中包含非因果卷积和门控激活。它以对应短音频片段的切片隐藏序列作为输入,并通过转置 1D 卷积将其上采样,使其长度与音频片段匹配。

  • 对抗训练中的判别器采用了与 Parallel WaveGAN 相同的结构,由十层带有泄漏 ReLU 激活函数的非因果扩张 1D 卷积组成。

  • 波形解码器通过多分辨率 STFT 损失和遵循 Parallel WaveGAN 的 LSGAN 判别器损失来进行优化。

在推理阶段,只使用波形解码器来合成语音音频,舍弃了梅尔频谱解码器。

Mega TTS

MegaTTS相当于是大模型时代下增强版的Fastspeech,得益于它的自回归结构和多属性建模方式,它的语音合成自然度以及合成的速度和质量都非常好。

上一节中Fastspeech2将语音的三个属性(时长/音高/能量)加入到了语音合成的过程中,提升了合成语音的质量。在MegaTTS中,作者将语音的属性解耦成相位(phase)、timbre(音色)、韵律(prosody)、content(内容),然后对不同的属性使用不同的方法进行建模,通过引入适当的归纳偏差,可以引导模型更快地学习到有用的模式和规律,提高模型在新数据和不同场景下的表现,使其生成更自然和鲁棒的语音。

MegaTTS的网络架构

不同属性分别建模

相位(phase):作者采用mel谱图作为中间表征,分离了相位和其他属性,采用基于GAN的声码器来重建相位信息,提高模型的效率。

内容(content):参考了fastspeech的做法,内容编码器由多个FFT组成,用来将音素序列内容表征,同时为了建模语音和文本之间的单调对齐关系引入了DP和LR,此外还会将韵律编码器提取到的韵律信息添加到时长预测器中,缓解一对多的映射问题。

音色(timbre):音色编码器旨在提取一个包含给定语音说话者身份的全局向量 Htimbre 。同一个说话人的音色基本保持不变。音色编码器由若干堆叠的卷积层组成。为了确保音色信息在时间轴上的稳定性,我们对音色编码器的输出在时间上进行平均,以得到一维的音色向量 Htimbre 。

韵律(prosody):韵律编码器用于用于处理和编码语音的韵律特征,韵律是语音中快速变化的时间属性,涉及到语句中的语调和节奏。具体来说,Prosody encoder的结构包括两个卷积堆栈、一个音素级别的池化层和一个向量量化(VQ)瓶颈。

  1. 两个卷积堆栈:第一个卷积堆栈将梅尔频谱图压缩成音素级别的隐藏状态,根据音素边界进行处理。第二个卷积堆栈则捕捉音素级别的相关性。

  2. 音素级别池化:这一层用于进一步处理音素级别的隐藏状态,用于对音素级别的信息进行汇总和整合,提取出关键的特征。

  3. 向量量化(VQ)瓶颈:这一层利用上述隐藏状态来获取音素级别的韵律代码 \( u = \{u_1, u_2, ..., u_T \} \) 和隐藏状态 \( H_{\text{prosody}} \)。

在韵律编码器中使用向量量化瓶颈,意味着通过向量量化的方式对数据进行压缩和编码,从而限制了信息的表示维度或数量。这有助于减少模型的参数数量、降低计算复杂度,同时也可能促使模型学习到更具代表性和紧凑的特征表示。

为了简化解耦的难度,Prosody encoder仅使用梅尔频谱图的低频带(每个梅尔频谱图帧的前20个区域)作为输入,因为这部分包含了几乎完整的韵律信息,而相对于全频带,包含的音色/内容信息显著较少。Prosody encoder的设计旨在有效地提取和编码语音中的韵律特征,以便在后续的语音生成过程中使用。

针对韵律预测设计P-LLM

P-LLM(Prosody-oriented Language Model)是一种面向韵律的语言模型,专门设计用于预测目标语音的韵律代码。在Mega-TTS系统中,P-LLM作为一个解码器,仅基于变换器的架构,用于韵律建模。其主要功能是在推理过程中,利用输入语音提示的韵律代码作为提示,并结合内容和音色的条件信息,预测目标语音的韵律代码。

具体来说,P-LLM的工作流程如下:

  1. 韵律预测:给定输入语音提示及其韵律信息,P-LLM预测目标语音的韵律代码。这个过程可以表示为:ũ = f (ũ|u, H content , Htimbre , Hcontent ; θ)。

  2. 生成韵律代码:P-LLM利用其强大的上下文学习能力,设计用于预测目标语音的韵律代码。P-LLM是一个仅基于解码器的变换器架构,使用输入语音的韵律代码u作为提示,并结合内容Hcontent、Hcontent和音色Htimbre作为条件。

  3. 自回归韵律预测过程:P-LLM的自回归韵律预测过程可以表示为:P-LLM使用u, H content , Htimbre , Hcontent生成目标韵律代码ũ,然后使用top-k随机采样方案来增加生成语音的多样性。

通过这种方式,P-LLM能够生成高质量的目标语音,不仅保留了输入语音的音色,还保留了其节奏习惯。此外,P-LLM在跨语言文本到语音合成和语音编辑任务中也展现出强大的性能。

训练

训练包括两个个阶段阶段,

  • VQ-GAN TTS模型的训练,训练主要关注于通过基于GAN的梅尔频谱图解码器和多长度判别器来优化语音生成的感知质量,并通过特定的损失函数来指导模型的训练过程。损失函数是VQVAE的损失和GAN判别器的损失。

  • P-LLM(Prosody Large Language Model)的训练:P-LLM 的训练阶段涉及将音素级别的韵律序列与内容和音色信息连接作为输入,通过教师强制模式和交叉熵损失进行训练。

效果

总的来说,在技术架构和创新方面,MegaTTS利用语音属性分解建模,取得了比较好的效果。将语音分解为内容、音色、韵律和相位等不同的属性,并且每个属性都使用具有相应归纳偏置的模块进行建模。例如选择频谱特征(而非音频编解码器编码的声学表征),因为频谱特征能很好地分离相位和其他属性;相位由基于gan的声码器重构;用全局向量对音色建模(因为音色是慢变化全局属性);用基于vq - gan的声学模型生成频谱特征、语言模型拟合韵律分布(韵律在句子中是快变化的,语言模型可捕获局部和全局依赖)。

MegaTTS2

MegaTTS2相比MegaTTS做了一些改进。为了能够同时参考说话人的多条音频,将原本的音色编码器变成了多参考音色编码器;为了适应任意长度点语音提示,韵律语言模型P-LLM的训练方式也进行了调整;为了能够充分利用上下文的学习能力,语音时长的建模方式由非自回归变成了自回归方式。

MegaTTS2的网络架构

Multi-reference timbre encoder

多参考音色编码器:就算是一个说话人,他的音色也会随着情感的变化发生变化。所以音色编码器的输入应该是多个参考音频以及文本,用多头注意力模态来选择与文本输入最为相关的音频特征。

根据相关论文段落,MRTE(多参考音色编码器)的构成如下:

  1. 梅尔编码器Mel Encoder):首先,将梅尔频谱图编码为声学隐藏状态 \( H_{\text{mel}} \)。

  2. 梅尔-音素注意力模块(Mel-to-Phoneme Attention Module):为了从语音提示中提取与语义相关的音色信息,引入了一个梅尔-音素注意力模块。该模块以音素级内容隐藏状态 \( H_{\text{content}} \) 作为查询,以 \( H_{\text{mel}} \) 作为键和值。

  3. 全局音色编码器(Global Timbre Encoder, GE:使用全局音色编码器提取时间不变的音色信息,并将其与音素级隐藏状态连接。

  4. 长度调节器(Length Regulator):最后,通过长度调节器将音素级隐藏状态扩展以匹配目标梅尔频谱图的长度。输出频谱图级隐藏状态 \( H_{\text{CT}} \) 包含内容和细粒度音色信息。

用任意长度的语音训练P-LLM

P-LLM使用统一说话人沿着时间轴拼接起来的语音进行训练,通过教师强制技术和交叉熵损失直接使用连接的语音样本训练语言模型。这种训练方法,在训练过程中,不是根据模型自身前一时刻的输出作为当前时刻的输入,而是直接使用真实的、已知的正确数据即连接好的语音样本作为输入来训练模型。并且用交叉熵损失(Cross-Entropy Loss),一种用于衡量模型预测结果与真实结果之间差异的损失函数。来评估模型的性能,并利用这个损失值来优化模型的参数,使模型能够更好地学习和预测。

自回归的持续时长模型

在语音合成领域,时长建模一直是一个重要的课题。以往的模型,如FastSpeech 2,训练了一个非自回归的时长模型来生成时长信息,并使用长度调节器将音素序列扩展到梅尔频谱图的长度。考虑到零样本TTS中的提示时长信息,作者提出了一种音素级别的自回归时长模型(ADM),通过结合自回归模型的强大上下文学习能力来增强时长建模。ADM的整体架构与PLM相同,但是把分类的交叉熵损失改成了MSE损失。

音素级自回归时长模型(ADM)的优势包括:

  1. 强大的上下文学习能力:能够更好地利用上下文信息来建模时长,从而更准确地预测语音中每个音素的持续时间。

  2. 增强时长建模:相比之前的模型,能够提供更精确和有效的时长表示,提升语音合成的质量。

  3. 考虑零样本 TTS 提示中的时长信息:能更好地处理和利用零样本场景下的时长相关提示,提高模型在新的、未见过的数据上的表现和适应性。

  4. 灵活和适应性强:由于其自回归的特性,可以根据输入的不同上下文动态地调整时长预测,更贴合实际语音的变化和复杂性。

韵律差值

在零样本 TTS 的实际应用中,为在适应目标说话者音色的同时控制或替换其韵律风格,可通过韵律插值实现。比如目标说话者语气平淡但想生成有节奏的韵律,先从其他说话者富有表现力的演讲中提取有节奏的韵律潜在 urhy ,从目标说话者语音提示中提取平淡的韵律潜在 uf lat 。然后用两个具有相同参数的语言模型,分别以 urhy 和 uf lat 为韵律提示解码目标语音。在解码的每一步,两个语言模型的概率分布用权重γ进行插值,公式为 ̃p (u) =TYt=0γ · p (ut | u<t, uf lat) + (1 − γ) · p (ut | u<t, urhy ) 。这样用户能自由增强生成语音的表现力或保留原始节奏。 通过调整权重γ的值,可以控制两个概率分布对最终结果的影响程度,实现对韵律风格在不同程度上的融合或偏向。

总结

Fastspeech系列是之前工业界和学术界最热门的语音合成架构之一,它完成了从FastSpeech到FastSpeech2和FastSpeech2s的迭代。该系列基于速度快的突出优势,迅速建立了影响力,其第一代模型基于速度快的突出优势,迅速建立了影响力,但在合成的语音质量方面不及谷歌的Tacotron2。而FastSpeech2直接用真实的语音数据作为训练目标避免信息损失,同时引入了更精确的时长信息和语音中的其它可变信息(包括音高和音量等)来提高合成的语音质量,大大提高了竞争优势。现在业界应用最广的模型是FastSpeech2,这个模型易用性很强,提供了很好的调参技巧,方便不同的公司做一些工程调优。此外,任意认为,未来要是算力继续膨胀,FastSpeech2s应该会成为未来一个主流的模型。

MegaTTS是火山语音团队全新自研的语音算法,其最新版本MegaTTS2是一种通用的零-shot多说话人TTS模型,能够使用任意长度的提示合成未见过说话人的语音。该模型设计了一个多参考音色编码器来从多个参考演讲中提取音色信息,并训练了一个可以处理任意长度语音提示的韵律语言模型。通过这些设计,该模型适用于不同长度的提示,扩展了零-shot文本到语音的语音质量上限。此外,作者还引入了任意来源提示,在生成过程中利用从多个P-LLM输出中得出的概率来产生富有表现力和可控的韵律。实验结果表明,这种方法不仅能够合成短提示的未见过说话人的保留身份的语音,还能够在使用更长的语音提示时获得改进的性能。

根据引用中的异常信息,`RuntimeError: Error(s) in loading state_dict for PrefixEncoder`表示在加载`PrefixEncoder`的状态字典时发生了错误。具体错误是`size mismatch for encoder.src_word_emb.weight`,提示在当前模型中,`encoder.src_word_emb.weight`的形状是`torch.Size([412, 256])`,而在检查点中的形状是`torch.Size([603, 256])`。 这个错误的原因可能是因为你正在尝试加载一个检查点,但当前模型的某些参数的形状与检查点中的形状不匹配。这可能是由于模型定义或者训练过程中的更改导致的。 解决这个问题的方法可能有几种: 1) 检查你的模型定义,确保模型的各个参数的形状与检查点中的形状一致。 2) 可以尝试使用`model.load_state_dict(ckpt["model"], strict=False)`来加载状态字典,其中`strict=False`将忽略形状不匹配的参数。但需要注意的是,这可能会导致模型的一些参数丢失或者错误。 希望这些方法对解决你的问题有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python RuntimeError: thread.__init__() not called解决方法](https://download.csdn.net/download/weixin_38630358/12877726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [RuntimeError: Error(s) in loading state_dict for FastSpeech2:](https://blog.csdn.net/fange86126/article/details/131301476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力毕业的每一天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值