【论文笔记之 Mega-TTS2】Boosting Prompting Mechanisms For Zero-Shot Speech Synthesis

本文对 Ziyue Jiang 等人于 2024 年发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载,但请务必注明出处。

论文链接https://arxiv.org/pdf/2307.07218

目录

  • Abstract
  • 1. 介绍
  • 2. 背景
  • 3. 方法
    • 3.1. 解耦出韵律和音色
    • 3.2. 压缩声学自编码器
    • 3.3. 韵律隐语言模型
    • 3.4. 韵律插值
  • 4. 实验
    • 4.1. 实验设置
    • 4.2. Zero-Shot 语音合成的结果
    • 4.3. 韵律迁移的结果
    • 4.4. 消融研究
  • 5. 结论
  • A. 实验设置细节
    • A.1. 客观评价细节
    • A.2. 主观评价细节
    • A.3. 网络结构细节
    • A.4. 模型配置
    • A.5. 误差条和随机种子
    • A.6. P-LLM 的采样策略
    • A.7. 基线的选择
    • A.8. 解耦策略细节
  • B. 关于 SCALING UP 数据集
  • C. 关于自适应 TTS 的定义
  • D. Attention 矩阵的可视化
  • E. 局限性和伦理影响
    • E.1. 局限性以及未来的方向
    • E.2. 伦理影响
  • F. BOTTLENECK 信息描述
  • G. 使用不同大小的训练数据进行扩展
  • H. 韵律建模策略
  • I. 假设 1 的特殊情况
  • J. 训练期间不同长度的上下文
  • K. 鲁棒语音合成更多案例的说明
  • L. 参考 PROMPTS 含噪的结果

Abstract

Zero-shot TTS 旨在合成未见过的语音,这可以避免 fine-tuning 过程,从而显著减少了语音克隆所需的数据和计算量。然而,zero-shot TTSprompting 机制仍然面临以下挑战:1)之前的 zero-shot TTS 工作通常用单句 prompts 进行训练,这在推理阶段数据相对充足的情况下会显著限制其性能。2)prompts 中的韵律信息与音色信息高度耦合,无法互相转换。本文提出了 Mega-TTS 2 来处理上述问题。具体来说,我们设计了一个强大的声学自编码器(acoustic autoencoder),可以分别对韵律和音色信息进行编码,同时提供高质量的重建。我们还提出了一个多参考(multi-reference)音色编码器和一个韵律隐语言模型(prosody latent language model,P-LLM),来从多句 prompts 中提取有用信息。我们进一步利用从多个 P-LLM 输出中得到的概率,来生成可迁移和可控的韵律。实验结果表明,Mega-TTS 2 不仅能使用一个短 prompt 来合成未见过的说话人的语音,而且当数据时长在 10 10 10 秒到 5 5 5 分钟的范围内时,其效果始终优于微调的方法。此外,我们的方法能够以细粒度和可控的方式来将多种说话风格转换成目标音色。可以在 https://boostprompt.github.io/boostprompt/ 中找到音频样例。

1. 介绍

近些年,TTS 技术已经取得了重大进展。在这些技术中,自适应 TTS 系统能够使用几分钟语音数克隆出个性化声音。然而,这些系统的性能严重依赖于 fine-tuning 阶段所使用的数据量和数据质量。数据量不够可能会导致音频自然度或语音清晰度下降。此外,系统的计算量也会限制其落地场景。

为了减少这种依赖,现有工作使用生成模型来进行 zero-shot TTS。这些强大的模型只需要简单的语音 prompt 就能合成语音。然而,现有方案中的 prompting 机制仍然面临以下两个挑战:

  • Lack of multi-sentence prompting strategies.   之前的 zero-shot TTS 系统通常在训练阶段只使用单句(single-sentence)语音 prompt。在推理阶段,单句语音 prompt 中的信息不足以令 zero-shot TTS 系统完美地模仿人类的声音变化。从另一方面来看,可以通过增加数据量来进一步提升 fine-tuning 方法的性能,而 zero-shot TTS 缺少从多句(multiple-sentence)语音 prompts 中提取有用信息的合适策略。

  • Lack of specialized prompting mechanism for prosodic information.   现有的 zero-shot TTS 主要是提升生成的语音和 prompt 之间的音色相似度和韵律相似度。然而,它们并没有以可控的方式来表达各种看不见、摸不着的与韵律相关的风格。为了控制这些与韵律相关的风格,很有必要从语音 prompts 中提取出这些韵律信息。

为了处理上述这些问题,我们将语音解耦成内容、音色和韵律。直觉上,要表示众多说话人的语音,就需要大量的 codebook entries 来对音色进行建模。通过分离韵律信息,可以获得高度紧凑的用于建模韵律的码本,这使我们的模型能够有效处理极长的 prompt 并灵活控制韵律风格。因此,我们提出了 Mega-TTS 2,这是一个可以增强 zero-shot TTS 系统中 prompting 机制的通用框架。具体来说,我们首先设计了一个声学自编码器(acoustic autoencoder),它能有效地将语音解耦成韵律和音色表示。然后,我们设计了一个多参考音色编码器(MRTE, multi-reference timbre encoder)和一个韵律隐语言模型(P-LLM, prosody latent language model),来从多句 prompts 中提取有用信息。除了多句 prompting 机制,我们还提出了一种韵律插值技术,该技术利用来自多个说话人的韵律 prompts 来控制韵律 codes 的生成过程,且同时保持目标说话人的音色。通过利用目标说话人和辅助说话人的韵律 prompts 得出的概率,可以以可控的方式生成语音的韵律风格。

LibriSpeech 的干净测试数据集和 ESD 数据集上的实验表明,在说话人相似度和语音自然度方面,Mega-TTS 2 优于其它最先进的 fine-tuningzero-shot TTS 模型。值得注意的是,当 prompts 的长度进一步变长时,我们的方法在客观和主观评价上都优于微调的基线模型。这项工作的主要贡献如下:

  • 我们设计了一个声学自编码器,它将韵律和音色信息分别压缩到隐空间,这能让我们的模型有效地处理长达 300 300 300 秒的 prompts
  • 我们提出了一个多参考音色编码器和一个自回归韵律语言模型,来从多个参考语音中提取细粒度信息。
  • 实验结果展示出 Mega-TTS 2 的表现超越了基线模型,说明了我们所提出的 prompting 机制的优越性。
  • 提出的韵律插值技术不仅能确保韵律的可控性,而且能够将各种说话风格迁移到目标音色上。

2. 背景

