---------------------------------- 语音合成 相关系列直达 -------------------------------------
✨NaturalSpeech:正在更新中~
✨NaturalSpeech2:TTS | NaturalSpeech2语音合成论文详解及项目实现
本文主要讲解了微软在2023年4月发表的NaturalSpeech2语音合成论文及项目相关~
论文题目:NaturalSpeech 2: Latent Diffusion Models are Natural and Zero-Shot Speech and Singing Synthesizers
潜在扩散模型是自然和零样本的语音和歌唱合成器
论文地址:[2304.09116] NaturalSpeech 2: Latent Diffusion Models are Natural and Zero-Shot Speech and Singing Synthesizers (arxiv.org)
代码地址:lucidrains/naturalspeech2-pytorch: Implementation of Natural Speech 2, Zero-shot Speech and Singing Synthesizer, in Pytorch (github.com)
将文本转语音 (TTS) 扩展到大规模、多说话人和野外数据集对于捕获人类语音的多样性非常重要,例如说话者身份、韵律和风格(例如唱歌)。目前大型TTS系统通常将语音量化为离散的标记,并使用语言模型逐个生成这些标记,存在韵律不稳定、单词跳跃/重复问题、语音质量差等问题。在本文中开发了 NaturalSpeech 2,这是一个 TTS 系统,它利用带有残差向量量化器的神经音频编解码器来获得量化的潜在向量,并使用扩散模型来生成这些以文本输入为条件的潜在向量。为了增强实现多样化语音合成的重要零样本能力,论文设计了一种语音提示机制,以促进扩散模型和持续时间/音高预测器中的上下文学习。将 NaturalSpeech 2 扩展到具有 44K 小时语音和歌唱数据的大规模数据集,并评估其在看不见的说话者的语音质量。NaturalSpeech 2 在零样本设置下,在韵律/音色相似性、鲁棒性和语音质量方面大大优于以前的 TTS 系统,并且仅使用语音提示即可执行新颖的零样本歌唱合成。音频示例可在此 https URL 中找到。
传统的文本转语音 (TTS) 模型是在说话人限制数据集和录音室数据集上训练的,由于缺乏数据多样性,无法充分捕捉人类语音中说话人身份、韵律和风格的多样性。该论文建议使用大规模语料库来训练TTS模型来学习这些多样性,这可以使这些模型通过少样本或零样本技术推广到看不见的场景。
目前的大规模TTS系统通常将连续的语音波形量化为离散的标记,然后使用自回归语言模型对这些标记进行建模。这种方法存在一些局限性。首先,语音标记的序列通常很长(10 秒的语音可能有数千个标记),导致自回归模型中的错误传播和不稳定的语音输出。
其次,编解码器和语言模型之间存在权衡。具有令牌量化的编解码器(如 VQ-VAE 或 VQ-GAN)通常会导致低比特率令牌序列。虽然这简化了语言模型的生成,但也导致了高频、细粒度声学细节的丢失。相反,一些方法使用多个残差离散标记来表示语音帧,如果扁平化,这会显着增加标记序列的长度,从而对语言建模构成挑战。
这部分介绍了NaturalSpeech2,一个自然和富有表现力/高鲁棒性的零样本声音合成的从文本到语音的系统。如图1所示
图1:框架图
在 NaturalSpeech 2 中,首先训练神经音频编解码器使用编解码器将语音波形转换为一系列潜在向量,然后使用编解码器从这些潜在向量重建语音波形。训练音频编解码器后,编解码器编码器用于从训练集中的语音中提取潜在向量。然后将这些向量用作潜在扩散模型的目标,该模型以从音素编码器、持续时间预测器和音高预测器获得的先验向量为条件。
在推理过程中,首先使用潜在扩散模型从文本/音素序列生成潜在向量。然后使用编解码器将这些潜在向量转换为语音波形。
NaturalSpeech2包含了一个自然音频codec(一个编码器和解码器)和一个先扩散模型。
论文使用一个自然语音编码解码器去转换语音文件为连续性向量去代替离散tokens,
如图2
图2
NaturalSpeech 2 系统使用神经音频编解码器将语音波形转换为连续向量,而不是离散标记。这种方法有几个好处:
神经音频编解码器由音频编码器、残差矢量量化器 (RVQ) 和音频解码器组成:
在实践中,为了实现正则化和效率,系统使用具有大量量化器和码本标记的残差向量量化器来近似连续向量。这种方法有两个好处:
作者使用扩散模型(而不是自回归模型)来预测以文本序列为条件的量化潜在向量。这是通过由音素编码器、持续时间预测器和音高预测器组成的先前模型实现的,以提供信息量更大的隐藏向量。
扩散过程使用随机微分方程 (SDE) 进行描述。正向 SDE 将潜在向量转换为高斯噪声。反向 SDE 将高斯噪声转换回数据。常微分方程 (ODE) 也可以在反向过程中考虑。神经网络用于估计噪声数据的对数密度的分数或梯度。
在该公式中,神经网络基于 WaveNet,它以当前噪声向量、时间步长和条件信息为输入并预测数据。这种方法可以提高语音质量。用于训练扩散模型的损失函数包括数据损失项、分数损失项和基于残差向量量化器 (RVQ) 的交叉熵损失。
先前的模型由音素编码器和持续时间/音高预测器组成。音素编码器具有多个 Transformer 编码器层,经过修改以使用卷积网络。持续时间和音高预测器共享相同的模型结构,但具有不同的模型参数。在训练过程中,使用地面实况持续时间和音高信息作为学习目标。使用真值持续时间从音素编码器中扩展隐藏序列,然后将真值音高信息添加到帧级隐藏序列中,以获得最终的条件信息。在推理过程中,使用相应的预测持续时间和音高。
作者设计了一种语音提示机制,以鼓励上下文学习,以改进零样本生成。这种机制促使持续时间/音高预测器和扩散模型遵循语音提示中存在的各种信息,例如说话人身份。
对于给定的语音潜在序列,随机剪出一个片段作为语音提示,而其余片段形成一个新序列,作为扩散模型的学习目标。基于 Transformer 的提示编码器用于处理语音提示并生成隐藏序列。
采用两种不同的策略来利用持续时间/音高预测器和扩散模型的隐藏序列:
对于持续时间和音高预测器,将查询键值 (Q-K-V) 注意力层插入到卷积层中。卷积层的隐藏序列作为查询,键和值来自提示编码器生成的隐藏序列。
对于扩散模型,设计了两个注意力块,而不是直接关注提示编码器的隐藏序列(这可能会揭示过多的细节和影响生成)。在第一个块中,随机初始化的嵌入被用作查询序列,以处理提示隐藏序列,从而生成指定长度的隐藏序列。第二个块使用 WaveNet 层中的隐藏序列作为查询,使用第一个注意力块的结果作为键和值。第二个注意力块的结果用作 FiLM 层的条件信息,该层对扩散模型中 WaveNet 的隐藏序列执行仿射变换。
NaturalSpeech 2 是 NaturalSpeech 系列的增强版本。虽然这两个版本都旨在合成自然声音,但它们的重点不同。NaturalSpeech 1 强调语音质量,主要使用单说话人录音室数据集来生成与人类录音相当的声音。另一方面,NaturalSpeech 2 专注于语音多样性,使用大规模、多说话人和野外数据集探索零样本合成能力。
在架构方面,NaturalSpeech 2 保留了 NaturalSpeech 1 的关键组件,例如用于波形重建的编码器和解码器,以及先前的模块(音素编码器、持续时间/音高预测器)。但是,它引入了上述几个重要的增强功能。
模型各模块的各项参数
NaturalSpeech 2 的音频编解码器使用 8 个 NVIDIA TESLA V100 16GB GPU 进行训练,每个 GPU 的批量大小为 200 个音频,步长为 440K。扩散模型在 16 个 NVIDIA TESLA V100 32GB GPU 上训练,每个 GPU 的潜在向量批处理大小为 6K 帧,步长为 300K 步。
客观指标:
主观指标涉及人工评估,包括:
使用比较平均意见得分在LibriSpeech和VCTK数据集上
git clone https://github.com/lucidrains/naturalspeech2-pytorch
pip install naturalspeech2-pytorch
python setup.py
项目中暂时只有局部代码,等完整时再实现~
请详细查看1.3.4.与 NaturalSpeech 的连接部分
查看驱动命令nvidia-smi
版本为470.199.02
解决办法:升级新的nvidia驱动 或者降低pytorch版本,现在的版本是2.1.2,改为1.31.1就可以啦~
【1】Paper Review: NaturalSpeech 2: Latent Diffusion Models are Natural and Zero-Shot Speech and Singing Synthesizers | by Andrew Lukyanenko | Medium