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

news2025/1/4 11:56:48

本文对 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

haproxy+nginx负载均衡实验

准备三台虚拟机&#xff1a; HAProxy 服务器192.168.65.131Web 服务器 1192.168.65.132Web 服务器 2192.168.65.133 在 HAProxy 服务器&#xff08;192.168.65.131&#xff09;上操作&#xff1a; 安装 HAProxy&#xff1a; sudo yum install -y haproxy编辑 HAProxy 配置…

[论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

华三交换机怎么进行链路聚合?

目录 准备&#xff1a;两台交换机 配置&#xff1a;进行交换机配置 完成&#xff1a;检查链路聚合是否成功 准备&#xff1a;两台交换机 1、进行连线 2、上行Core交换机都选取 Ten-GigabitEthernet1/0/51、Ten-GigabitEthernet1/0/52和 Ten-GigabitEthernet2/0/51、Ten-Giga…

【无线传感网】无线传感器网络覆盖技术

文章目录 覆盖算法设计思路及性能评价标准覆盖感知模型布尔感知模型概率感知模型 无线传感网络覆盖算法分类按照配置方式确定性覆盖随机性覆盖 根据覆盖目标面覆盖点覆盖栅栏覆盖 典型的WSN覆盖算法与协议基于网格的覆盖定位传感器配置算法圆周覆盖连通传感器覆盖轮换活跃/休眠…

积分图(Integral Image)与均值滤波的快速实现

积分图&#xff08;Integral Image&#xff09;也称为求和图&#xff08;Summed Area Table&#xff09;&#xff0c;是一种用于快速计算图像中任意矩形区域像素值总和的技术。 基本概念 积分图的每个位置(i, j)存储的是从图像左上角(1, 1)到当前位置(i, j)所有像素值的累积和…

MySQL数据库笔记——多版本并发控制MVCC

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍MySQL的并发控制&#xff1a;多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…

css3实现文字下滑波浪线

上效果 上菜 text-decoration 属性作用&#xff1a;用于设置或检索文本的装饰线&#xff0c;如下划线、上划线、删除线等 text-decoration: line || color || style; 参数&#xff1a; line: 指定装饰线类型&#xff0c;如 underline&#xff08;下划线&#xff09;、overline&…

Springboot 3项目整合Knife4j接口文档(接口分组详细教程)

文章目录 前言一、Spring Boot 3.0整合Knife4j二、OpenApi 3注解的使用规范三、使用步骤 1.Spring Boot 3.0项目中使用knife4j2.在application.yml中添加knife4j相关配置3.设置WebMvc相关配置&#xff08;解决封装统一异常处理后doc.html无法打开的问题&#xff09;4.创建Knif…

2024年中国新能源汽车用车发展怎么样 PaperGPT(一)

概述 在国家政策的强力扶持下&#xff0c;2024年中国新能源汽车市场迎来了新的发展机遇。本文将基于《中国新能源汽车用车报告&#xff08;2024年&#xff09;》的数据&#xff0c;对新能源汽车的市场发展和用车趋势概述。 新能源汽车市场发展 政策推动&#xff1a;国家和地…

华三交换机如何进行堆叠?

准备&#xff1a;两台交换机堆叠 1、进行连线 2、交换机都选取 FortyGigE1/0/53 和 FortyGigE1/0/54 做 堆叠口 配置&#xff1a;进行交换机配置 X_T1_Core_1&#xff1a; [X_T1_Core_1]irf domain 0 //同一拓扑内如果有其它堆叠组&#xff0c;domain不能重复 [X_T1_Core_1]…

活动预告 | Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…

Sonic:开源Go语言开发的高性能博客平台

Sonic&#xff1a;一个用Go语言开发的高性能博客平台 简介 Sonic&#xff0c;一个以其速度如声速般快速而命名的博客平台&#xff0c;是一个用Go语言开发的高性能博客系统。正如其名字所暗示的&#xff0c;Sonic旨在提供一个简单而强大的博客解决方案。这个项目受到了Halo项目…

大模型WebUI:Gradio全解系列8——Additional Features:补充特性(上)

大模型WebUI&#xff1a;Gradio全解系列8——Additional Features&#xff1a;补充特性&#xff08;上&#xff09; 前言本篇摘要8. Additional Features&#xff1a;补充特性8.1 队列8.1.1 使用方法8.1.2 配置队列演示 8.2 输入输出流8.2.1 输出流1. 生成器yield2. 流媒体 8.2…

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为PS文件呢&#xff1f;它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

【Leetcode】3280. 将日期转换为二进制表示

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个字符串 date&#xff0c;它的格式为 yyyy-mm-dd&#xff0c;表示一个公历日期。 date 可以重写为二进制表示&#xff0c;只需要将年、月、日分别转换为对应的二进制表示&a…

Spring实现输出带动态标签的日志

版权说明&#xff1a; 本文由博主keep丶原创&#xff0c;转载请保留此块内容在文首。 原文地址&#xff1a; https://blog.csdn.net/qq_38688267/article/details/144851857 文章目录 背景底层原理实现方案Tag缓存实现封装注解通过AOP实现日志缓存封装行为参数通用方法实现手动…

JAVA: 状态模式(State Pattern)的技术指南

1、简述 状态模式是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。它将状态相关的行为抽取到独立的状态类中,使得增加新状态变得简单,且不影响其他状态。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 本文将详细介绍状态模式的概念…

小程序基础 —— 02 微信小程序账号注册

微信小程序账号注册 小程序开发与网页开发不一样&#xff0c;在开始微信小程序开发之前&#xff0c;需要访问微信公众平台&#xff0c;注册一个微信小程序账号。 有了小程序的账号以后&#xff0c;才可以开发和管理小程序&#xff0c;后续需要通过该账号进行开发信息的设置、…

安卓入门十一 常用网络协议四

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09; MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下&#xff0c;实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式&#xff1a;MQTT 使用发布/订…

在 Swift 中使用 SQL 组合人员和地址数据

文章目录 摘要描述问题描述示例输入与输出 Swift 代码解决方案代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在本篇文章中&#xff0c;我们将讨论如何结合两个表——Person 和 Address&#xff0c;以便生成包含每个人的姓名和地址信息的结果表。如果某人的地址信息不…