Adaptive TTS   自适应 TTS 专注于用少量数据为用户合成个性化的声音。自适应的过程就是使用少量的目标声音数据,对一个在多说话人语音数据集上预训练的 TTS 模型进行 fine-tuningChen 等人于 2018 2018 2018 年的工作为每个说话人设计了独立可学习的 embeddings,这在部署阶段需要少量数据来快速适应新的说话人。AdaSpeechChen 等人于 2021 2021 2021 年的工作)提出了一种声学条件建模方法,用于高效且高质量地定制新声音。还有一些其它工作将 meta-learning 和数据增强用于说话人自适应。然而,尽管一些工作是数据有效和参数有效的,但当数据量较少时,这些系统仍然会面临语音质量问题。此外,还有数百个 fine-tuning 步骤所带来的计算效率问题。

Zero-shot TTS   Zero-shot 自适应旨在使用说话人编码器(从参考音频中提取说话人 embeddings)合成未见过的声音。这个场景非常具有吸引力,因为它不需要任何额外的自适应数据和参数。基于注意力的自适应方法使用注意力机制从参考音频中提取细粒度的语音特征。在这些方法中,Attentron 提出从任意数量的参考音频中提取有用的风格信息。然而,它们没有分别建模音色和韵律信息,缺少对音色和韵律的控制。近期,一些工作提出使用 in-context learning 方法来从声学 prompts 中提取说话人信息,并在 zero-shot TTS 中取得了显著的成果。VALL-E 提出了神经编解码语言模型,该模型在 zero-shot 语音生成上展示出了强大的 in-context learning 能力。NaturalSpeech 2in-context learning 引入到隐扩散模型中,这是通过将语音片段划分为 prompt 区域和目标区域来实现的。然而,这些方法都是使用单句 prompts 训练的,缺少从多句语音 prompts 中提取细粒度信息的策略。

Prosody Transfer for Speech Synthesis   韵律迁移旨在将参考音频的韵律迁移到合成的目标语音上,这对于以可控的方式来生成自然和富有表现力的语音是非常重要的。Skerry-Ryan 等人于 2018 2018 2018 年首次将韵律参考编码器集成到了一个基于 TacotronTTS 系统中。然而,如 Sigurgeirsson & King 所指出的那样,现有的方案不是学习可迁移的韵律表示,而是学习相对依赖于参考说话人和参考文本的句级表示。

3. 方法

本节介绍了 Mega-TTS 2。首先,我们直观地说明 Mega-TTS 2 是如何解耦语音中的音色和韵律信息的。接着,我们对于所提出的 prompting 机制和模型的两阶段训练过程做了更详细的解释。

3.1. 解耦出韵律和音色

Problem Formulation   令 H ( X ) H(X) H(X) 表示 X X X 的香农熵, I ( Y ; X ) I(Y;X) I(Y;X) 表示互信息(mutual information)。假设梅尔谱 y y y 可以通过以下生成过程被重构: y = D ( z c , z p d , z t , g ) y = D(z_c,z_{pd},z_t,g) y=D(zc,zpd,zt,g),其中 z c z_c zc z t z_t zt 表示细粒度内容和音色隐状态。 g g g 表示包含了音色和韵律的全局风格信息。假设 z p d = ( z p , z d ) z_{pd}=(z_p,z_d) zpd=(zp,zd) 包含了音高和能量( z p z_p zp)以及持续时间( z d z_d zd)的细粒度韵律风格信息。 z d = A l i g n e r ( y ) z_d = Aligner(y) zd=Aligner(y) 可以通过外部对齐工具获得,并可以从 z p d z_{pd} zpd 中分离出来。令 D D D 表示梅尔谱解码器。我们的目标是构建一个基于自编码器的模型来分离出语音的各成分。

Decomposition via Corpus Partition   令 Y = { y 1 , ⋯   , y n } Y = \{y_1, \cdots, y_n\} Y={y1,,yn} 表示某个说话人 S S S 的语料。在训练过程中,我们将 Y Y Y 划分为目标梅尔谱 y t y_t yt 和其它梅尔谱 y ~ \widetilde{y} y . 在这里,我们做一个重要假设,即 y t y_t yt y ~ \widetilde{y} y 之间的互信息只包含了 y t y_t yt 的音色信息 H ( z t ) H(z_t) H(zt) 和全局风格信息 H ( g ) H(g) H(g),也就是:
I ( y t ; y ~ ) = H ( z t ) + H ( g ) . \begin{align} I(y_t;\widetilde{y}) = H(z_t) + H(g). \end{align} I(yt;y )=H(zt)+H(g).

首先,基于此假设,可以从 E t ( y ~ ) E_t(\widetilde{y}) Et(y ) 中提取出 z t z_t zt g g g,但不能从 E t ( y ~ ) E_t(\widetilde{y}) Et(y ) 中得到 z p z_p zp z c z_c zc;其次,如果我们只将音素序列输入给 E c E_c Ec,那么 E c E_c Ec 只能传递所有的内容信息 z c z_c zc;接着,因为 z c z_c zc z t z_t zt 已经是已知的了,所以如果韵律编码器 E p E_p Ep 不得不被迫丢失一些信息,那么它将首先丢弃细粒度的内容和音色信息。 E p ( y t ) E_p(y_t) Ep(yt) 将只保留其它编码器提供不了的细粒度的韵律风格 z p z_p zp,因此达到解耦的目的。在接下来的章节中,我们描述了 prompting 机制的设计细节。

3.2. 压缩声学自编码器

图 1

要存储数千个说话人的音色信息,我们需要大量的 codebook 条目。然而,由于韵律和音色已经被解耦,因此韵律信息 z p z_p zp 可以被压缩成高度紧凑的 codebook,音色信息 z t z_t zt 可以通过一个牛逼的说话人编码器进行提取。解耦策略不仅使我们的模型能够适应极长的韵律 prompts,还能使我们的模型控制生成语音的韵律风格。如图 1 所示,我们设计了矢量量化(VQ)编码器 E p E_p Ep,多参考音色编码器 E t E_t Et,以及内容编码器 E c E_c Ec. 由于 E p E_p Ep 主要捕捉韵律的变化信息,因此采用基于 GAN 的梅尔谱解码器 D D D 来建模频谱的高频细节,从而确保感知上高质量地重建。总的来说,第一阶段的训练 loss 可以表示为 L = L r e c + L V Q + L A d v \mathcal{L} = \mathcal{L}_{rec} + \mathcal{L}_{VQ} + \mathcal{L}_{Adv} L=Lrec+LVQ+LAdv,其中 L r e c = ∥ y t − y ^ t ∥ 2 \mathcal{L}_{rec} = \|y_t - \hat{y}_t\|^2 Lrec=yty^t2 是重构 loss L V Q \mathcal{L}_{VQ} LVQVQ codebook loss L A d v \mathcal{L}_{Adv} LAdvLSGAN 类型的对抗损失,其目标是最小化预测的梅尔谱和真实的梅尔谱之间的分布距离。在上述提出的三个编码器中,内容编码器由多个前馈 Transformer 层组成,这遵循了非自回归 TTS 系统的常见做法。在接下来的章节中,我们将分别描述韵律和音色编码器的细节。

Vector Quantised Encoder   矢量量化编码器 E p E_p Ep 包含两个卷积块和一个矢量量化 bottleneck。第一个卷积块将梅尔谱压缩成隐状态,其长度变为之前的 1 / r 1/r 1/r,第二个卷积块捕获特征的相关性。接着,矢量量化层利用这些隐状态获得韵律 code u = { u 1 , u 2 , ⋯   , u n } \mathbf{u}=\{u_1, u_2, \cdots, u_n\} u={u1,u2,,un} 以及隐状态 z p z_p zp. VQ 编码器的 B ( ⋅ ) B(\cdot) B() 包含时间压缩和矢量量化层。

Multi-Reference Timbre Encoder   我们的目标是从多句语音 prompts 中提取细粒度的音色信息。因为说话人可以根据自己的说话习惯或想要表达的语义,来改变自己的音色。因此,音色编码器需要从表示说话人习惯的多个 prompts 中提取细粒度的音色信息。我们引入一个多参考音色编码器(MRTE)来实现这个目的。首先,我们将目标说话人的参考梅尔谱 y ~ \widetilde{y} y (不同于目标梅尔谱)拼接起来。接着,梅尔编码器将拼接的梅尔谱压缩成声学隐状态 z t z_t zt,其长度变为之前的 1 / d 1/d 1/d. 然后,为了从语音 prompts 中提取语义相关的音色信息,我们引入了一个 timbre-to-content 注意力模块。该模块将 z c z_c zc 作为 query,将 z t z_t zt 作为 keyvalue。 最后,我们使用时长调节器,对 timbre-to-content 注意力模块的输出进行上采样,以匹配目标梅尔谱的时长。

3.3. 韵律隐语言模型

与先前使用单句 prompts 训练的模型不同,我们的韵律隐语言模型(P-LLM)旨在从多句 prompts 中捕捉说话人的韵律模式。在第二个训练阶段,我们首先从目标说话人的多个语音片段 { s 1 , s 2 , ⋯   , s n } \{s_1, s_2, \cdots, s_n\} {s1,s2,,sn} 中,使用前述提出的压缩声学自编码器,来抽取压缩的韵律隐状态 { z p 1 , z p 2 , ⋯   , z p n } \{z_{p1}, z_{p2}, \cdots, z_{pn}\} {zp1,zp2,,zpn} 以及内容隐状态 { z c 1 , z c 2 , ⋯   , z c n } \{z_{c1}, z_{c2}, \cdots, z_{cn}\} {zc1,zc2,,zcn}。然后,我们将其沿着时间轴进行拼接得到 z p ′ = C o n c a t ( z p 1 , z p 2 , ⋯   , z p n ) z_p^{'} = Concat(z_{p1}, z_{p2}, \cdots, z_{pn}) zp=Concat(zp1,zp2,,zpn) 以及 z c ′ = C o n c a t ( z c 1 , z c 2 , ⋯   , z c n ) z_c^{'} = Concat(z_{c1}, z_{c2}, \cdots, z_{cn}) zc=Concat(zc1,zc2,,zcn)。为了匹配 z p ′ z_p^{'} zp z c ′ z_c^{'} zc 的时长,我们使用 z d z_d zd 的时长信息将 z c ′ z_c^{'} zc 扩展到帧级别,然后使用最大池化层对其进行 r r r 倍压缩。之后,我们将 z p ′ z_p^{'} zp 转换成韵律 code u ′ \mathbf{u}^{'} u,并将 u ′ \mathbf{u}^{'} u z c ′ z_c^{'} zc 一起输入给 P-LLM,后者将以自回归的方式预测韵律编码:
p ( u ′ ∣ z c ′ ; θ ) = ∏ l = 0 L p ( u l ′ ∣ u < l ′ , z c ′ ; θ ) , \begin{align} p(\mathbf{u}^{'}|z_c^{'}; \theta) = \prod_{l=0}^{L}p(\mathbf{u}_l^{'}|\mathbf{u}^{'}_{<l},z_{c}^{'};\theta), \end{align} p(uzc;θ)=l=0Lp(ulu<l,zc;θ),

其中 θ \theta θP-LLM 的参数, L L L 是拼接的韵律 code u ′ \mathbf{u}^{'} u 的长度。训练时,我们将 batch size 设置为 1 1 1,以让每个 batch 中的韵律 code 尽可能的多。如果单个说话人的总语音帧数少于 m × r m \times r m×r,那么我们将在该 batch 中加入其它说话人的语音样本,并在 P-LLM 中加入说话人级别的注意力掩码。我们使用拼接的语音样本直接训练语言模型,训练的过程中使用 teacher-forcing 技术和交叉熵损失。为了避免由直接拼接 prompts 引起的区域过渡问题,我们为每个句子分配开始 token 和结束 token,以指导 P-LLM 续写当前句子,并从前一个句子中提取有用信息。该训练策略使得模型能够捕捉到多句 prompts 中有用的韵律级的信息。因此,在推理阶段,用户能够通过拼接参考语音片度来扩展 prompts 的长度,从而提升生成的质量。对于时长建模,我们提出了一个音素级的自回归时长模型。该模型利用自回归模型强大的上下文学习能力,来增强时长建模。自回归时长模型的整个架构与 P-LLM 相同,不过使用的 loss 函数是 MSE

3.4. 韵律插值

我们提出了一种韵律插值技术,用于在离散空间中控制或代替目标说话人的韵律风格,同时确保音色重构的质量。我们通过对多个 P-LLM 输出(来自多个说话人)的概率进行插值来实现该目标。例如,我们目标说话人的语气比较悲伤,但我们想在保留目标说话人音色的同时,生成听起来更快乐的声音。解决方案是 1)从别的说话人的快乐语音中提取韵律 code u a \mathbf{u}_a ua,并从目标说话人的语音 prompt 中提取悲伤的韵律 code u b \mathbf{u}_b ub2)使用两个语言模型分别基于韵律 prompt u a \mathbf{u}_a ua u b \mathbf{u}_b ub 来解码目标韵律 code u ^ \hat{\mathbf{u}} u^。这些语言模型共享相同的参数。在解码过程的每个时间步 t t t,两个语言模型的概率分布都会用权重 γ \gamma γ 进行插值,可以以如下的方式表示:
p ( u ^ ) = ∏ t = 0 T ( ( 1 − γ ) ⋅ p ( u ^ t ∣ u ^ < t , u b , C o n c a t ( z c b , z ^ c ) ; θ ) + γ ⋅ p ( u ^ t ∣ u ^ < t , u a , C o n c a t ( z c a , z ^ c ) ; θ ) ) , \begin{align} p(\hat{\mathbf{u}}) = \prod_{t=0}^{T}((1-\gamma) \cdot p(\hat{\mathbf{u}}_t|\hat{\mathbf{u}}_{<t},\mathbf{u}_b, Concat(z_{cb}, \hat{z}_c);\theta) + \gamma \cdot p(\hat{\mathbf{u}}_t | \hat{\mathbf{u}}_{<t}, \mathbf{u}_a, Concat(z_{ca}, \hat{z}_c);\theta)), \end{align} p(u^)=t=0T((1γ)p(u^tu^<t,ub,Concat(zcb,z^c);θ)+γp(u^tu^<t,ua,Concat(zca,z^c);θ)),

其中 z c b z_{cb} zcb z c a z_{ca} zca 是来自语音片段 s b s_b sb s a s_a sa 的内容信息。 z ^ c \hat{z}_c z^c 是目标句子的内容信息。在推理阶段,用户可以使用我们的韵律插值技术,来自由地控制所生成语音的韵律风格。此外,提出的韵律插值算法利用语言模型的自回归概率分布进行韵律迁移。相比于直接用 u a \mathbf{u}_a ua 代替 u b \mathbf{u}_b ub,韵律隐语言模型能够在自回归生成的过程中,以柔和且细粒度的方式混合 u a \mathbf{u}_a ua u b \mathbf{u}_b ub

图 2

4. 实验

4.1. 实验设置

训练数据集   我们在 LibriLight 上训练 Mega-TTS 2 和全部基线模型,该数据集包含了 60 K 60\text{K} 60K 小时未打标签的语音,所有语音的采样率均为 16 KHz 16\text{KHz} 16KHz。与 VALL-E 一样,我们使用在 960 h 960\text{h} 960h 带标签的 LibriSpeech 上预训练的混合 DNN-HMM ASR 模型来对语音进行转录。我们使用外部对齐工具将音素序列与语音对齐。

模型配置   我们在附录 A.4 中给出了模型配置,表 5 给出了详细的超参数设置。

训练和推理   在第一个训练阶段,我们在 4 4 4NVIDIA A100 GPUs 上训练第一阶段模型,每个 GPU 上的 batch size 48 48 48(个句子)。在第二个阶段,我们在 8 8 8NVIDIA A100 GPUs 上训练 P-LLM 和时长模型,每个 GPU 上的 batch size 4000 4000 4000 (个 tokens)。这意味着我们的模型理论上支持 4000 × 8 4000 \times 8 4000×8 帧的 prompts。我们使用 Adam 优化器且 β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 0 − 9 \beta_1=0.9, \beta_2=0.999, \epsilon=10^{-9} β1=0.9,β2=0.999,ϵ=109。训练第一阶段模型需要 600 k 600\text{k} 600k 步,训练第二阶段模型需要 300 k 300\text{k} 300k 步。使用预训练的 HiFi-GAN V1 将预测的梅尔谱转换成音频样本。

客观指标   对于 zero-shot TTS,我们会评估 WER, 说话人相似性(SIM)以及真实语音和合成语音的基频之间的平均 DTW 距离。我们使用 WavLM 模型(用于说话人验证任务的微调版本)来计算真实语音和合成语音之间的余弦说话人相似度得分。相似度得分的范围在 [ − 1 , 1 ] [-1, 1] [1,1] 之间,数值越大表明输入样本的相似度越高。我们还评估了跨语言 TTSWER。首先,我们使用已发布的 HuBERT-Large 模型将生成的语音转录为文本。然后,计算转录的文本和原始目标文本之间的 WER。我们将测试集中的样本全都用于客观评估。对于韵律迁移,我们评估 WER, SIM, 时长误差(DE)和基频分布的统计矩(标准差 σ \sigma σ, 偏度 γ \gamma γ 和峰度 κ \kappa κ)。

主观指标   我们对测试集进行 MOS 评估来衡量音频自然度。我们令不同模型之间的文本内容和 prompt 语音一致,以排出其它干扰因素。我们从每个数据集的测试集中随机选取 50 50 50 条音频用于主观评估,而且每条音频至少有 20 20 20 个测试者来测听。我们从两个方面分析 MOSQMOS(质量、清晰度、自然度和高频细节)和 SMOS(音色重构以及韵律模式的说话人相似度)。我们还从音频质量和说话人相似度方面分析了 CMOS。在打分的时候,我们告诉测试者专注于相应测试点的同时,要忽略其它测试点。

4.2. Zero-Shot 语音合成的结果

我们用各种时长的语音 prompts 评估了我们的模型,并将我们的模型与 zero-shot 方案以及 fine-tuning 的基线系统进行了比较,以证明多句 prompting 机制的有效性。我们从 LibriSpeech 干净测试集中随机选取了 20 20 20 个说话人,并随机选取每个说话人的 400 400 400 秒语音。我们将这 400 400 400 秒划分为 300 300 300 秒的 prompt 集,以及 100 100 100 秒的目标集。我们将 Mega-TTS 2 与以下两个系统进行比较:1)VALL-E(zero-shot),这是一个使用大语言模型生成离散语音 codes 的大规模 zero-shot TTS。因为 VALL-E 没有开源,我们精心实现它以达到最佳效果;2)基线(fine-tune)这个模型在 FastSpeech 2 的框架中加入了 Mega-TTS 2 中用到的 GAN。为了让基线系统支持自适应场景,我们使用 Meta-StyleSpeech 中的说话人编码器来提取音色信息。我们 fine-tune 基线系统,使其在 WERSIM 两者之间达到一个最佳的平衡状态。需要注意的是,实验中的所有系统都是在 LibriLight 数据集上进行预训练的。在附录 A.7 中我们进一步解释了选择该基线系统的原因。

表 1

分析   如表 1 所示,随着自适应数据量的增加,Mega-TTS 2 的效果持续提升。在数据量从 3 3 3 秒增加到 10 10 10 秒的过程中,VALL-E 的效果也在提升,但是在数据量为 20 20 20 秒的时候,其效果下降严重。这是由于其在训练过程中使用的是单句 prompting 机制。此外,因为编码器模型的压缩率限制了 prompts 的长度,在我们的实验中,当 prompts 的时长超过 20 20 20 秒时,VALL-E 无法生成合理的语音。从另一个角度来看,当每个说话人只有 10 10 10 秒或 60 60 60 秒的语音时,我们的 Mega-TTS 2 在语音自然度和说话人相似度方面,均要优于 fine-tuning 的基线系统。当每个说话人有 300 300 300 秒的语音时,Mega-TTS 2WER 仍然优于基线系统,并在说话人相似度方面与基线系统表现相当。我们还将 fine-tuning 过程中的 WERSIM 进行了可视化,如图 3 所示。我们的方法可以利用更多的数据来提高说话人的相似度,同时保持相对较低的 WER

图 3

4.3. 韵律迁移的结果

我们评估了我们的模型在韵律迁移方面的表现,主要做法是将 ESD 数据集中的情感风格迁移到 LibriSpeech 干净测试集的说话人上。首先,我们随机从 LibriSpeech 干净测试集中选取 20 20 20 个说话人,每个说话人又随机选取 50 50 50 条句子。接着,我们会从 ESD 数据集中为上一步中选取的每条句子再随机选取一条情感语音片段,并将其作为韵律参考。为了说明 Mega-TTS 2 在韵律迁移方面的表现,我们将其与两个系统进行了比较:1)CopyCat,这是一个使用参考编码器架构来捕捉时间韵律表征的模型;2) Daft-Exprt,该模型通过对抗性训练来解耦说话人身份和韵律信息,从而实现说话人之间的韵律迁移。为了公平对比,我们将 CopyCatDaft-Exprt 中的韵律迁移技术整合到前述章节所提出的基线系统中,并使得所有模型的参数量相当。该实验中的所有系统都是在 LibriLight 数据集上进行预训练的。

表 2

分析   从表 2 可以看出,与 CopyCatDaft-Exprt 相比,Megs-TTS 2 生成的语音的统计矩( σ 、 γ \sigma、\gamma σγ κ \kappa κ)更接近于真实音频,而且 DE 比其它方法低,这表明了所提出的韵律插值技术的有效性。此外,我们还观察到我们的方法能有效地保留原始的音色,并保持较高的音频质量。我们还对韵律迁移过程前后的韵律分布进行了可视化,见图 4

图 4

4.4. 消融研究

韵律和音色 Prompts

表 3

我们评估了不同时长的 prompts 分别对 MRTEP-LLM 的影响。在表 3 中,SIM 得分和语音质量随着音色 prompts 时长的增加而增加,而 DTW 距离几乎保持不变。当增加韵律 prompts 的时长时,DTW 距离减少,而说话人相似度几乎保持不变。可以看出,提出的音色和韵律 prompting 机制分别从音色和韵律建模方面提高了主观感受到的说话人相似度。

VQ 编码器和 MRTE

表 4

我们测试了以下四种设置:1) w / o w/o w/o MRTE,该设置从模型中移除了 MRTE,也不再分离韵律和音色;2) w / w/ w/ VAE,该设置使用 VAE 进行生成韵律建模;3) w / w/ w/ VAE+LDM,该设置使用 VAELDM 进行生成韵律建模。LDM 的架构和 prompting 机制基于 NaturalSpeech 2。所有的基线系统使用 10 10 10 秒的 prompts。表 4 给出了最终结果。对于设置 1),可以观察到,移除了 MRTE 之后,严重影响了音频质量和说话人相似度。这是因为音色信息被 VQ codebook 吸收了,给 P-LLM 带来了很大的压力,这说明了解耦音色和韵律信息的有效性。对于设置 3),用 VAELDM 代替 VQ 编码器以及 P-LLM 所得到的结果与 Ours-10s 结果类似。然而, w / w/ w/ VAE+LDM 的性能仍远不如 Ours-300s,这表明了提出的多句 prompting 机制的优越性。

5. 结论

我们提出了 Mega-TTS 2,这是一个增强 zero-shot TTS 系统 prompting 机制的框架。通过提出的多句 prompting 策略,当每个说话人可用的自适应数据在 10 10 10 秒到 5 5 5 分钟之间时,我们的方法优于 fine-tuning 基线。此外,我们的方法使用韵律插值技术,可以成功地将各种韵律风格迁移到目标说话人上,同时保留目标说话人的音色。实验结果表明,在音频自然度和说话人相似度方面,我们的方法表现出优越的性能。

A. 实验设置细节

A.1. 客观评价细节

说话人相似度模型   为了评估说话人相似度,我们使用 https://huggingface.co/microsoft/wavlm-base-plus-sv 提供的针对说话人验证任务 fine-tuned 的 WavLM 模型,来提取说话人 embedding。我们计算合成语音的说话人的 embedding 和真实语音的说话人的 embedding 之间的余弦相似度,并将其作为说话人相似度分数。WavLM 模型先在 94000 94000 94000 小时的语音数据上进行预训练,然后在 VoxCeleb1 数据集上进行 fine-tune。模型最终在实验列表 Vox1-O, Vox1-EVox1-H 上分别实现了 0.84 % , 0.928 0.84\%, 0.928 % 0.84%,0.928 1.758 % 1.758\% 1.758%EER(Equal Error Rate)

ASR 模型   为了评估音频质量和语音可懂度,我们计算 WER。我们使用 fine-tunedHuBERT-Large 模型将合成的语音转录成文本,并计算其与原始目标文本之间的 WER。来自 https://huggingface.co/facebook/hubert-large-ls960-ftHuBERT-Large 模型在 960 960 960 小时的 Librispeech 上进行了 fine-tune,其在 Librispeechdev-clean, dev-other, test-cleantest-other 集上的 WER 分别为 1.5 % , 3.0 % , 1.9 % 1.5\%, 3.0\%, 1.9\% 1.5%,3.0%,1.9% 3.3 % 3.3\% 3.3%

A.2. 主观评价细节

我们在 Amazon Mechanical Turk 上评估音频质量和说话人相似度。对于每个数据集,我们从测试集中随机选取 50 50 50 条样本,并使用 TTS 系统生成音频样本。每条音频由 20 20 20 个测试者进行测听。对于 MOS,每个测试者要给每个音频样本给出一个 1 − 5 1-5 15 之间的主观分。对于 CMOS,测试者要从系统 A 和系统 B 生成的音频对中选出他们更倾向的音频。对于音频质量评估(QMOSCMOS-Q),我们告知测试者“请关注语音质量的清晰度、自然度和高频细节,并忽略其它因素”。对于说话人相似度(MOS-S),我们告知测试者“请只关注说话人与参考说话人在音色和韵律模式方面的相似度,而忽略内容、语法、音质或其它因素的差异”。

图 5

A.3. 网络结构细节

MRTE   如图 5 所示,提出的 MRTE 包含两个卷积块以及一个下采样块。为了降低计算量同时保持音色重建的质量,我们将音色隐状态时长降低为 1 / 16 1/16 1/16。在训练过程中,我们随机从 y ~ \widetilde{y} y 中抽取 2000 2000 2000 帧以提高训练效率。

VQ Encoder   VQ Encoderbottleneck 由一个 sride = 8 \text{sride}=8 sride=8 的最大池化层和一个矢量量化层组成。在我们的实验中,我们发现相比于音素级的压缩,将梅尔谱进行 8 8 8 倍压缩会产生更好的效果。我们尝试了不同压缩率( 2 , 4 , 8 , 16 , 32 2,4,8,16,32 2,4,8,16,32),并发现 r = 8 r=8 r=8 在重建性能和压缩之间达到最佳平衡。另一方面,在训练过程中,我们还发现 vanilla VQ-VAE 存在 codebook 奔溃的问题,这意味着只有一小部分 codebook 向量得到了优化。这限制了 codebook 的表达能力,并影响训练过程的收敛。为了解决 codebook 奔溃问题,我们在训练过程中采用了一种基于 CVQ-VAE 的动态初始化策略,确保那些很少被使用或不被使用的 code 向量能比常使用的那些得到更多的修改。

A.4. 模型配置

我们的 Mega-TTS 2 包含了三个编码器,一个韵律隐语言模型,一个梅尔解码器和一个判别器。韵律编码器,音色编码器和解码器包含 5 5 5 个卷积块( kernel_size = 5 , hidden_size = 512 \text{kernel\_size}=5, \text{hidden\_size}=512 kernel_size=5,hidden_size=512)。内容编码器是一个 8 8 8 层的 Transformer hidden_size = 512 \text{hidden\_size}=512 hidden_size=512)。GAN 判别器使用 ML-GAN 的架构。P-LLM 模型是一个 decoder-only 的架构,它包含 12 12 12Transformer 层( hidden_size = 1024 \text{hidden\_size}=1024 hidden_size=1024),参数量为 151 M 151\text{M} 151M。时长预测器是一个 8 8 8 层的 decoder-onlyTransformer 模型( hidden_size = 512 \text{hidden\_size}=512 hidden_size=512)。codebook embedding_size = 1024 \text{embedding\_size}=1024 embedding_size=1024codebook 向量的 hidden_size = 256 \text{hidden\_size}=256 hidden_size=256。压缩率 r r r d d d 分别为 8 8 8 16 16 16。对于韵律迁移实验, γ = 0.8 \gamma=0.8 γ=0.8。我们在表 5 中提供了详细的超参数设置。

表 5

A.5. 误差条和随机种子

对于主观评价,我们报告 MOS 测试结果的置信区间。对于客观评价,我们使用 10 10 10 个不同的随机种子( [ 1234 , 1111 , 2222 , 3333 , 4444 , 5555 , 6666 , 7777 , 8888 , 9999 ] [1234, 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999] [1234,1111,2222,3333,4444,5555,6666,7777,8888,9999])跑了 10 10 10 次实验,然后取平均结果。

A.6. P-LLM 的采样策略

在我们所有的实验中,P-LLM 都使用 top-k 采样策略,其中 k = 10 k=10 k=10。与贪心解码相比,在基于采样的方法中使用合适的 k k k,可以增强输出的多样性。

A.7. 基线的选择

VALL-E、NaturalSpeech 2VoiceBox 都是最先进的 zero-shot TTS 模型。在 zero-shot TTS 实验中,我们没有成功复现 NaturalSpeech2VoiceBox。因为他们也没有提供预训练的模型和源码,因此我们只能和 VALL-E 做比较。

A.8. 解耦策略细节

韵律编码器 E p E_p Ep 旨在捕捉细粒度和局部韵律风格 z p z_p zp。对于局部韵律风格 z p z_p zp,我们假设 p s d ( ⋅ ) psd(\cdot) psd() 是一个完美的局部韵律提取器,我们可以得到以下公式: I ( p s d ( y t ) , p s d ( y ~ ) ) = 0 I(psd(y_t),psd(\widetilde{y}))=0 I(psd(yt),psd(y ))=0。内容信息 z c z_c zc z p z_p zp 类似,也是局部和细粒度。另一方面,直觉上 E c E_c Ec 捕捉不到类似于平均音量和基频的全局韵律信息。因为我们为 E p E_p Ep 设计了一个信息 bottleneck B ( ⋅ ) B(\cdot) B(),所以全局韵律信息将由音色编码器 E t E_t Et 优先处理,并存储在 H ( z t ) H(z_t) H(zt) 中。既然局部和全局韵律信息都被提取出来了,那么公式 ( 1 ) (1) (1) 和我们解耦策略的有效性就可以得到保证。

B. 关于 SCALING UP 数据集

Scaling up 数据集对于 zero-shot TTS 的实际应用至关重要。因此,我们从 YouTubenovelfm 上抓取了 200 K 200\text{K} 200K 小时的有声读物录音。抓取的数据集中包含有标签和无标签的语音,而且大部分没有说话人信息。为了转录无标签的语音,我们使用 WhisperX 这个强大的 ASR 模型。为了获得说话人信息,我们使用开源的说话人分类模型 pyannote.audio,它在 VoxConverseAISHELL-4 数据集上的 DER 分别为 11.24 % 11.24\% 11.24% 14.09 % 14.09\% 14.09%。在该实验中,我们没有修改模型的超参数配置。表 6 给出了结果。可以看到,增加数据量能提升生成语音的说话人相似度。

表 6

C. 关于自适应 TTS 的定义

自适应 TTS 的概念包括了很多方面,比如不同声音、语言和风格的自适应。在学术界和工业界,它也被称为声音自适应,声音克隆和自定义声音等等。在本文中,我们主要关注针对不同声音的自适应 TTS

D. Attention 矩阵的可视化

为了进一步验证提出的 P-LLM 和多句 prompting 机制,我们对 P-LLM 中所有层的 attention 矩阵进行了平均,并将其展示在图 6 中。在该实验中,我们分别进行了短句生成和长句生成。对于短句生成,我们随机从 LibriSpeech 干净测试集中选取说话人 “908” 的两句时长小于 3 3 3 秒的句子,并将其拼接到一起。图 6 (a)(b) 中的目标文本都大约含有 15 15 15 个单词。对于长句生成,我们选取该说话人的两句时长大于 15 15 15 秒的句子,并将其拼接到一起。图 6 (a)(b) 中的目标文本都大约含有 100 100 100 个单词。可以看到,我们的 P-LLM 能够捕捉到短时和长时信息,这说明了 P-LLM 训练策略和多句 prompting 机制的有效性。

图 6

E. 局限性和伦理影响

E.1. 局限性以及未来的方向

首先,我们的模型只支持英语。我们计划引入多语言数据集来训练模型。其次,可以使用更高质量的训练数据来提升生成的语音质量。最后,可以精心设计注意力窗口,来增强 P-LLMin-context-learning 能力。

E.2. 伦理影响

Mega-TTS 2 提高了 zero-shot 语音合成的质量和效率,使得合成个性化语音变得更容易。在适当和合法的使用下,该技术可以促进电影、游戏和播客灯应用的发展,使人们生活更加便捷。然而,zero-shot TTS 也可能被滥用。为了解决此问题,应考虑深度伪造检测模型等潜在解决方案。我们还计划在合成的语音中添加水印。此外,我们项目的许可证中将包含限制,以防止模型被滥用。

F. BOTTLENECK 信息描述

信息 bottleneck B ( ⋅ ) B(\cdot) B() 的设置对我们方法中的的解耦性能至关重要。直觉上,有四个关键变量可以确保一个合适的信息 bottleneckcodebook embedding 的数量、codebook 的通道数、VQ 编码器的压缩率 r r rMRTE 的下采样率 d d d。然而这些超参数的搜索空间太大了。因为 r r r d d d 的设置也会影响重建质量和计算需求等,所以我们首先讨论 r r r d d d,然后找出 codebook 超参数的最优配置。

压缩率 r r r   我们评估了 VQ 编码器中的压缩率 r r r 取不同值时的情况。在这个实验中,我们发现较低的压缩率会让压缩声学自编码器的重建性能更好,但由于生成的 token 序列会更长,因此会加重 P-LLM 的负担。如表 7 所示,虽然 r = 2 r=2 r=2 得到了最好的客观相似分,但主观语音质量和相似度都显著降低,这意味着生成的最终质量受到了影响。因此,我们选择 r = 8 r=8 r=8,来达到重建质量和压缩之间的最佳平衡。

表 7

下采样率 d d d   我们评估了 MRTE 中的下采样率 d d d 取不同值时的情况。结果如表 8 所示,可以看到当 d d d 较低时,梅尔谱序列可以给音色编码器提供更多的信息,从而得到更好的重建。然而,较低的下采样率会对 MRTE 中的注意力操作造成显著的计算负担。为了降低计算复杂度的同时能保持音色重构的质量,我们令 d = 16 d=16 d=16

表 8

不同数据量的信息 Bottleneck   直觉上,信息 bottleneck 的性能可能会对数据量相当敏感。因此,我们通过实验分析了数据集大小和超参数之间的关系,结果见附录 G。尽管在整个实验过程中超参数保持不变,但我们发现该模型在不同数据量时始终表现良好。

G. 使用不同大小的训练数据进行扩展

我们评估了不同数据量的情况下 Mega-TTS 2 的表现。在这个实验中,所有的系统都使用 3 3 3 秒时长的语音 prompts,结果如表 9 所示。可以看到,在不同训练数据量的情况下,Mega-TTS 2 均表现得较好,而当数据量不足的时候,VALL-E 性能较差。我们还使用 200 K 200\text{K} 200K 小时的语音数据对 Mega-TTS 2 进行了训练,结果见附录 B

表 9

H. 韵律建模策略

在本小节中,我们通过实验验证了音素级、单词级和 stride- 8 8 8 级的韵律建模。Stride- 8 8 8 表示 VQ 编码器中的池化层的 stride 被设置为 8 8 8。值得注意的是 ProsoSpeech 使用单词级的韵律建模。我们都使用的自回归的 Transformer。然而,ProsoSpeech 旨在提高韵律建模的自然度。我们的 P-LLM 旨在提高说话人相关的韵律模式的相似性,它借助于 LLM 强大的 in-context 学习能力,从隐韵律 prompts 中提取细粒度的韵律信息。实验结果如表 10 所示,可以看到 stride- 8 8 8 级的韵律建模的性能最佳。直觉上来说,音素级的韵律建模为更好的重建提供了细粒度的信息,而单词级的韵律建模提供了更多的语义信息。这两种方法在训练和推理阶段,都很容易受语音对齐精度的影响。为了提高模型的稳定性和性能,我们使用 stride- 8 8 8 级的韵律建模。

表 10

I. 假设 1 的特殊情况

在实际场景中,假设 1 存在一种特殊情况:说话人的音色在不同时间段可能会有显著差异。为了处理这种特殊情况,我们尽可能从靠近 y t y_t yt 的区域中随机选择 y ~ \widetilde{y} y ,以确保 y ~ \widetilde{y} y 的音色信息与 y t y_t yt 相近。

J. 训练期间不同长度的上下文

我们分别用不同数量的上下文 VQ code tokens 来训练 P-LLM,并用不同数量的上下文梅尔谱帧来训练压缩声学自编码器。结果如图 7 所示,可以看到当我们增加上下文长度时,训练期间模型的性能有显著提升,这说明了多参考训练策略的有效性。

图 7

K. 鲁棒语音合成更多案例的说明

Mega-TTS 2 中,我们只使用一个语言模型来建模韵律,这使得我们的模型能从 LLM 强大的 in-context 学习能力中获益。这种方法还有助于解决自回归 TTS 模型中的鲁棒性问题(单词跳过或重复)。因此,我们对鲁棒语音合成的更多案例进行解释,以证明我们方法的必要性。在商业场景和新闻报道等正式场景中,鲁棒性是一个至关重要的因素。仅仅是个别的单词跳过或重复都会带来很严重的负面影响。这些情况更适合那些可以确保鲁棒性的带有时长建模能力的模型,比如 FastSpeech、Glow-TTSMega-TTS 2。然而,对于像 tacotron 这类的模型,单词遗漏或重复会严重影响听感。另一方面,在一些场景下,鲁棒性相对来说没那么重要。例如,对话场景中偶尔出现的缺词或重复也可以是很自然的。

L. 参考 PROMPTS 含噪的结果

为了验证我们的模型对含噪的参考 prompts 也是鲁棒的,我们在 LibriSpeech test-other 集上进行了实验。实验设置与 4.2 节中的保持一致,结果如表 11 所示。可以看到 Mega-TTS 2 在参考 prompts 含噪的情况下,仍然保持了优异的性能。

表 11

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946500.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【服务器】上传文件到服务器并训练深度学习模型下载服务器文件到本地

前言&#xff1a;本文教程为&#xff0c;上传文件到服务器并训练深度学习模型&#xff0c;与下载服务器文件到本地。演示指令输入&#xff0c;完整的上传文件到服务器&#xff0c;并训练模型过程&#xff1b;并演示完整的下载服务器文件到本地的过程。 本文使用的服务器为云服…

什么是TDD测试驱动开发(Test Driven Development)?

什么是测试驱动开发&#xff1f; 软件开发团队通常会编写自动化测试套件来防止回归。这些测试通常是在编写应用程序功能代码之后编写的。我们将采用另一种方法&#xff1a;在实现应用程序代码之前编写测试。这称为测试驱动开发 (TDD)。 为什么要应用 TDD&#xff1f;通过在实…

LLaMA详解

LLaMA 进化史 大规模语言模型(Large Language Model, LLM)的快速发展正在以前所未有的速度推动人工智能(AI)技术的进步。 作为这一领域的先行者, Meta在其LLaMA(Large Language Model Meta AI)系列模型上取得了一系列重大突破。 近日, Meta官方正式宣布推出LLaMA-3, 作为继LL…

connect to host github.com port 22: Connection timed out 的解决方法

原因是 Github 被 GFW 屏蔽了。 Windows 系统&#xff0c;打开 C:\Windows\System32\drivers\etc&#xff0c;复制其中的 hosts 文件至桌面&#xff0c;用文本编辑器或者其他工具打开。 复制以下内容进去&#xff1a; 140.82.114.4 github.com 151.101.1.6 github.global.ss…

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】 1.1 漏洞分析1.2 漏洞合约1.3 攻击分析1.4 攻击合约 重点&#xff1a;MaxMint721 漏洞合约的 mint 函数调用了 ERC721 合约中的 _checkOnERC721Received 函数&#xff0c;触发 to 地址中实…

springboot-启动流程

by shihang.mai 1. 启动流程图 查看springboot2.3.7源码后绘制下图。 springboot启动流程图 main启动&#xff0c;new SpringApplication()构造方法里面 判断当前应用程序类型reactive、servlet、none获取所有的ApplicationListener对应的对象获取所有的ApplicationContextInit…

Qt解决可执行程序的图标问题(CMake)

通常情况下&#xff0c;我们编译生成的可执行程序的图标长这个样子&#xff1a; 可以看到他的图标非常丑陋。。。 要想改变图标&#xff0c;你需要通过以下方式&#xff1a; CMakeLists.txt : cmake_minimum_required(VERSION 3.10)project(CountCode VERSION 1.0 LANGUAGE…

Docker Compose编排

什么是 Docker Compose? Docker Compose 是 Docker 官方推出的开源项目&#xff0c;用于快速编排和管理多个 Docker 容器的应用程序。它允许用户通过一个 YAML 格式的配置文件 docker-compose.yml 来定义和运行多个相关联的应用容器&#xff0c;从而实现对容器的统一管理和编…

Jenkins管理多版本python环境

场景&#xff1a;项目有用到python3.8和3.9&#xff0c;python环境直接安装在jenkins容器内。 1、进入jenkins容器 docker exec -it jenkins /bin/bash 2、安装前置编译环境 # 提前安装&#xff0c;以便接下来的配置操作 apt-get -y install gcc automake autoconf libtool ma…

PLCT-rvos-ch03 编译与链接 课后习题

练习3-1 问题 使⽤gcc编译代码并使⽤binutils⼯具对⽣成的⽬标文件和可执⾏文件&#xff08;ELF 格式&#xff09;进⾏分析。具体要求如下&#xff1a; 编写⼀个简单的打印 “hello world&#xff01;” 的程序源文件&#xff1a;hello.c对源文件进⾏本地编译&#xff0c;⽣成…

Xilinx FPGA的Bitstream比特流加密设置方法

关于Xilinx FPGA的Bitstream比特流加密设置方法更多信息可参阅应用笔记xapp1084。 使用加密bitstream分两个步骤&#xff1a; 将bitstream的AES密钥存储在FPGA芯片内将使用AES密钥加密的Bitstream通过SPI Flash或JTAG加载至FPGA芯片 AES密钥可以存储在两个存储区之一&#x…

基于BiLSTM和随机森林回归模型的序列数据预测

本文以新冠疫情相关数据集为案例,进行新冠数量预测。(源码请留言或评论) 首先介绍相关理论概念: 序列数据特点 序列数据是人工智能和机器学习领域的重要研究对象,在多个应用领域展现出独特的特征。这种数据类型的核心特点是 元素之间的顺序至关重要 ,反映了数据内在的时…

生成文本格式日历的Python程序

2025年日历生成Python代码 功能介绍 这段代码用于生成2025年的完整日历&#xff0c;并以文本格式保存为一个文件。日历的每个月包含日期和星期的排列&#xff0c;清晰展示了一年的所有日期信息&#xff0c;最后保存为一个 .txt 文件。 实现步骤 导入 calendar 模块&#xff1…

多态超详细介绍

一、多态 1.多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;多态就是多种形态。多态分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09; &#xff0c;这⾥我们重点讲运⾏时多态。编译时多态主要就是函数模板与函数重载&…

Xilinx Vivado环境下载bit后自动触发ILA采集

文章目录 前言操作方法注意事项参考资料 前言 为了观察一些信号变化的瞬间&#xff0c;我们通常将它们加入到ILA中&#xff0c;并设置触发条件&#xff0c;比如上升沿下降沿&#xff0c;或指定的某个值。大多数情况下&#xff0c;我们是下载完bit文件&#xff0c;并在FPGA运行…

[react+ts] useRef获取自定义组件dom或方法声明

想用useRef获取自定义组件? 如果获取dom,直接写 const sonRef useRef<HTMLDivElement>(null); 然后子组件用forwardRef包一层,注意是HTMLDivElement,别写错, 写HTMLElement不行 const Son forwardRef<HTMLDivElement, IProps>((props, ref) > {}) 切记这…

gitlab的搭建及使用

1、环境准备 服务器准备 CentOS Linux release 7.9.2009 (Core)&#xff0c;内存至少4G。 修改主机名和配置ip地址 hostnamectl set-hostname <hostname> 关闭主机的防火墙 # 关闭防火墙 systemctl stop firewalld #临时关闭防火墙 systemctl disable firewalld …

No.2十六届蓝桥杯备战|练习题4道|数据类型|字符型|整型|浮点型|布尔型|signed|unsigned(C++)

B2002 Hello,World! - 洛谷 #include <iostream> using namespace std; int main() { cout << "Hello,World!" << endl; return 0; }打印飞机 #include <iostream> using namespace std;int main() {cout << " …

Dockerfile运行指令

1.RUN 在build构建时执行命令。 举例&#xff1a;安装vim Shell命令格式 RUN yum install -y vim Exec命令格式 RUN ["yum","install","-y","vim"] 2.CMD 用于设置容器启动时默认执行的命令或参数。 如果Dockerfile中有多个CMD&a…

OpenAI发布o3:圣诞前夜的AI惊喜,颠覆性突破还是技术焦虑?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…