常见的编解码器模型以及压缩token数

目前主流的音频编解码器的一些指标

数据来源:wavtokenizer: an efficient acoustic discrete codec tokenizer for audio language modeling

计算公式:

假设码本大小2^n,每秒语音的hz=BW/(Nq*n),token=Nq* 每秒语音的hz , 每秒语音的hz =token/Nq

ModelBandwidth Nq 量化器数量
(number of quantizers.)
token/s ↓ 码本大小
GT
DAC 9.0kpbs 99001024
Encodec6.0kbps86001024
Vocos6.0kbps86001024
SpeechTokenizer6.0kpbs86001024
DAC4.0kbps44001024
HiFi-Codec3.0kbps44002^7.5
HiFi-Codec4.0kbps43002^13
Encodec3.0kbps43001024
Vocos3.0kbps 43001024
SpeechTokenizer3.0kbps 43001024
WavTokenizer-small0.5kbps140 4096
WavTokenizer-small0.9kbps175 4096
Mini 1.1kbps81002048

Qwen2 技术报告

Abs:https://arxiv.org/abs/2407.10671
Code:https://github.com/QwenLM/Qwen2

Qwen 团队近日发布了目前最强开源大模型 Qwen2 的技术报告。文中介绍了预训练和对齐过程中所采用的技术和方法,最后对模型进行了详细的评估。

 Abstract

发布了一系列的 Base 模型和 Instruct 模型,参数量从 0.5B 到 72B,包括 dense 系列模型和一个 MoE 模型。Qwen2 超越了包括 Qwen1.5 在内的大多数先前的开源模型。与闭源模型相比,在语言理解、生成、多语言、代码、数学、推理等不同基准上也表现出了有竞争力的性能。旗舰的 Qwen2-72B-Base 和 Qwen2-72B-Instruct 在许多评测集上表现出卓越的性能。此外,Qwen2 也展示出了鲁棒的多语言性能,精通大约 30 种语言,凸显了其全能性。Qwen2 模型权重在 Hugging Face 和 ModelScope 上进行了开源,样例代码在 Github 上进行了开源。

支持的语言:

Introduction

随着 ChatGPT 的问世,在全球掀起了 LLM 的热潮。Llama 系列模型的发布进一步激发了开源社区的兴趣。最近,Claude-3 Opus 和 GPT-4o 迅速登顶 Chatbot Arena 王座。此外,Llama-3 已经成为 SOTA 的开源系列模型,缩小了与领先的闭源模型的差距,被认为达到了 GPT-4 水平。越来越多的 LLM 正在追求 OpenAI 的 GPT 系列的进步,其中包括 Qwen、Mistral、Gemma 等在内的许多系列都是以开源形式发布的。

近几个月来,Qwen 团队成功发布了 Qwen 系列模型并进化为 Qwen1.5。同时,Qwen 团队推出了 vision-language 模型 Qwen-VL 和 audio-language 模型 Qwen-Audio。

在这篇技术报告中,Qwen 团队发布了最新的 Qwen2 系列 LLM。Transformer 架构,next-token prediction 训练。发布了包括 0.5B、1.5B、7B、72B 在内的 4 个 dense 模型以及 1 个 57B 的 MoE 模型(每个 token 激活其中 14B 参数)。所有的模型在一个超过 7T tokens 的高质量大规模数据集上进行预训练,数据涵盖广泛的领域和语种。与之前的 Qwen 版本相比,Qwen2 包含了更广泛的语言数据,提高了代码和数学数据的数量和质量。通常认为这可以提高 LLM 的推理能力。预训练后,所有模型都进行了 SFT 和 DPO。

Qwen 团队对 Qwen2 进行了全面评估,基本都优于竞品模型。Qwen2-72B-Instruct 在 MT-Bench 得分为 9.1,Arena-Hard 48.1,LiveCodeBench 35.7。Qwen2-72B-Base 在 MMLU 得分 84.2,GPQA 37.9,HumanEval 64.6,GSM8K 89.5,BBH 82.4。

Tokenizer & Model

这一节介绍 Qwen2 的 Tokenizer 和模型设计。

Tokenizer

采用与 Qwen 相同的基于 byte-leval 的 BPE Tokenizer。值得注意的是,这种 Tokenizer 具有很高的编码效率,从而促进了 Qwen2 的多语言能力。【字节对编码(BPE, Byte Pair Encoder),又称 digram coding 双字母组合编码,是一种数据压缩 算法,用来在固定大小的词表中实现可变⻓度的子词。该算法简单有效,因而目前它是最流行的方法。】

词汇表包含 151643 个常规 tokens 和 3 个 特殊控制 tokens。

Model Architecture

基于decoder-only Transformer 架构,带有 causal masks 的 self-attention。

包括 4 个规模的 dense 模型和 1 个 MoE 模型。

Qwen2 Dense Model:

模型架构包括多个 Transformer 层,每层具有 causal attention 机制和 FFN。

与先前 Qwen 系列模型的主要区别如下:

1、采用 GQA 来代替了传统的 multi-head attention。GQA 在推理过程中优化了 KV cache,可以显著提升吞吐量。

Paper:GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints
Abs:https://arxiv.org/abs/2305.13245

2、为了扩展 Qwen2 的上下文窗口,实现了 DCA,将长序列分割成具有可管理长度的 chunks。如果输入可以在一个 chunk 中处理,则 DCA 跟原始 attention 输出相同的结果。否则,DCA 通过有效捕获 chunks 内和 chunks 之间 tokens 的相对位置信息来提升上下文性能。此外,还通过 YARN 来重新缩放注意力权重,以实现更好的长度外推。

  • Paper:Training-Free Long-Context Scaling of Large Language Models
    Abs:https://arxiv.org/abs/2402.17463
  • Paper:YaRN: Efficient Context Window Extension of Large Language Models
    Abs:https://arxiv.org/abs/2309.00071

3、激活函数 SwiGLU,位置编码 RoPE,QKV bias,RMSNorm,pre-norm。

Qwen2 Mixture-of-Experts Model

Qwen2 MoE 的架构和 Qwen1.5-MoE-A2.7B 非常相似。

MoE FFN 由 n 个单独的 FFN 组成,每个 FFN 是一个专家。输入的每个 token 被定向到特定的专家 Ei 来根据门控网络 G 分配的概率进行计算:

接下来,介绍 Qwen2 MoE 中重要的设计考虑。

  •  Expert Granularity

MoE 模型和 dense 模型间的关键结构差异在于 MoE 层有多个 FFN,每个 FFN 是一个独立的专家。因此,直接将每个专家的参数设置为原始 dense 模型中 FFN 的参数即可从 dense 架构过度到 MoE 架构。

Mistral-7B 到 Mixtral 8x7B 每次从 8 个专家中激活 2 个。而 Qwen2 MoE 采用细粒度专家,在创建小规模专家的同时激活更多数量的专家。给定相同数量的专家参数和激活参数,细粒度专家可以提供更丰富的专家组合。

通过利用这些细粒度专家,Qwen2 MoE 促进了更多样和动态的专家使用,从而提高了整体的性能和适配性。

  • Expert Routing

专家路由机制的设计对提升 MoE 模型的性能至关重要。

近期,在 MoE 层内整合 shared 和 routing-specific 专家有着显著趋势。Qwen2 MoE 采用了这种方法,因为这样促进了 shared 专家在不同任务中的应用,同时保留了其他专家在特定路由场景中的选择性应用。shared 和 specialized 专家的引入为 MoE 路由机制提供了一种适应性更强、更有效的方案。

  • Expert Initialization
Paper:Sparse Upcycling: Training Mixture-of-Experts from Dense Checkpoints
Abs:https://arxiv.org/abs/2212.05055

初始化专家的方式与 upcycling 相似,利用 dense 模型的权重。但 Qwen2 MoE 的方法强调细粒度专家之间的多样化。

给定指定细粒度专家的中间层大小 hE ,专家数量 n ,原始 FFN 中间层大小 hFFN ,则将 FFN 复制 ⌈hFFNn×hE⌉ 次。可以容纳任意数量的专家。

为了促进每个 FFN copy 的多样性,对参数沿着中间层纬度进行 shuffle。这保证了每个细粒度专家即使在不同的 FFN copy 中表现出独特的特征。

之后,从 FFN copies 中提取出细粒度专家,丢弃其余的维度。

对于每个细粒度专家,将 50% 的参数重新随机初始化。这个过程引入了额外的随机性,可能有助于增强模型在训练过程中的探索能力。

Model Configuration

5 个不同规模的模型:

  •  Qwen2-0.5B
  •  Qwen2-1.5B
  •  Qwen2-7B
  •  Qwen2-57B-A14B
  •  Qwen2-72B

Qwen2-57B-A14B 是从 Qwen2-7B 升级而来。

值得注意的是,与 Qwen1.5 相比,Qwen2 模型每个 token 的 Key-Value(KV)大小要低得多。这样可以减少内存占用,在长上下文推理中更有优势。

Pre-Training

对于 Qwen2 的预训练,重点是优化数据集并且探索上下文长度扩展的有效方法。

Pre-Training Data

一个新的、大规模、高质量的多语言数据集。

与之前的 Qwen 和 Qwen1.5 相比,在语料库上有所改进,增强了几个关键领域的数据规模、质量和多样性。

Quality Enhancement

通过额外的启发式算法和基于模型的方法对数据过滤算法进行改进,包括使用 Qwen 模型过滤出低质量的数据。此外,这些模型被用于合成高质量的预训练数据。

Data Expansion

与 Qwen1.5 相比,Qwen2 收集了大量高质量的代码、数学和多语言数据,增强了模型对应的能力。

新的数据集支持大约 30 种语言,例如英语、中文、西班牙语、法语、德语、阿拉伯语、俄语、韩语、日语、泰语和越南语。

Distribution Improvement

为了确保模型学习的分布类似于人类,对小模型进行了实验来优化不同来源和领域数据的混合。

基于此,预训练数据从 Qwen1.5 的 3T tokens 增加到了 7T tokens。进一步放宽阈值则有 12T tokens。

然而,在 12T tokens 数据集上训练的模型(0.5B)没有比 7T tokens 上的模型有显著的性能提升。可以怀疑数据量的增加不一定有益于模型的训练。

因此,考虑到成本,选择使用更高质量的 7T tokens 数据集来训练更大的模型。

所有的 Qwen2 dense 模型(不包括 Qwen2-0.5B)都是在 7T tokens 数据集上预训练的。Qwen-0.5B 在 12T tokens 数据集上预训练。MoE 模型根据 upcycling 原则额外经过了4.5T tokens 预训练。

与之前的 Qwen 模型类似,高质量的多任务 instruction 数据被整合到 Qwen2 的预训练之中,以提高模型的 ICL 和 instruction-following 能力。

Long-Context Training

为了增强 Qwen2 的长上下文能力,在预训练的结束阶段将上下文长度从 4096 tokens 增加到了 32768 tokens。这一扩展过程引入了大量高质量、更长的数据。同时将 RoPE 的基频从 10000 修改为 1000000,以优化长上下文场景中的性能。

为了充分利用模型的长度外推潜力,采用了 YARN 机制和 Dual Chunk Attention 机制。这些策略使模型可以处理多达 131072 tokens 序列,同时保持较高的性能。

Post-Training

在大规模预训练之后,对 Qwen2 进行了 post-training。这一过程对于提升模型在包括代码、数学、逻辑推理、指令遵循、多语言理解等领域的能力很重要。此外,这一过程也确保了模型生成的内容与人类价值观对齐,使模型 helpful、诚实、无害。

与严重依赖大量人工监督的传统方法不同,Qwen2 更侧重于可扩展的对齐,尽量减少人工标注。具体来说,研究了获取 SFT 和 RLHF 高质量数据的方法,旨在提升数据质量和可靠性的同时减少对人类标柱的需求。

Post-Training Data

数据主要由两部分组成:

  •  demonstration 数据 D={(xi,yi)}
  • • 偏好数据 P={(xi,yi+,yi−)}

其中, xi 表示指令(instruction), yi 表示 response, yi+ 和 yi− 是 xi 的两个 response,但 yi+比yi− 更符合人类偏好。SFT 使用的数据集为 D ,RLHF 使用的数据集为 P 。

训练数据的构建包括两个步骤:协作式数据标注和自动化数据合成。

首先,从大规模的指令语料库中提取数据本体,从而得到一批广泛而多样的高质量指令。这些指令通过系统化增强来增加复杂性。通过人工标注,得到了 targetresponseyi 和正负例对 (yi+,yi−) 。

随后,许多自动化对齐策略被应用于大量合成代码、数学、指令遵循、创作、角色扮演、安全等领域的人工标注数据。

Collaborative Data Annotation

  • Automatic Ontology Extraction
Paper:InsTag: Instruction Tagging for Analyzing Supervised Fine-tuning of Large Language Models
Abs:https://arxiv.org/abs/2308.07074

首先应用一个开放式细粒度标注器 InsTag 来从大规模指令数据中提取出底层本体。后续进行手工优化确保提取的本体的准确性。

  • Instruction Selection
Paper:How Abilities in Large Language Models are Affected by Supervised Fine-tuning Data Composition
Abs:https://arxiv.org/abs/2310.05492

每个带有 tag 标记的指令都会根据 tag 多样性、语义丰富行、复杂性、意图完整性进行评估。选择一组具有代表性的指令。

  • Instruction Evolution
Paper:ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools
Abs:https://arxiv.org/abs/2406.12793

为了丰富指令数据集,采用了 self-evolution 策略来 prompt Qwen 模型向现有的指令添加约束或要求,从而增加指令的复杂度并确保数据集中难度分布的多样性。

  • Human Annotation

使用不同的生成策略和不同规模的 Qwen 模型获得对指令的多个 responses。标注者根据他们的偏好对这些 responses 进行排序,确保最佳 response 符合要求,进而产生 demonstration 和偏好数据。

Automated Data Synthesis

保证指令 response 的标注质量是一个巨大的挑战,特别是那些需要专业知识、经验、细心或耐心的标注。因此,设计了多种自动对齐策略来大规模合成数据。

  • Rejection Sampling
Paper:Scaling Relationship on Learning Mathematical Reasoning with Large Language Models
Abs:https://arxiv.org/abs/2308.01825

对于数学等带有明确最终答案的任务,采用拒绝采样来提升 solution 的质量。

LLM 被用来为每个指令生成多个推理路径 responses。保留可以得出准确结果并且被模型认为合理的推理路径,作为 demonstration 数据。通过对比正确和不正确的推理路径来获得偏好数据。

  • Execution Feedback

对于代码任务,LLM 被用来生成解决方案和相关测试用例。通过根据测试用例编译和执行生成的解决方案来评估其有效性,从而得到 demonstration 和 偏好数据。

Paper:Self-play with Execution Feedback: Improving Instruction-following Capabilities of Large Language Models
Abs:https://arxiv.org/abs/2406.13542

这种方法也可以应用于评估指令遵循能力。对于有约束条件的指令,LLM 可以生成 Python 验证函数,确保 response 符合指令的要求。

  • Data Repurposing

对于没有受过专业训练的标注人员来说,在文学写作任务中很难给出熟练的 response。为了解决这个问题,从公开领域收集高质量的文学作品,用 LLM 来给出带有不同程度的细节的指令。得到的指令和原始文学作品一起作为 demonstration 数据。

Paper:Large Language Models are Superpositions of All Characters: Attaining Arbitrary Role-play via Self-Alignment
Abs:https://arxiv.org/abs/2401.12474

例如,为了得到生动逼真的角色扮演 responses,从维基百科等知识库中获取详细的角色简介,然后指示 LLM 生成相应的指令和 responses。这个类似阅读理解任务的过程可以确保保持角色简介的完整性。

  • Constitutional Feedback
Paper:Constitutional AI: Harmlessness from AI Feedback
Abs:https://arxiv.org/abs/2212.08073

Constitutional AI 指的是通过引导 LLM 来基于预定义的规则生成 responses 的过程。为了确保遵守安全和价值观等准则,编制了 constitution 数据集。数据集描述了 LLM 应该遵循和应该避免的原则,用于指示 LLM 做出与这些规则一致或者偏离的 responses,进而作为 demonstration 和偏好数据的参考。

Supervised Fine-Tuning

收集了一个大规模 SFT 数据集,包含了超过 50 万条数据,涵盖指令遵循、代码、数学、逻辑推理、角色扮演、多语言、安全等领域。

模型微调 2 个 epoch,序列长度 32768 tokens。学习率从 7×10−6 逐渐降低到 7×10−7 。

为了解决过拟合问题,应用了 0.1 的 weight decay,并进行上限为 1.0 的梯度裁剪。

Reinforcement Learning from Human Feedback

Paper:Direct Preference Optimization: Your Language Model is Secretly a Reward Model
Abs:https://arxiv.org/abs/2305.18290

Paper:Online Merging Optimizers for Boosting Rewards and Mitigating Tax in Alignment
Abs:https://arxiv.org/abs/2405.17931

RLHF 训练包括两个连续的阶段:offline 和 online 训练。

在 offline 训练阶段,使用预先准备好的偏好数据集 P 进行 DPO 训练。

在 online 训练阶段,模型利用奖励模型(Reward Model,RM) 实时地迭代式提升。具体来说,从当前的 policy 模型中采样多个 response,用 RM 来选择最佳和最差的 response 来形成每一段 DPO 训练的偏好 pair 数据。此外,还采用 Online Merging Optimizer 来缓解对齐税问题(模型与人类对齐过程中造成的性能下降)。

Evaluation

为了全面评估 Qwen2 Base 模型和 Instruct 模型,实施了一个全面评估协议。协议考差了包括一般知识理解、语言理解、生成、代码、数学、推理和其他专业领域等一系列能力。

具体来说,除非另有说明,用 LLM 通过 few-shot prompting 对 Base 模型进行 benchmark 评估。对于 Instruct 模型,除了 benchmark 评估外,还优先考虑人类偏好评估。

Base Language Models

Core Capabilities

只放 72B 和 7B 结果,更多更详细的结果见原始论文。

Instruction-Tuned Model

Open Benchmark Evaluation

In-House Automatic Evalution

 Long Context Capabilities

Multilingual Evaluation

Safety & Responsebility

Conclusion

本技术报告介绍了 Qwen2 系列,一套多功能的 Base 和 Instruct 语言模型,参数从 0.5B 到 72B 不等,包括 dense 模型和 MoE 模型。

Qwen2 超越了之前的开源模型,在语言理解、生成、多语言能力、代码、数学、推理等广泛的 benchmark 评估中表现出了与闭源模型的竞争力。

在本次的 Qwen2 更新中,我们特别关注长上下文、多语言、代码、数学、安全和 responsibility。

为了促进社区的发展和开放,我们开源了 Qwen2 模型权重,使研究人员和开发人员能够在各种应用和研究项目中充分利用 Qwen2 的潜力。我们的目标是为 AI 技术的进步及其对社会的积极影响做出贡献。

基于MEL谱+VQ的TTS相关工作

Zero-shot TTS中有不少工作用了MEL谱作为中间特征,然后在梅尔谱的基础上,或是用VQ提供离散token,或是用CNN来提取连续latent。对于MEL+VQ的工作,有tortoise-tts、xtts 1&2、megatts1&2、base TTS。

Tortoise-tts

论文:https://arxiv.org/abs/2305.07243

该工作是著名的开源英文TTS模型。其作者目前在OpenAI就职,同时也是GPT-4o的重要Contributor(他自个儿在博客中说的)。Tortoise-tts使用MEL+VQVAE的方法得到语音的MEL token,然后对MEL token以及text token做GPT自回归建模。对于语音的解码,自然也是分为两步:先是用扩散模型将MEL token转换为MEL谱,这一步和文生图很像,用扩散模型是很自然的选择;然后用声码器将MEL谱转换为音频波形。tortoise-tts和VALL-E的主体都是自回归建模,二者的不同主要在于token的不同。

MegaTTS 1&2

Mega-TTS: Zero-Shot Text-to-Speech at Scale with Intrinsic Inductive Bias

Mega-TTS 2: Boosting Prompting Mechanisms for Zero-Shot Speech Synthesis

字节跳动的MegaTTS系列对语音token编码信息做了显式的信息压缩处理,让语音token仅编码上下文依赖强的韵律信息,然后用GPT自回归来建模语音的韵律。对于其他方面的信息,模型的处理显得较为常规:音色一般具有全局性,使用单一的音色编码器从参考音频中提取就性;对于文本语义内容的处理,模型在很大程度上参考了非自回归的FastSpeech 2。

对于语音的解码,也是分为两步:先通过MEL decoder还原为MEL谱,然后通过声码器解码为音频波形。MegaTTS 2和1总体上类似,在音色编码(音素级编码、多条参考音频)、语音提示长度(扩展同speaker语音上下文长度硬train,音频prompt长度更长)和时长建模(也用GPT自回归)上做了改进,同时堆了更大规模的数据。剪映的后端TTS模型用的就是megatts2。该工作在各论文的评测中表现也都不错。

认为语音可以分解为几个属性(例如,内容、音色、韵律和相位),每个属性都应该使用具有适当归纳偏差的模块进行建模。从这个角度出发,我们精心设计了一个新颖的大型零样本 TTS 系统,称为 Mega-TTS,该系统使用大规模的野生数据进行训练,并以不同的方式对不同的属性进行建模:1) 我们没有使用音频编解码器编码的潜在作为中间特征,而是仍然选择频谱图,因为它很好地分离了相位和其他属性。Phase 可以由基于 GAN 的声码器适当构建,不需要由语言模型建模。2) 我们使用全局向量对音色进行建模,因为音色是一个随时间缓慢变化的全局属性。3) 我们进一步使用基于 VQGAN 的声学模型来生成频谱图,并使用潜在代码语言模型来拟合韵律的分布,因为句子中的韵律会随着时间的推移而快速变化,并且语言模型可以捕获局部和长期依赖关系。

本文介绍了一种通用的零样本 TTS 提示机制 Mega-TTS 2,以应对上述挑战。具体而言,我们设计了一个强大的声学自动编码器,将韵律和音色信息分别编码到压缩的潜在空间中,同时提供高质量的重建。然后,我们提出了一个多参考音色编码器和一个韵律潜在语言模型 (P-LLM),用于从多句提示中提取有用信息。我们进一步利用从多个 P-LLM 输出得出的概率来产生可转移和可控制的韵律。实验结果表明,Mega-TTS 2 不仅可以使用来自任意来源的看不见的说话者的简短提示来合成身份保留语音,而且当数据量从 10 秒到 5 分钟不等时,其表现始终优于微调方法。

Zero-shot TTS技术路线汇总

参考:

1、OpenAI的生肉博客:https://openai.com/index/hello-gpt-4o/

2、别慌!一文教你看懂GPT-4o背后的语音技术

Zero-shot TTS模型通常会将低信息密度、长序列的连续语音数据压缩为高信息密度的tokens 或者 latents (其实就是码本中具体的 token embedding )。这些模型本质上做的事情就是:如何高效实现语音tokens / latents 到音频波形的映射。这些模型给出的解决方案基本上都遵循一个准则:语义token和声学token层次化解码,先语义后声学,或者先解码成Mel再后接声码器,并且非必要不做自回归(毕竟自回归上线虽高,但太吃数据了)!

1、语义token的解码:语义解码大概率是自回归解码语义token毕竟是建模上下文依赖关系,自回归方法已经在NLP上证明了这一点。

2、声学token的解码:使用扩散模型或者flow-matching可能是更好的选择扩散模型或者流匹配可以很好地修补语音的细节;

3、要做流式推理外接类似HIFIGAN这样的声码器的方式可能不是好的选择。HIFIGAN并不天然支持流式解码。相反地,诸如SoundStream和Encodec这样的方法,同时有流式变体和非流式变体;

上面说到,要实现语音的合成,需要对语义token和声学token同时进行建模,语义token保证生成语音与对话上下文的连贯性,声学token保证了合成语音的质量和表现力。要想做到合成上下文连贯的高自然度语音,有两个问题必须要解决:

  • 1、语音既有语义token,又有声学token,应该要如何解码成语音?
  • 2、在合成语音的过程中是否能够遵循多轮对话中的文本指令和语音指令?这个很重要!这允许模型根据用户的即时要求来生成语音回复。比如说,OpenAI演示视频中出现的:“将语速提高两倍”、“采用更加机械化的语气”这样的要求。

对于第一个问题,以VALL-E为代表的诸多zero-shot TTS模型给出了不同的解决方案,这些方案虽有不同,但也有不可忽视的共同点;对于第二个问题,以VoiceLDM和ParlerTTS为代表的text/prompt-guided zero-shot TTS工作给出了肯定的答案。简单解释一下text/prompt-guided zero-shot TTS是怎么回事,通常的语音合成就是将文本(transcription)转换成声音,该任务在transcription之外,又增加了description的输入,来描述合成语音的情感情绪、口音、语气、语速、音高、说话环境、氛围等等信息。我们逐个来看这些工作。

基于声学token或语义token的工作

先是微软的VALL-E[16]。这是zero-shot TTS的开山之作,首次在TTS任务上采用了上万小时的数据。它采用Encodec将语音转换为离散的token,然后用GPT 【only 解码器】 在token上做语言模型的任务。但是,语音毕竟不是文本,如果直接在语音的所有特征上都做自回归的话,那训练的成本会相当高。考虑到Encodec RVQ特征的层次性,低层特征表示语义内容这样的重要特征,高层特征则表征声学细节。前者具有比较强的上下文依赖关系,适合用自回归来建模,后者诸如音色这样的特征,具有全局性,用非自回归特征也可以搞定,所以就有了VALLE中自回归+非自回归的层次建模方式。

VALL-E的模型架构
语义token跟声学token的合成

尽管VALL-E[16]在用GPT 【only 解码器】 建模token的上下文关系的时候,基于token的层次化特性做了分治处理,可能是限于当前语音数据集的规模(几万小时可能不够),这种GPT 【only 解码器】 自回归的难度还是相当大的,解码过程存在常见的错误传播现象,鲁棒性非常差,极其不稳定。根据Ilya Sutskever此前对于自回归的论述,GPT 【only 解码器】 自回归相比于BERT这种双向结构是非常data-hungry的,万小时的数据可能不够。根据本人以及一些同行的经验,VALL-E模型这一类的自回归模型,也包括tortoise-tts[20]和xtts v2,要想显出威力,至少要有十几万小时的数据才行。

既然GPT【only 解码器】自回归的难度这么大,就有不少人想方设法地来降低GPT学习的难度了。他们的解决方案也非常类似:给GPT提供额外的条件信息不就行了。比较典型的工作就是微软的RALL-E[21]和吉利的HAM-TTS[22]。RALL-E先生成了时长信息和音高信息,作为GPT自回归的先验,之所以会补充时长和音高,这大概是受到FastSpeech2[23]这样的非自回归模型的启发,这两个指标的引入,有助于提升合成的鲁棒性;HAM-TTS则是补充了基于HuBERT的语义信息。值得注意地是,HAM-TTS将模型的训练数据扩充到了65万小时,其中有50万小时的数据是合成数据。合成数据也能大幅度提升合成语音的音质。

RALL-E的模型架构,框出来的就是辅助信息
HAM-TTS的模型架构

说到VALL-E的后续改进,VoiceCraft不得不提。我愿意称之为“优雅的VALL-E”。它的优雅主要体现在两个方面:casual masking和delayed stacking。所谓的causal masking,是为了用自回归GPT架构来做语音编辑任务,就是把被mask的部分移动到序列末尾去预测,一套架构同时做合成和编辑任务;所谓的delay stacking,是为了适配自回归和RVQ,通过delay错位让当前码本的token预测正好可以利用前面那些token的预测结果,比起VALL-E那样自回归和非自回归缝合在一起的结构要优雅不少。

基于声学/语义latents的工作

我们通常所说的语音token是离散的。如果使用对应码本中的embedding来表示语音的话,它也可以是连续的低维度的latent变量。既然是低维度的连续latent变量,那图像合成领域中大火的LDM(latent diffusion model,其实就是stable diffsion 1&2采用的模型)模型自然也可以用到语音的合成上。这方面的经典工作有很多,比如说:NaturalSpeech 2&3[25, 26]、AudioLDM 2[27]、VoiceLDM[18]。但这里面只有NaturalSpeech2用到了语音离散化部分提及的声学/语义token,NaturalSpeech3的属性分解形式的VQ更像是另一种形式的RVQ。我们先来看NaturalSpeech 2&3,其他的工作后面再来看。

首先是NaturalSpeech 2[26],利用带有残差向量量化器的神经音频编解码器来获得量化的潜在向量,并使用扩散模型来生成这些以文本输入为条件的潜在向量。它基本上就是VALL-E的连续版本。它用的latent也是来自Encodec,对其中不同层次的latent做了求和,然后将其作为扩散模型的训练目标。值得注意地是,扩散模型和FastSpeech2一样也用了时长和音高作为合成的先验条件。这一点也被后来的RALL-E采用。该工作中的扩散模型采用WaveNet实现,同时预测不加噪的latent和后验均值,和图像合成领域的扩散模型在实现方式上还是有所不同的。

此图片的alt属性为空;文件名为image-82-1024x537.png
NaturalSpeech2的模型架构

然后是NaturalSpeech 3,还是非自回归的,而且非自回归的正统性味道更加浓厚,借用了不少FastSpeech2和megatts1&2的设计思想。像megatts 1&2一样,同样采用(自)监督信号对语音token编码的内容做了限制,而不再像是VALL-E/NaturalSpeech2那样一把抓。相应地,语音token化的方法也用VQ就行。具体而言,文章将语音信号分解为时长、内容、韵律和细节四个部分,然后每个部分用离散化的扩散模型来建模。不过,原文使用GRL来促进语音属性的分解,这一点的靠谱程度存疑。我也尝试过文章的FACodec,但效果很差。三级扩散模型级联的结构,预测起来似乎也非常麻烦。

基于MEL谱+VQ的TOKEN的工作

当然,也有不少工作用了MEL谱作为中间特征,然后在梅尔谱的基础上,或是用VQ提供离散token,或是用CNN来提取连续latent。对于MEL+VQ的工作,有tortoise-tts[20]、xtts 1&2、megatts1&2[28, 29]、base TTS[30]。对于MEL+latents的工作,有:AudioLDM 1&2[27]、StyleTTS 1&2[31, 32]。我们来简单看看是它们是怎么做的。

Tortoise-tts[20]。该工作是著名的开源英文TTS模型。其作者目前在OpenAI就职,同时也是GPT-4o的重要Contributor(他自个儿在博客中说的)。

Tortoise-tts使用MEL+VQVAE的方法得到语音的MEL token,然后对MEL token以及text token做GPT自回归建模。对于语音的解码,自然也是分为两步:先是用扩散模型将MEL token转换为MEL谱,这一步和文生图很像,用扩散模型是很自然的选择;然后用声码器将MEL谱转换为音频波形。tortoise-tts和VALL-E的主体都是自回归建模,二者的不同主要在于token的不同。

tortoise-tts的模型架构

MegaTTS 1&2[28, 29]。字节跳动的MegaTTS系列对语音token编码信息做了显式的信息压缩处理,让语音token仅编码上下文依赖强的韵律信息,然后用GPT自回归来建模语音的韵律。对于其他方面的信息,模型的处理显得较为常规:音色一般具有全局性,使用单一的音色编码器从参考音频中提取就性;对于文本语义内容的处理,模型在很大程度上参考了非自回归的FastSpeech 2。

对于语音的解码,也是分为两步:先通过MEL decoder还原为MEL谱,然后通过声码器解码为音频波形。MegaTTS 2和1总体上类似,在音色编码(音素级编码、多条参考音频)、语音提示长度(扩展同speaker语音上下文长度硬train,音频prompt长度更长)和时长建模(也用GPT自回归)上做了改进,同时堆了更大规模的数据。剪映的后端TTS模型用的就是megatts2。该工作在各论文的评测中表现也都不错。

megatts1的模型架构

基于MEL谱+VAE的latents的工作

AudioLDM 1&2[27]。AudioLDM 1&2使用的语音latents是一致的,均通过MEL+VAE获得。既然是连续的latents,使用扩散模型来建模也合情合理。解码过程也相当简单:VAE decoder获得梅尔谱,然后用声码器转换为音频波形。该系列工作的核心创新点是利用多模态模型统一了扩散模型条件输入侧的信息:AudioLDM 1用CLAP统一了文本模态和音频模态,用单模态的音频数据就能完成模型的训练;AudioLDM 2则包含了图像、文本、转录文本等更多模态,模型泛用性也更强,既能做语音合成,也能做音乐生成、音频事件生成。

AudioLDM 1的模型架构
AudioLDM2的模型架构

StyleTTS 1&2[31, 32]。StyleTTS系列的模型一众zero-shot TTS模型显得比较老派,整体结构基本上沿袭了非自回归的FastSpeech 2,不同之处在于增加了基于参考音频抽取的风格信息。说是风格,其实跟megatts的音色很像。StyleTTS 2的工作则将风格进一步拆分成声学风格和韵律风格。训练时的风格信息由音频提供,推断时的风格信息则由扩散模型提供。StyleTTS 2通过一个扩散模型桥接了文本韵律和语音风格之间的联系,摆脱推断时对参考音频的依赖。不用参考音频其实对产品的意义还挺大的,要都用现实世界中真人尤其是名人的声音作为参考音频,那这势必会引起版权纠纷。这种纠纷在国内国外都有相关的事件。最近寡姐投诉OpenAI的事件就是一例。

StyleTTS 1的模型架构
StyleTTS 2的模型架构(a)
StyleTTS 2的模型架构(b)

TTS对指令的遵循

SLM不仅要合成合乎上下文语义的高表现力语音,合成的语音还要符合用户的即时要求。一些text-guided zero-shot TTS的工作值得参考。这些工作一般都是在已有的zero-shot TTS模型或者text-to-audio模型上改造而来,同时吸收transcription和description两路条件。其中的重点还是在于数据集的构建。这方面的工作有:PromptTTS[33]、InstructTTS[34]、ParlerTTS[19]、VoiceLDM[18]和Audiobox[35]。我们主要谈谈ParlerTTS和VoiceLDM。

ParlerTTS[19]。VALL-E/VoiceCraft的增强版,通过T5编码器和cross-attention旁路引入了描述性文本的信息。该工作的目的是想使用自然语言prompt来指定说话风格和环境信息,摆脱对参考音频的依赖。描述性标签文本的收集过程也显得相当朴素:通过定制化的监督式模型获取语音数据的口音特征、录音质量特征、音高语速特征。然后用LLM将这些特征转换为自然语言的描述。在我看来,这个工作有这么几点局限性吧:其一,缺乏情绪标签;其二,语音描述性标签的收集并不具备通用性,较为繁琐,远不如一个强大的多模态语音理解模型来得实在。文章demo虽然达到了预期的效果,但场景似乎局限在朗读的情景中。

ParlerTTS的模型架构

VoiceLDM[18]。在VoiceLDM1的基础上增加了转录文本的输入。这个工作和AudioLDM 1很像,同样使用CLAP注入语音的描述性信息。不同地是,为了做TTS任务,该工作通过cross-attention旁路增加了transcription的信息。


TTS总结

林林总总说了这么多zero-shot的TTS方法,想说明的结论有这么几点:

  1. 在LLM大行其道、scaling law大显神威的时代,TTS模型的训练数据规模已经突破了万小时,甚至达到了数十万小时的级别。在大数据的加持下,TTS任务上也涌现出了in-context learning能力。
  2. 语音信息的解码通常都要层次化或者多步进行,不能一步到位。自回归、扩散模型和流匹配都能在TTS中发挥作用;
  3. 借鉴NLP instruction fine-tuning和文生图的经验,TTS模型同样可以遵循文本指令或者语音指令,合成符合用户即时要求的语音,摆脱对参考音频的依赖,这或许也能规避一些知识产权的困扰(比如最近有名的寡姐投诉OpenAI事件)。同时,用户也能在对话过程中随时切换语音回复的风格,这一点在OpenAI的demo中有很明确的体现。另外,不知道大家有没有注意,GPT-4o合成的语音是可以是放映所处的声学环境的:有一段语音背后似乎是有钢琴声的。
  4. text-guided zero-shot TTS在模型架构上和zero-shot TTS有非常大的相似性。但训练数据可能较为缺乏。先开发zero-shot TTS,再用类似SALMONN那样的多模态理解模型来打标签(类似DALLE3的做法),这样数据集构造方式,可能会是更好的选择。

Zreo-TTS — 基于声学/语义 latents 的扩散模型工作

我们通常所说的语音token是离散的。如果使用对应码本中的embedding来表示语音的话,它也可以是连续的低维度的latent变量。既然是低维度的连续latent变量,那图像合成领域中大火的LDM(latent diffusion model,其实就是stable diffsion 1&2采用的模型)模型自然也可以用到语音的合成上。这方面的经典工作有很多,比如说:NaturalSpeech 2&3、AudioLDM 2、VoiceLDM。但这里面只有NaturalSpeech2用到了语音离散化部分提及的声学/语义token,NaturalSpeech3的属性分解形式的VQ更像是另一种形式的RVQ。

NaturalSpeech 2

NaturalSpeech 2基本上就是VALL-E的连续版本。它用的latent也是来自Encodec,对其中不同层次的latent做了求和,然后将其作为扩散模型的训练目标。值得注意地是,扩散模型和FastSpeech2一样也用了时长和音高作为合成的先验条件。这一点也被后来的RALL-E采用。该工作中的扩散模型采用WaveNet实现,同时预测不加噪的latent和后验均值,和图像合成领域的扩散模型在实现方式上还是有所不同的。

NaturalSpeech 3

NaturalSpeech 3,还是非自回归的,而且非自回归的正统性味道更加浓厚,借用了不少FastSpeech2和megatts1&2的设计思想。像megatts 1&2一样,同样采用(自)监督信号对语音token编码的内容做了限制,而不再像是VALL-E/NaturalSpeech2那样一把抓。相应地,语音token化的方法也用VQ就行。具体而言,文章将语音信号分解为时长、内容、韵律和细节四个部分,然后每个部分用离散化的扩散模型来建模。不过,原文使用GRL来促进语音属性的分解,这一点的靠谱程度存疑。尝试过文章的FACodec,但效果很差。三级扩散模型级联的结构,预测起来似乎也非常麻烦。

AudioLDM 2

  • AudioLDM2 :https://arxiv.org/abs/2308.05734
  • Code:https://audioldm.github.io/audioldm2/
  • 核心思想是引入一种新的“音频语言”(LOA),它是表示音频剪辑语义信息的向量序列。 这种方法使我们能够将人类可理解的信息转换为 LOA,并合成以 LOA 为条件的音频表示。具体来说,我们利用基于 GPT 的语言模型(Radford等人,2019)将调节信息转换为 AudioMAE 特征。 GPT的输入条件很灵活,包括文本、音频、图像、视频等的表示。然后,我们使用潜在扩散模型(Rombach等人,2022)基于AudioMAE 功能。 潜在扩散模型可以以自监督的方式进行优化,从而允许使用大规模未标记的音频数据进行预训练。 我们的语言建模方法使我们能够利用语言模型的最新进展(Zhao等人,2023),同时缓解先前音频自回归模型中出现的高推理计算成本和错误累积等挑战(Zeghidour 等人,2021;Agostinelli 等人,2023)。 这是由于连续 AudioMAE 特征的长度较短,它也比以前使用的离散标记提供了更丰富的表示能力(Lam 等人,2023;Borsos 等人,2023;Agostinelli 等人,2023) 。
AudioLDM 2 架构概述。 AudioMAE 功能是连接音频语义语言模型阶段 (GPT-2) 和语义重建阶段(潜在扩散模型)的代理。 概率切换器使用地面真值 AudioMAE (Pgt) 和 GPT-2 生成的 AudioMAE 特征 (Ppred) 作为条件来控制潜在扩散模型的概率。 AudioMAE 和潜在扩散模型都是使用音频数据进行自我监督预训练的。

VoiceLDM

VoiceLDM 概述。VoiceLDM 使用大量真实音频数据进行训练。 textcont在数据准备期间通过使用 Whisper(一种自动语音识别 (ASR) 模型)处理音频而生成。textdesc 仅在推理期间使用。带有锁定图标的模块表示它在训练期间被冻结。

 VoiceLDM,这是一种旨在生成准确遵循两种不同自然语言文本提示的音频的模型:描述提示和内容提示。前者提供有关音频的整体环境上下文的信息,而后者则传达语言内容。为了实现这一目标,我们采用了基于潜在扩散模型的文本到音频 (TTA) 模型,并扩展了其功能以将额外的内容提示作为条件输入。通过利用预先训练的对比语言音频预训练 (CLAP) 和 Whisper,VoiceLDM 可以在大量真实音频上进行训练,而无需手动注释或转录。此外,我们采用双无分类器指导来进一步增强 VoiceLDM 的可控性。

基于声学token或语义token的TTS-VoiceCraft—VALL-E的后续改进

作为Zero shot-TTS VALL-E的后续改进,VoiceCraft不得不提。可以称之为“优雅的VALL-E”。它的优雅主要体现在两个方面:casual masking和delayed stacking。所谓的causal masking,是为了用自回归GPT架构来做语音编辑任务,就是把被mask的部分移动到序列末尾去预测,一套架构同时做合成和编辑任务;所谓的delay stacking,是为了适配自回归和RVQ,通过delay错位让当前码本的token预测正好可以利用前面那些token的预测结果,比起VALL-E那样自回归和非自回归缝合在一起的结构要优雅不少。

VoiceCraft的建模流程,标记重排过程和建模框架的示例。重排过程包括两个步骤:(1) 因果掩码,其中掩码的跨度被掩码标记替换并移动到末尾,以及 (2) 延迟堆叠,其中标记根据其码簿索引在时间维度上移动。

VoiceCraft 通过重新排列神经编解码器的输出标记,将序列填充(用于语音编辑)和延续(用于零样本 TTS)转换为简单的从左到右的语言建模。重排包括两个步骤:(1) 因果掩码以实现双向上下文的自回归延续/填充,以及 (2) 延迟堆叠以确保高效的多码簿建模。VoiceCraft 采用仅限解码器的 Transformer,并使用自回归序列预测 进行训练。

重排步骤 1:因果掩码:

给定一个连续的语音波形作为输入,我们首先使用 Encodec将其量化成一个 T by K codec 矩阵 X ,其中 T 是时间帧的数量,是 K RVQ 码本的数量。 X 可以写成 (X1,⋯,XT) ,其中 Xt 是一个长度 K 向量,表示在时间步 t 中来自不同码本的代码,我们假设 Codebook k 中的代码对 Codebook k−1 中的残差进行建模。在训练过程中,我们的目标是随机屏蔽一些 span 的标记 (Xt0,…,Xt1) ,然后以所有未屏蔽的标记为条件自动回归预测这些被屏蔽的标记。这在 时 t1<T 是个问题,因为在执行自回归生成时,我们无法以未来的输出为条件。我们需要修改掩码, X 使其具有因果关系,方法是将要掩码的跨度移动到序列的末尾,以便在填充这些标记时,模型可以针对过去和未来未掩码的标记。

只需将所有被屏蔽的 span 移动到序列的末尾,即可轻松地将上述过程扩展到多个被屏蔽的 span。要屏蔽 n 的 span 数从 Poison⁢(λ) 中采样,然后对于每个 span,我们采样一个 span length l∼Uniform⁢(1,L) 。最后,我们在约束 X 下随机选择 span 的位置,确保它们彼此不重叠。然后,选定的 n 范围将替换为掩码标记 ⟨M1⟩,⋯,⟨Mn⟩ 。这些掩码 span 中的原始标记将移动到 sequence X 的末尾,每个 span 前面都有其相应的掩码标记。

重排步骤 2:延迟堆叠

在因果掩码标记重新排列之后,重新排列矩阵 Y 的每个时间步都是标记向量 K 。Copet et al. ( 2023) 观察到,当对堆叠的 RVQ 令牌进行自回归生成时,应用延迟模式是有利的,这样时间对码簿 k 的预测 t 就可以以同一时间步长对码簿 k−1 的预测为条件。我们采用与本文类似的方法。假设 span Ys 的形状为 Ls×K .应用延迟模式会将其重新排列到 Zs=(Zs,0,Zs,1,⋯,Zs,Ls+K−1) 中,其中 Zs,t,t∈[Ls+K−1] 定义为

其中 Ys,t−k+1,k 表示位于 matrix Ys 中 coordinate (t−k+1,k) 处的标记,即 (t−k+1) 第 个时间步的 k 第 个 Codebook 条目。为了确保 ∀t∈[Ls+K−1] , Zs,t 包含 K 有效的标记,我们引入了一个特殊的可学习 [空] 标记并定义 Ys,t−k+1,k≜[empty],∀t∈{s:s⁢<k∪s−k+1>⁢Ls} 。请注意,掩码标记不是任何 span 的一部分,并且在延迟堆叠期间不会更改。我们定义延迟堆叠的结果矩阵 Z=(Z1,⟨M1⟩,Z2,⟨M1⟩,⋯,⟨MS−12⟩,ZS) 

推理:

语音编辑。语音编辑的设置如下:我们有语音记录 R 及其转录 W ,我们希望模型仅修改 的 R 相关跨度,以便它与目标转录 W′ 匹配。我们假设 是 W′ 的编辑版本 W ,其中插入、替换或删除了一些单词。这个任务和训练任务几乎一模一样,有两个区别: 1) 在训练过程中,输入的成绩单只是原始录音 W 的成绩单,而在推理过程中,它是一个修改后的成绩单 W′ 2) 在训练过程中,要屏蔽的跨度(即 编辑)是随机选择的。在推理过程中,我们通过比较原始转录本和目标转录本来识别应该屏蔽掉的单词来选择它们,然后使用原始转录本的单词级强制对齐来识别与这些要屏蔽的单词相对应的编解码器标记跨度。为了确保已编辑的语音和未编辑的语音之间的平滑过渡,还需要对要编辑的 span 周围的相邻单词进行轻微修改,以便对协同发音效果进行建模。因此,我们指定了一个小的 margin 超参数 ϵ ,并在左侧和右侧将掩码跨度长度 ϵ 延长.

在自回归生成过程中,我们将所有未屏蔽的跨度的目标转录本提供给模型,并在应进行编辑的位置插入掩码标记。然后,我们让模型自回归地继续这个序列,从而填充被掩盖的 span。然后,生成的编解码器令牌被拼接回它们在话语中的正确位置,我们使用 Encodec 解码器网络将完整的编解码器令牌序列映射回波形。

Zero-shot TTS。正如我们之前提到的,我们模型的零样本 TTS 很简单,因为它只对应于在原始话语的末尾执行插入编辑。在这种情况下,会为模型提供语音提示及其转录,以及要生成的语音的目标转录。这三个输入连接在一起并馈送到模型,然后它自动回归地生成目标转录本的编解码器序列。

Zero-shot TTS –微软研究院 VALL-E系列论文阅读

微软研究院发布了一系列的TTS相关的论文:

微软研究院;https://www.microsoft.com/en-us/research/project/vall-e-x/

VALL-E:https://arxiv.org/abs/2301.02111

VALL-E X https://github.com/Plachtaa/VALL-E-X https://arxiv.org/abs/2303.03926

VALL-E R https://arxiv.org/abs/2406.07855

VALL-E 2 https://arxiv.org/abs/2406.05370

MELLE https://arxiv.org/abs/2407.08551

RALL-E https://arxiv.org/abs/2404.03204

综述:

我们介绍了一种用于文本到语音合成(TTS)的语言建模方法。具体而言,我们使用从一个现成的神经音频编解码器模型中提取的离散编码训练了一个神经编解码器语言模型(称为 VALL-E),并将 TTS 视为一个条件语言建模任务,而不是像以往工作中那样的连续信号回归任务。VALL-E 展现了上下文学习的能力,只需一个未见过的说话者3秒钟的录音作为提示,就可以合成高质量的个性化语音。VALL-E 在语音自然度和说话者相似性方面显著优于现有的零样本 TTS 系统。此外,VALL-E 可以在合成时保留提示音频中的说话者情感和声学环境。为了扩展其能力,VALL-E X 能够适应多语言场景,促进跨语言零样本 TTS。而 VALL-E R 引入了音素单调对齐策略,增强了语音生成的稳健性。通过整合重复感知采样和分组编码建模技术,VALL-E 2 实现了一个突破性的里程碑:在 LibriSpeech 和 VCTK 数据集上达到了零样本 TTS 性能的“人类水平”。这是该领域首次取得如此成就,设立了新的标准。MELLE 是一种新颖的基于连续值标记的语言建模方法,用于文本到语音合成(TTS)。MELLE 直接从文本条件中自回归地生成连续的 mel 频谱图帧,绕过了矢量量化的需求,后者最初是为音频压缩设计的,与 mel 频谱图相比,会牺牲保真度。

尽管VALL-E系列在用GPT 【decoder only 模型】建模token的上下文关系的时候,基于token的层次化特性做了分治处理,可能是限于当前语音数据集的规模(几万小时可能不够),这种GPT自回归的难度还是相当大的,解码过程存在常见的错误传播现象,鲁棒性非常差,极其不稳定。根据Ilya Sutskever此前对于自回归的论述,GPT自回归相比于BERT这种双向结构是非常data-hungry的,几万小时的数据可能不够,至少需要十几万小时的数据。既然GPT自回归的难度这么大,就有不少人想方设法地来降低GPT学习的难度了。解决方案也非常类似:给GPT提供额外的条件信息不就行了比较典型的工作就是微软的RALL-E,RALL-E先生成了时长信息和音高信息,作为GPT【only decoder】自回归的先验,之所以会补充时长和音高,这大概是受到FastSpeech2这样的非自回归模型的启发,这两个指标的引入,有助于提升合成的鲁棒性

VALL-E

论文:https://arxiv.org/abs/2301.02111

VALL·E也和VQVAE类似,将音频量化成一系列离散tokens,其中第一个量化器负责捕捉音频内容和说话者身份特征,后几个量化器则负责细化信号,使之听起来更自然。随后以文本和3秒钟的声音提示作为条件,自回归地输出第一层离散音频编码,NAR根据上一层的输出,并行输出第二到第八层的离散编码。

条件编解码器语言建模

神经语音编码器模型使我们能够对离散音频表示进行操作。由于神经编码器模型中的残差量化,令牌具有层次结构:来自先前量化器的令牌恢复声学属性,如说话者身份,而连续量化器则学习细微的声学细节。每个量化器的训练旨在建模来自前一个量化器的残差。因此,我们设计了两个以层次方式进行的条件语言模型。

对于来自第一个量化器的离散令牌 C:,1​,我们训练一个自回归(AR)解码器语言模型。该模型以音素序列 x声学提示 C~:,1为条件,公式化为:

由于 VALL-E 是一个仅解码的语言模型,c~:,1​ 和 c:,1​ 的拼接形成一个完整的序列,在训练过程中我们并不区分它们或插入特定的标记。只有c:,1​ 在推理时被预测,而前缀 c~:,1​ 在推理中给出。

对于从第二个到最后一个量化器的离散令牌 c:,j​(其中 j∈[2,8]),我们训练一个非自回归(NAR)语言模型。由于在 NAR 方式中,令牌之间无法相互访问,因此使用声学提示矩阵 C~ 作为声学提示,从而约束说话者身份。因此,模型以音素序列 x、声学提示 C~属于前一个代码本的预测声学令牌 C:,<j​ 为条件进行训练

AR 模型和 NAR 模型的结合在语音质量和推理速度之间提供了良好的平衡。一方面,生成语音的速率应与已注册的录音一致,但由于不同说话者的语速可能差异很大,训练一个针对不同说话者的长度预测器是困难的。在这种情况下,AR 模型是更自然的选择,因为它在声学序列长度预测上具有灵活性。另一方面,对于后续阶段,由于输出槽的数量遵循第一阶段的序列长度,NAR 可以将时间复杂度从O(T) 降至 O(1)。总体而言,C 的预测可以建模为:

自回归编解码语言建模

自回归语言模型生成来自第一个量化器的标记。该模型包括音素嵌入 Wx​、声学嵌入 Wa​、一个变换器解码器和一个预测层。为了生成具有特定内容的语音,我们使用音素序列作为语言模型的音素提示。因此,模型输入是 x 和 c:,1​ 的连接,并在每个序列后附加两个特殊的 <EOS> 标记。我们为提示和输入标记分别计算波动的位置嵌入。对于因果变换器模型,每个标记 ct,1​ 可以关注到(x,c<t,1​)。该模型的优化目标是最大化第一个代码本中下一个标记的概率。我们共享输出投影层的参数与声学嵌入 Wa​ 的参数。

在自回归模型中,我们不在训练时显式提取音频片段作为提示。训练过程完全是因果语言模型训练。通过这种方式,任何前缀序列c<t,1​ 被视为后续序列 c≥t,1的提示。在推理过程中,给定已注册的录音,我们应将已注册录音的音素序列与合成的音素序列连接起来。同时,将已注册录音的声学标记序列用作自回归解码中的前缀。

在通过自回归模型获得第一个量化器的代码后,我们使用非自回归(NAR)模型生成其他七个量化器的代码。NAR 模型的架构与 AR 模型类似,只是包含八个独立的声学嵌入层。在每个训练步骤中,我们随机抽取一个训练阶段i∈[2,8]。该模型的训练目标是最大化来自第 i 个量化器代码本的声学标记。来自阶段 1 到阶段i−1 的声学标记被嵌入并求和作为模型输入:

其中 ⋅ 表示索引选择。音素序列同样被视为语言模型的提示。此外,为了克隆给定说话者的独特声音,我们还使用来自已注册语音的声学标记作为声学提示。具体来说,我们首先使用神经编解码模型对已注册语音进行标记,得到C~T×8​。来自八个代码本的嵌入表示被求和作为声学提示。为了预测来自第 i 个代码本的声学标记,变换器输入是音素嵌入ex​、声学提示 ec~​ 和 c:,<i​ 的连接。位置嵌入也分别为提示和声学序列计算。当前阶段 iii 通过自适应层归一化(AdaLN)操作注入到网络中,即 AdaLN(h,i)=aiLayerNorm(h)+bi,其中 h 是中间激活,ai​ 和 bi​ 是通过阶段嵌入的线性投影获得的。与 AR 不同,NAR 模型允许每个标记在自注意力层中关注所有输入标记。我们还共享声学嵌入层和输出预测层的参数,这意味着第 j 个预测层的权重与第 j+1 个声学嵌入层相同。

VALL-E X

论文:https://arxiv.org/abs/2303.03926

受VALL-E启发的跨语言编解码语言模型VALL-E X:受VALL-E的启发,跨语言编解码语言模型VALL-E X(记为φ)利用一个多语言自回归编解码语言模型和一个多语言非自回归编解码语言模型来生成不同粒度的声学标记,如图2左侧所示。我们还采用了神经编解码模型EnCodec [Défossez等人,2022] 作为声学量化器,这是一个具有L层量化层的编码器-解码器模型。在我们的实验中,我们选择L = 8,每一层以75Hz的频率生成1024个条目的量化码。

多语言自回归编解码语言模型:多语言自回归编解码LMφMAR是一个单向Transformer解码器,它基于语义标记(音素序列)自回归地生成声学标记。为了使句子级训练更高效并在推理过程中加速解码,类似于VALL-E,跨语言自回归编解码LMφMAR仅用于预测EnCodec模型第一层量化器的声学标记。

形式上,基于任何语言中的配对语音-转录数据,设S表示转录的音素序列,A:,1 = {ai,1 | i = 1, …, N} 表示从语音X中提取的第一层声学标记。解码器φMAR建模拼接序列〈S, A:,1〉,并被训练来自回归地预测A:,1。通过最大化对数似然来进行优化:

⟨⟩ 表示序列拼接操作。p(⋅) 是softmax函数。

多语言非自回归编解码语言模型:与自回归生成模式不同,多语言非自回归编解码语言模型φMNAR是一个非自回归Transformer语言模型,旨在迭代地从第一层生成其余层的声学标记。它由当前句子的音素序列 S 和具有相同说话人的另一句子的声学标记序列 A~ 提示。这里的 A~ 通常取自数据集中的前一句子,这些调整后的句子通常是从同一段落中分割出来的。预期 A~ 具有与当前句子相同的语音特征(如说话人、语速、背景等),并用作克隆目标语音的额外参考。

类似于VALL-E,对于生成每一层l∈[2,8] 的声学标记,前l−1层声学标记A:,1:l−1​的嵌入按层相加作为输入。第 l 层声学标记 A:,l 的学习目标可以计算为:

其中〈〉表示序列拼接。pNAR(.) 计算 A:,l 的逐点概率。

多语言训练:为了学习跨语言的声学转换信息,以支持跨语言TTS和语音到语音翻译任务,我们利用双语语音-转录(ASR)语料库,即 (Ss, As) (St, At) 的配对数据来训练我们的多语言编解码语言模型 φMAR 和 φMNAR,其中 s t 分别代表两种不同的语言(源语言和目标语言)。

语言ID模块:借鉴多语言TTS的方法,我们使用语言ID来指导VALL-E X中特定语言的语音生成。一方面,如果没有语言ID,VALL-E X可能会因为在多语言数据上进行训练而难以选择适合特定语言的声学标记。另一方面,某些语言具有非常不同的特征,例如,中文是一种声调语言,而英语是非声调语言,这增加了跨语言调整说话风格的难度。我们的实验发现,在多语言自回归编解码语言模型 φMAR 的输入中添加语言信息对于引导正确的说话风格和缓解L2口音问题非常有效,这一点将在第5.5节中详细介绍。具体来说,我们将语言ID嵌入到密集向量中,并将其添加到声学标记的嵌入中。

跨语言推理

训练完成后,VALL-E X 可以执行跨语言语音合成,如图 3 所示。具体来说,我们首先将源音素 Ss 和目标音素St 作为提示符进行拼接,并将第一层源声学标记A:,1s​ 作为解码前缀,基于此,多语言自回归编解码语言模型ϕMAR​ 生成第一层目标声学标记A:,1t​

其中 ∼ 表示基于概率的采样。采样过程会在{<end-of-sentence>} 标记被采样到时停止。如 3.3 节所述,语言 ID 用于控制生成语音的说话风格。在从ϕMAR​ 获得第一层目标声学标记 A:,1t​ 后,使用多语言非自回归编解码语言模型 ϕMNAR​ 来预测剩余的声学标记层 {A:,lt​∣l=2,…,8},通过贪心搜索,即选择最大概率的标记,

最后,我们使用 EnCodec 的解码器来综合完整的目标声学标记 A:,1:8t​ 生成目标语音。

VALL-E R

论文:https://arxiv.org/abs/2406.07855

图 1: VALL-E R 的概述。它同步预测声学符元(蓝色)及其对应的音素序列(绿色),这可以加强音素和音频之间的对齐,从而提高 VALL-E 模型的鲁棒性。 请注意,VALL-E R 通过在其自回归模型中采用提议的合并编解码器代码来实现更快的推理速度。

一种鲁棒且高效的零样本 TTS 系统,名为 VALL-E R。我们首先介绍了编解码器合并方法,该方法可在不重新训练编解码器的情况下提高推理速度,然后阐述了仅解码器神经编解码器 LM 中的单调对齐策略。

编解码器合并方法。

在借鉴 Encodec 基础工作的基础上,我们引入了合并编码器的概念。这一创新方法通过改变推理前向过程,实现了在各层离散码的下采样,显著地提高了对音频数据表示的高效操作。这一突破无需对模型进行重新训练或微调,标志着在音频数据表示操作上的重要进展。

如图 2 所示,所提出的编码器在视觉上进行了描述。整体架构与 Encodec 保持一致,包括以下三个组件:1)基于卷积的编码器,将波形数据x1×L​ 映射为潜在表示序列 zF×T​,其中 F 是通道数,T 是提取码的长度;2)解码器,从量化的潜在表示 z^F×T​ 中重建数据 x^1×L​ ;3)8 层残差向量量化器(RVQ)模块,可以将连续的潜在向量 zF×T​ 逐步转换为离散码表示 C8×T​。主要区别在于,我们的合并编码器在向量量化器模块之前插入了一个编码器合并模块,以对表示 zF×T​ 进行下采样。

假设第 d 层的合并率为 md​,rdF×T​ 代表第 d 层的残差输入。合并编码器模块包含两个步骤:第一步是通过平均池化将残差输入rdF×T 下采样为 rmd​​F×(T/md​),然后通过repeat操作将 rmd​​ 上采样回其原始长度。接着,经过合并模块处理的残差表示将被输入到后续的 VQ 层,通过对码本嵌入进行最近邻查找,量化为离散码Cd1×T​。通过合并模块,我们确保了连续 md​ 帧的码的一致性,从而降低了 Cd1×T 的分辨率。

具有单调对齐的神经编解码器 LM

以前,单调策略仅适用于编码器-解码器结构。 为了解决基于解码器-仅 Transformer 的 TTS 中的鲁棒性问题,我们将音素预测集成到神经编解码器 LM 的训练中,并在推理过程中设计了单调对齐策略。 概述如图 3 所示。

为了在语音质量和推理速度之间取得良好的平衡,我们的 VALL-E R 包含两个模型:自回归 (AR) 和非自回归 (NAR),这与 VALL-E (Wang et al., 2023a) 相一致。 具体来说,给定一个训练数据对 {𝐬,𝐩},其中 𝐬 是语音样本,𝐩={p1,p2,…,pL} 是其相应的音素转录。 然后,编解码器合并模型用于将语音波形 𝐬 压缩成具有 8 个量化器的离散声学符元 𝐀,公式为:MergeCodec⁢(𝐱)=𝐀8×T={𝐚1,…,𝐚8},其中 T 是离散码的长度,𝐚i={a1,…,aT} 表示第 i 层的符元。 由于 VALL-E R 的训练需要对齐的音素和声学符元,因此此处采用对齐工具将 𝐩 与声学符元 𝐀 对齐,表示为 𝐩^1:T={p1^,p2^,…,pL^},其中 p^i 包含 Ni 个重复的 pi 和 ∑i=1LNi=T。

对于 AR 阶段,为了增强音素和声学序列之间的联系,我们构建了一个神经编解码器 LM θA⁢R,以使用音素预测对来自编解码器合并模型的第一个量化器的离散声学符元 𝐚1:T1 进行建模。 如图 3 所示,它以音素序列 𝐩 为条件,同时生成声学符元 𝐚1:T1 和对齐的音素 p^1:T,公式为最大化以下概率:

在第二阶段,我们训练了一个 NAR LM θN⁢A⁢R,以从第 2n⁢d 到第 8-t⁢h 层量化器迭代地生成声学符元。 它以音素序列 𝐩、先前几层生成的声学符元 𝐚1:n 和音素对齐 l1:T 为条件,以预测下一层声学符元 𝐚n+1,公式为最大化:

我们还共享声学嵌入层和输出预测层的参数,这意味着第 j 个预测层的权重与第 (j+1) 个声学嵌入层相同。

在推理过程中,利用语言模型强大的上下文学习能力,我们提出的 VALL-E R 可以通过自回归预测声学和音素来自动克隆提示中说话人的音色和韵律。 由于 VALL-E R 明确地对音素进行建模,因此它对韵律具有很强的控制力:当我们在推理过程中使用预设的音素序列替换自预测的音素序列时,我们可以使用预设的韵律来生成语音,从而实现分别控制韵律和音色的效果。 它也可以被认为是一种语音转换任务,其目标是在不改变源语音的语言信息和韵律的情况下,使目标语音的音色听起来像提示语音。

VALL-E 2

论文: https://arxiv.org/abs/2406.05370

基于其前身 VALL-E,新迭代引入了两项重大增强功能:重复感知采样通过考虑解码历史中的词符重复来改进原始核心采样过程。 它不仅稳定了解码,还避免了无限循环问题。 分组代码建模将编解码器代码分组,有效缩短序列长度,不仅提高了推理速度,还解决了长序列建模的挑战。 

基于过往经验,研究员们发现 VALL-E 在推理中使用的随机采样可能会导致输出不稳定。尽管错误编码(图3中的红色方块)的概率很低,但由于采样步骤太多,它们仍然不可避免地会被采样到。为了稳定推理过程,通常会利用 Nucleus 采样来从累积概率低于预设阈值的最可能标记集合中进行采样。Nucleus 采样方法可以减少说错词的错误,但也可能导致模型为了减少错误而只生成静音。

因此,为了平衡随机采样和 Nucleus 采样,研究员们提出了重复感知采样的方法。在给定 AR 模型预测的概率分布基础上,研究员们首先使用预定义的 top-p 值通过 Nucleus 采样生成目标编码。然后使用固定的窗口大小来计算预测编码在前面的编码序列中的重复比例。如果重复比例超过预定义的重复阈值,研究员们就会使用随机采样从原始概率分布中获得新的预测结果来替换原来的目标编码。通过这种重复感知采样的方法,解码过程既可以受益于 Nucleus 采样的稳定性,还可以借助随机采样避免陷入静音的无限循环。

继VALL-E之后,我们使用现成的神经音频编解码器模型将语音信号表示为离散编解码器代码序列,并将TTS视为条件编解码器语言建模任务。 为了提高效率,VALL-E 2引入了分组编解码语言建模方法,将编解码代码序列划分为一定大小的组,并将每组编解码代码建模为一帧。 这样我们就可以摆脱现成的神经音频编解码模型的帧率约束,将帧率降低整数倍。 它不仅有利于推理效率,而且通过缓解长上下文建模问题也有利于整体语音质量。

VALL-E 2 的训练概述,由自回归和非自回归 Transformer 组成。 请注意,自回归 Transformer 旨在生成分组编解码器代码。

通过 TTS 训练目标,VALL-E 2 被优化以最大化给定文本条件的分组代码序列的可能性。 具体来说,给定一个音频样本 𝐲 及其相应的标记化文本转录 𝐱=[x0,x1,…,x(L−1)],其中 L 是文本序列长度,我们首先使用预训练的神经音频编解码器模型,用于将音频样本𝐲转换为编解码器代码序列𝐂T×J=[𝐜0,𝐜1,…,𝐜(T−1)],其中T是代码序列长度,J(这里J=8)是编解码器模型中量化器的数量,每个𝐜t代表每个时间步的8个代码。 然后我们将其划分为分组代码序列𝐂G=[𝐂0:G,𝐂G:2⁢G,…,𝐂(T−G):T],组大小为G,𝐂0:G代表组[𝐜0,𝐜1,…,𝐜(G−1)]。 由于话语开头通常有短暂的沉默,我们可以从代码序列的开头剪掉一些代码,让代码序列长度T为组大小的整数倍,而不需要删除任何代码。语音信息。 最后,我们训练 VALL-E 2 模型 θ 以最小化以文本序列 𝐱 为条件的分组代码序列 𝐂G 的负对数概率:

其中𝐂t⋅G:(t+1)⋅G是第t组编解码器代码[𝐜t⋅G,…,𝐜((t+1)⋅G−1)],𝐂<t⋅G是前面(t−1) 组。

推理过程中,VALL-E 2根据提示执行零样本TTS任务。 给定文本输入(包含语音提示的转录和要合成的文本)和来自看不见的说话者的分组编解码器代码,作为条件和提示,该模型可以生成具有相应内容和说话者语音的目标分组编解码器代码。 具体来说,给定文本序列𝐱和未见过的说话人的登记语音样本𝐲′,我们可以获得相应的分组代码序列𝐂P=𝐂<T′G=[𝐂0:G,𝐂G:2⁢G,…,𝐂(T′−G):T′]。 然后,我们以文本序列 𝐱 和代码提示 𝐂P 为条件生成目标分组代码序列 𝐂T=𝐂≥T′G=[𝐂T′:(T′+G),…,𝐂(T−G):T]:

最后,我们可以使用现成的神经编解码器将目标代码序列 𝐂T 转换为目标语音波形。

在 VALL-E 的基础上,VALL-E 2 还使用分层结构:自回归 (AR) 编解码器语言模型和非自回归 (NAR) 编解码器语言模型。 AR模型以自回归的方式生成每一帧的第一编解码器代码的序列,而NAR模型以非自回归的方式基于前面的代码序列生成每个剩余的代码序列。 两种模型都使用相同的 Transformer 架构,其中包含文本嵌入层、代码嵌入层和代码预测层。 我们对来自不同编解码器量化器的代码使用不同的嵌入,并与代码嵌入层的参数共享代码预测层的参数。 此外,AR模型还有一个组嵌入层,用于将代码嵌入投影到组嵌入,以及一个组预测层,用于预测一组中的代码。 NAR模型有一个代码ID嵌入层来指定要预测的代码序列的ID。 AR 模型和 NAR 模型具有不同的注意力掩码策略:AR 模型使用因果注意力策略,而 NAR 模型使用完全注意力策略,如图 2 的右侧所示。

为了加速推理过程,研究员们在 VALL-E 2 中采用了分组编码建模方法,将编码序列划分为一定大小的分组,并将每组编码建模为一步。在自回归模型中,研究员们利用分组嵌入层将编码嵌入结果映射到分组嵌入并作为网络的输入,并在输出层使用分组预测层对一组中的编码进行预测。通过这种方式,现有神经音频编码模型的帧率限制得以摆脱,帧率成倍数地降低得到实现。这不仅有利于推理效率的提高,还可以缓解长上下文建模的问题并提升整体语音质量。

图3 VALL-E 2 的推理概述,利用所提出的重复感知采样方法在自回归模型推理期间预测分组代码序列。

VALL-E 2的训练只需要简单的语音转录对数据,不需要任何复杂的数据,例如力对齐结果或同一说话者的额外音频片段以供参考。 这极大地简化了训练数据的收集和处理过程。

MELLE

论文:https://arxiv.org/abs/2407.08551

ELLE 是一种基于连续值令牌的新型语言建模方法,用于文本到语音合成 (TTS)。MELLE 直接从文本条件自回归生成连续的 mel 频谱图帧,绕过了向量量化的需求,与梅尔频谱图相比,矢量量化最初是为音频压缩和牺牲保真度而设计的。具体来说,(i) 我们应用回归损失和提出的频谱图通量损失函数,而不是交叉熵损失来模拟连续值标记的概率分布。(ii) 我们已将变分推理纳入 MELLE 以促进采样机制,从而提高输出多样性和模型稳健性。实验表明,与两阶段编解码器语言模型 VALL-E 及其变体相比,单阶段 MELLE 通过避免采样离散代码的固有缺陷来缓解健壮性问题,在多个指标上实现卓越的性能,最重要的是,它提供了一个更简化的范式。

MELLE包含以下主要组件:预网络,分别将文本转换为子词标记并在投影之前从语音中提取梅尔频谱图模型尺寸;充当语言模型的自回归 (AR) Transformer 解码器;潜在采样模块,从预测的高斯分布中采样潜在嵌入,然后将其投影回频谱图空间;确定语音结尾的停止预测层和用于声谱图细化的卷积后网络,类似于(Shen等人,2018;Li等人,2019)中描述的方法。 最后,使用声码器从生成的梅尔频谱图中恢复语音。

与迭代预测多层编解码器代码的神经编解码器语言模型不同,由于梅尔谱图的完整性,我们不需要额外的非自回归(NAR)模型。 这种简化显着提高了计算和存储效率。 此外,通过调整缩减因子,MELLE可以一步生成多个梅尔谱图帧,进一步提高效率,同时仍保持卓越的性能。

在每个自回归步骤中,MELLE 预计会根据文本提示 𝒙 和之前生成的 mel- 来预测下一个梅尔谱图帧 𝒚t。

在推理过程中,MELLE通过像VALL-E一样的提示来执行零样本TTS任务。 给定用于合成的文本内容𝒙、文本转录𝒙~和语音提示的梅尔频谱图𝒚~,该模型旨在生成目标梅尔频谱图𝒚对应的内容,同时保留提示中原说话人的特征,每一步的最大似然概率为arg⁢max𝒚⁡p⁢(𝒚t⋅r:(t+1)⋅r∣[𝒙~;𝒙;𝒚~;𝒚<t⋅r];θ),其中[;]表示串联操作,如果 r=1,则返回标准模式。

我们采用单向 Transformer 解码器作为语言模型(LM),根据文本输入和声学提示自回归生成声学连续特征。 具体而言,输入文本标记 x,在附加了 <EOS> 标记后,首先通过基于其索引的文本嵌入层转换为嵌入表示。同时,我们采用多层感知器(称为 pre-net)将梅尔谱图 𝒚 投影到语言模型维度。 LM 由多头注意力块和前馈层组成,将文本和声学嵌入的串联作为输入来对语义和声学信息之间的依赖关系进行建模。 LM 𝒆t 在时间步 t 的输出随后由 MELLE 的以下模块处理,以合成下一帧输出

我们在MELLE中集成了一种新颖的潜在采样模块,旨在增强表达多样性和鲁棒性,如图2(左)所示。 该模块根据 LM 的输出 𝒆t 预测分布,并从中采样潜在嵌入 𝒛t。

我们使用线性层作为二元分类器,用 𝒆t 来确定生成是否应该结束,如图 2(中)所示。 继之前的神经 TTS 模型(Wang 等人,2017;Shen 等人,2018)之后,我们采用多个卷积块作为后网络来产生残差并添加到 𝒚′={𝒚0′,𝒚1′,…,𝒚T−1′},得到精炼的梅尔谱图𝒚′′={𝒚0′′,𝒚1′′,…,𝒚T−1′′},如图2(右)所示。 在训练过程中,模型使用教师强制进行训练;而在推理过程中,后网络在 AR 生成结束后处理𝒚′。

RALL-E

论文:https://arxiv.org/abs/2404.03204

RALL-E背后的核心思想是思想链(CoT)提示,它将任务分解为更简单的步骤,以增强基于LLM的TTS的稳健性。 为了实现这个想法,RALL-E 首先预测输入文本的韵律特征(音调和持续时间),并将它们用作中间条件来预测 CoT 风格的语音标记。 其次,RALL-E利用预测的持续时间提示来指导Transformer中自注意力权重的计算,以强制模型在预测语音标记时关注相应的音素和韵律特征。

 RALL-E的核心思想是CoT提示,生成中间结果来辅助和稳定语音标记的生成,提高基于LLM的TTS的鲁棒性。 为了实现这个想法,我们首先建议在预测语音标记之前预测两种音素级韵律标记:音调和持续时间。 韵律标记的分布由单个 Transformer 与语音标记一起建模,以便它们可以影响预测的语音标记的持续时间和音调。 为了进一步利用预测的持续时间来指导生成并提高鲁棒性,我们提出了持续时间引导的掩蔽来增强语言模型学习的语音标记、音素和韵律标记之间的对齐。 在语音标记的每个解码步骤中,RALL-E 根据持续时间信息屏蔽与当前语音词符的合成无关的音素和韵律标记。

Prosody 标记作为思路提示。基于LLM的TTS的问题之一是它直接从音素生成语音,对韵律没有限制,例如:音高、时长等,通常会导致语音韵律不稳定。 CoT提示的思想是将一个复杂的任务分解为几个简单的任务,以便大语言模型利用中间结果得出最终答案。通过 CoT 提示,LLMs 在复杂任务上的正确率可以得到显著提高。 这促使我们通过在生成语音标记之前生成中间韵律标记来将 CoT 提示适应基于 LLM 的 TTS,以缓解基于 LLM 的 TTS 的鲁棒性问题。 为了将音高和持续时间合并到 VALL-E 的 AR Transformer 中,我们首先获得音素和语音标记之间的对齐,并提取每个语音词符的音高值。 然后,我们根据持续时间计算音素级音高值,并将其线性量化为 Mp 桶。 我们定义一个最大持续时间值Md,所有超过Md的持续时间值将被截断为最大值。 RALL-E 以 CoT 风格预测语音标记之前的两个韵律标记。 形式上,假设𝐩,𝐝是目标语音标记𝐂的离散音高和持续时间序列,𝐩~,𝐝~是提示𝐂~的离散音高和持续时间序列,我们对以下分布进行建模并最大化:

其中 L 是 𝐱 的长度。 在实践中,模型用两个独立的头来预测 pt 和 dt,它们的嵌入被总结并输入到模型中以进行下一步的预测。 然后,RALL-E 使用 𝐩 和 𝐝 作为新的条件预测语音符元,这使得等式 2 变成:

上述两个方程可以通过 AR Transformer 联合优化。 虽然所提出的方法增加了额外的L解码步骤,但由于L≪T,直观上对效率影响很小。

对于 NAR Transformer,我们只需将音素、音高和持续时间的嵌入求和作为输入。 这使得等式 3 变成:

如图 2 左侧所示,由于语音符元会关注 VALL-E 的 AR Transformer 中的所有音素,因此音素和语音符元之间的对齐由 VALL-E 的自注意力隐式建模。 这可能不精确并会导致诸如遗漏或幻觉之类的错误。 尽管RALL-E引入了韵律CoT提示来指导和稳定生成,但我们仍然发现模型在实验中可能无法对齐。 因此,我们提出持续时间引导掩蔽,以充分利用中间持续时间结果并提高鲁棒性。

如图 2 右侧所示,在提出的持续时间引导掩蔽中,语音符元被限制为仅关注以其对应音素(韵律符元)为中心的音素(韵律符元)窗口。 我们将窗口大小定义为k,因此每个语音词符可以参与2⁢k+1音素和2⁢k+1韵律标记。 其他位置的所有音素和韵律标记都将被屏蔽,因此它们的注意力权重始终为零。 当k=0时,语音词符严格关注其对应的音素。 如果对齐完美,这应该就足够了。 然而,在实验中,我们发现我们的对齐工具得到的对齐结果通常存在误差。 因此,我们通过允许语音词符出现在相应音素的附近音素处来放宽限制。 这种设计的另一个原因是音素的发音通常依赖于附近的音素。 正如将在第 4.3 节和附录 A 中看到的,实验结果验证了这种设计的有效性。 对于 NAR Transformer,我们在基础知识实验中应用所提出的掩蔽策略时几乎没有获得任何增益。 因此我们只在 AR Transformer 上应用屏蔽策略。

一般推理过程遵循 VALL-E [29],但有两个不同之处。 首先,在对语音词符 𝐜:,1 进行采样之前,先根据音素序列 𝐱 和声音提示 𝐩~,𝐝~ 对前音词符 𝐩 和 𝐝 进行采样。 其次,尽管普通语言模型依赖于一个特殊的词符 <eos> 作为停止条件,但由于我们知道总时长 D=∑t=1Ldt,因此我们提出了一种时长引导推理方法,强制推理在 D 步停止。 如果在 D 步之前预测到 <eos> 词符,该方法就会继续推理,并根据预测的持续时间在正确的步骤停止,从而确保不会遗漏或重复任何音素。

Seed-Music: 字节高质量音乐生成模型

字节音乐大模型Seed-Music发布,支持一键生成高质量歌曲、片段编辑等

关键内容

关键技术贡献如下:

  • 提出了一种基于新型 token 和语言模型(LM)的方法,并引入了一种能够根据不同类型用户输入生成专业生成内容(PGC)质量音乐的训练方法。
  • 提出了一种全新的基于扩散模型的方法,特别适合音乐编辑
  • 引入了一种在歌唱声音背景下的零样本声音转换的新颖方法。系统可以根据用户短至 10 秒的参考歌唱或甚至普通语音的音色生成完整的声乐混音。

据豆包大模型团队官网介绍,Seed-Music 是一个具有灵活控制能力的音乐生成系统,包含 Lyrics2Song(歌词转歌曲)、Lyrics2Leadsheet2Song(歌词转简谱再转歌曲)、Music Editing(音乐编辑)、Singing Voice Conversion (歌声转换)四大核心功能,具体涵盖十种创作任务。

目前,业界在 AI 音乐领域的研究主要集中在以下几个核心问题:

  • 音乐信号的复杂性:音乐信号包含多个重叠音轨、丰富的音调和音色以及广泛的频率带宽,不仅要保持短期旋律的连贯性,还要在长期结构上展现出一致性。
  • 评估标准的缺乏:音乐作为一种开放、主观的艺术形式,缺乏一套通用的问题表述和用于比较的黄金指标,评估局限性大。
  • 用户需求的多样性:不同的用户群体,如音乐小白、音乐初学者、资深音乐人等,对音乐创作的需求差异很大。

无论是传统的音乐辅助创作工具,还是当下热门的 AI 音乐生成的研究和产品,面向上述问题,均还处于摸索阶段。
比如针对音乐信号复杂性,Google、Meta、Stability AI 等各家在音频、演奏、曲谱层面上做了建模尝试,效果各有优缺,而且各家的评估方法均有局限,人工评测仍必不可少。
面对这些挑战,字节 Seed-Music 采用了创新的统一框架,将语言模型和扩散模型的优势相结合,并融入符号音乐的处理。

如上图所示,从高层次来看 Seed-Music 有着统一的音乐生成框架,主要包含以下三个核心组件:一个表征模型,用于将原始音频波形压缩成某种压缩表征形式;一个生成器,经过训练可以接受各种用户控制输入,并相应地生成中间表征;一个渲染器,能够从生成器输出的中间表征中,合成高质量的音频波形
基于统一框架,Seed-Music 建立了三种适用于不同场景的中间表征:音频 token、符号音乐 token 和声码器 latent。

  • 音频 token:通常以低于音频采样率的标记率学习,旨在有效编码语义和声学信息,能轻松桥接不同模态,但不同音乐信息高度纠缠,给生成器带来挑战。对应图二Audio Tokenizer的输出。
  • 符号音乐 token:如 MIDI、ABC 记号或钢琴卷帘记号等,本质上离散,可被大型语言模型操作,具有可解释性,便于用户在辅助音乐创作中交互,但缺乏声学信息,依赖渲染器生成声学细节。对应图二的MIDI编码器输出。
  • 声码器 latent在探索基于扩散模型的音乐音频生成中可作为中间表征,与量化音频标记相比,信息损失少、渲染器权重更轻,但生成器输出不可解释,且由于仅用波形重建目标训练,可能不够有效作为训练生成器的预测目标。对应图二扩散模型的输出部分。
模型架构跟Seed-TTS类似

满足多元需求专门提供高灵活编辑

Seed-Music 创新点之一,在于能通过 lead sheet(领谱)来编辑音乐,这增加了音乐创作可解释性。
在官方视频的 Lead2Song 部分,可以看到同一版歌词,通过领谱增减音轨、改变输入风格后,就能得到不同结果的歌曲,显著提高模型的实用性。
除领谱外,Seed-Music 也能直接调整歌词或旋律。比如,“情人节的玫瑰花,你送给了谁 / 你送给别人”,歌词修改前后,旋律保持不变,音乐的连贯性得以保持,过渡效果非常平滑。

输入内容除了文本,也可以是音频,它能基于原曲输出续作或仿作。下面这首英文歌曲“摇身一变”,仿写成了中文古风歌。

哪怕输入临时录制的 10 秒人声, Seed-Music 的零样本音频转换技术都能够将其转化为流畅的声乐。惊喜的是,Seed-Music 能将中文人声输入转换为英文声乐输出,实现了跨语种人声克隆,扩大了音乐小白们的创作空间。

Seed-Music pipeline:模型架构

如图所示,中间表征对整个系统来说很重要,每种表征都有其特点和适用场景,具体选择取决于用户的音乐创作任务。

  • 基于音频 token 的链路:包括 tokenizer、自回归语言模型、token 扩散模型和声码器,音频 token 有效地存储了原始信号的显著音乐信息,语言模型根据用户控制输入生成音频 token,token 扩散模型处理音频 token 以生成具有增强声学细节的音频波形
  • 基于符号音乐 token 的链路:采用符号音乐 token 作为中间表征,与音频 token 基于的管道类似,但有一些区别,如 lead sheet tokenizer 将信息编码为 token,语言模型学习预测 lead sheet token 序列,lead sheet token 是可解释的,并且允许在训练和推理中注入人类知识,但扩散模型从 lead sheet token 预测声码器 latent 更具挑战性,需要更大的模型规模。
  • 基于声码器 latent 的链路:遵循通过 latent 扩散建模从文本直接生成音乐到声学声码器 latent 表征的工作,通过变分自编码器和扩散模型将条件信号映射到归一化和连续的声码器 latent 空间。

在上述链路中,Seed-Music 经历三个训练阶段:预训练、微调和后训练。预训练旨在为音乐音频建模建立强大的基础模型;微调包括基于高质量音乐数据集的数据微调,以增强音乐性,或者针对特定创作任务提高可控性、可解释性和交互性的指令微调后训练是通过强化学习进行的,从整体上提高了模型的稳定性。
此外,在推理时,样本解码方案对于从训练模型中诱导出最佳结果至关重要。研究者们同时会应用模型蒸馏和流式解码方案来提高系统的延迟。

论文:《Seed-Music: Generating High-Quality Music in a Controlled Way》

摘要:

我们推出 Seed-Music,这是一套音乐生成和编辑系统,旨在通过细粒度的风格控制来制作高质量的音乐。我们的统一框架利用自回归语言建模和扩散方法来支持两个关键的音乐创作工作流程:受控音乐生成和后期制作编辑。为了控制音乐生成,我们的系统可以通过多模式输入的性能控制来生成声乐,包括歌词、风格描述、音频参考、乐谱和语音提示。对于后期制作编辑,它提供了交互式工具,可直接在现有音乐音轨中编辑歌词、旋律和音色。我们鼓励读者探索 https://team.doubao.com/seed-music 上的演示音频示例。

贡献。鉴于这些挑战,我们强调Seed-Music的多功能性。它支持声乐和器乐音乐生成、歌唱声合成、歌唱声转换、音乐编辑等。我们的方法、实验和解决方案旨在满足多样化的使用案例。我们提出一个统一框架,适应音乐家的不断发展工作流程,而不是依赖于单一的建模方法,如自回归(AR)或扩散。我们的关键贡献包括:

  • 我们介绍了一个统一框架,该框架结合了自回归语言建模和扩散方法,以实现基于多种多模态输入的高质量声乐生成
  • 我们提出了一种基于扩散的方法,能够对音乐音频进行细粒度编辑。
  • 我们提出了一种新颖的零样本歌唱声转换方法,仅需用户提供10秒的歌唱或语音录音。

第三部分介绍框架,该框架建立在三种基本表示上:音频标记、符号标记和声码器潜变量。将详细说明相应的流程和设计选择。在第四部分,我们深入探讨了我们的统一框架如何配置和训练以支持各种音乐生成和编辑任务。在第五部分和第六部分,我们讨论了Seed-Music的潜在应用和局限性,包括构建安全和道德生成AI系统的相关问题。

Method

我们的音乐生成系统由三个核心组件组成,如 Figure 1 所示:一个 表示学习模块,它将原始音频波形压缩为中间表示,作为训练后续组件的基础;一个 生成器,它处理各种用户控制输入并生成相应的中间表示;以及一个 渲染器,它根据生成器中的中间表示合成高质量的音频波形。

主要设计选择是中间表示。如第2节所述,我们确定了三种实用的选项:音频标记、符号音乐标记和声码器潜变量。每种选项的优缺点总结在表1中。

音频token旨在以远低于音频采样率的速率高效编码语义和声学信息。当与基于自回归语言模型的生成器一起使用时,音频标记可以有效连接不同的模态。然而,它们的主要限制在于缺乏可解释性,诸如声乐发音、音色和音高等音乐属性以高度纠缠的格式嵌入。先前的研究探讨了某些音频标记与语义特征的对应关系,而其他标记则捕捉声学方面。这种纠缠使生成器在生成音频标记时难以控制音乐的特定元素,如旋律和音色

符号token(如MIDI、ABC符号和MusicXML)是离散的,可以轻松地被标记化为与语言模型兼容的格式。与音频标记不同,符号表示是可解释的,允许创作者直接读取和修改。然而,它们缺乏声学细节,这意味着系统必须高度依赖渲染器生成音乐表演的细腻声学特征。训练这样的渲染器需要大量的配对音频和符号转录数据集,而这种数据集在声乐音乐中尤其稀缺。

来自变分自编码器的声码器潜变量作为连续的中间表示,尤其是在与扩散模型结合使用时。这些潜变量捕获比量化音频标记更细致的信息,使得在此流程中渲染器可以更轻量化。然而,与音频标记类似,声码器潜变量也是不可解释的。此外,由于声码器潜变量是为了音频重构而优化的,它们可能编码过多的声学细节,这对生成器的预测任务帮助不大。

选择中间表示取决于具体的下游音乐生成和编辑任务。在本节的其余部分,我们将介绍系统设计的技术细节,以及这三种中间表示的应用案例,详见第4节。

Audio Token-based Pipeline

基于音频令牌的管道,如图2所示,包含四个构建块:(1) 音频令牌化器,将原始音乐波形转换为低速率离散令牌;(2) 自回归语言模型(即生成器),接收用户控制输入,将其转换为前缀令牌,并预测目标音频令牌序列;(3) 令牌扩散模型根据音频令牌预测声码器潜变量;(4) 声学声码器,渲染最终的44.1kHz立体声音频波形。目标音频令牌到潜变量扩散模块和潜变量到波形声码器模块共同形成令牌到波形的过程,称为渲染器。

图2. Seed-Music管道概述,使用音频令牌作为中间表示。(1) 输入嵌入器将多模态控制输入(如音乐风格描述、歌词、参考音频或乐谱)转换为前缀嵌入序列。(2) 自回归语言模型生成一系列音频令牌。(3) 扩散变换模型生成连续声码器潜变量。(4) 声学声码器生成高质量的44.1kHz立体声音频。

音频tokenizer。音频tokenizer的有效性对该管道的成功至关重要。音频令牌嵌入了原始信号中的关键信息,如旋律、节奏、和声、音素和乐器音色。我们的实现受到Betker [2023]、Wang等 [2023b] 和Łajszczak等 [2024]的启发,并在架构和训练上进行了进一步优化,以实现以下目标:
在低压缩率下高保留关键信息,提高自回归语言模型的训练效率。
在语义和声学特征之间保持平衡,确保有足够的语义细节来优化生成器的训练,同时保持足够的声学细节以便渲染器准确重建波形。这个令牌生成与信号重建之间的权衡 [Blau和Michaeli,2019] 被仔细管理。

生成器。自回归语言模型通过对控制信号进行条件处理生成音频令牌,这些控制信号引导生成期望的音频输出。每个训练示例由配对的注释和音频组成,注释被转换为一系列嵌入,作为语言模型的前缀。不同控制信号模态的处理总结如下:

分类信号:闭合词汇标签(如音乐风格)通过查找表转换为分类嵌入,而自由形式的文本描述则使用MuLan [Huang et al., 2022]的通用文本编码器进行处理
浮点信号:旋律音符持续时间或歌曲长度等变量使用xVal编码 [Golkar et al., 2023] 嵌入,以表示连续数值输入。
歌词信号:歌词被转换为音素序列,以捕捉发音,改善模型对未见单词的泛化能力。
参考音频信号:tokenizer从参考音频中提取离散令牌序列,然后将其映射到与tokenizer的码本大小相同的连续嵌入查找表中,或者进一步聚合为轨道级嵌入。
在训练过程中,模型通过使用教师强制在下一个令牌预测任务上最小化交叉熵损失。在推理阶段,用户输入根据指定模态转换为前缀嵌入,然后自回归地生成音频令牌。

渲染器。一旦自回归语言模型生成音频令牌,这些令牌就由渲染器处理,以生成丰富的高质量音频波形。渲染器是一个级联系统,由两个组件组成:扩散变换器(DiT)和声学声码器,两者均独立训练。DiT采用标准架构,具有堆叠的注意力层和多层感知机(MLP)。其目标是逆转扩散过程,从噪声中预测干净的声码器潜变量,通过在每一步估计噪声水平。声学声码器是低帧速率变分自编码器声码器的解码器,设计类似于[Kumar et al., 2024, Lee et al., 2022, Cong et al., 2021, Liu and Qian, 2021]。我们发现,将声码器潜变量结构化为级联系统中的信息瓶颈,并结合可控的模型大小和训练时间进行优化,能够产生优于直接将音频令牌转换为波形的单一模型的音频质量和更丰富的声学细节

Symbolic Token-based Pipeline

与音频令牌基础管道不同,符号令牌生成器(如图3所示)旨在预测符号令牌,以提高可解释性,这对解决Seed-Music中音乐家的工作流程至关重要。

图3. 使用符号令牌作为中间表示的管道概述。(1) 自回归语言模型根据用户提示生成对应于乐谱的符号令牌。(2) 扩散变换模型根据符号令牌生成连续声码器潜变量。(3) 然后,声码器生成高质量的44.1kHz立体声音频波形。

先前的研究提出了旋律生成算法 [Ju et al., 2021; Zhang et al., 2022]。然而,它们缺乏对声乐音乐生成至关重要的明确音素和音符对齐信息。此外,它们仍然仅限于符号音乐生成,无法进行音频渲染。在另一条研究线上,有一些特定任务的先前工作研究了通过和声 [Copet et al., 2024]、力度和节奏 [Wu et al., 2023] 等音乐可解释条件来引导音乐音频生成的方法。受到爵士音乐家如何使用乐谱来勾勒作品旋律、和声和结构的启发,我们引入了“乐谱令牌”作为符号音乐表示。我们强调乐谱令牌与音频令牌相比的关键组成部分、优点和局限性如下。

• 为了从音频中提取符号特征以训练上述系统,我们利用内部开发的音乐信息检索(MIR)模型,包括节拍跟踪 [Hung et al., 2022]、调性和和弦检测 [Lu et al., 2021]、结构部分分段 [Wang et al., 2022]、五种乐器的MIDI转录(即人声、钢琴、吉他、贝斯和鼓) [Lu et al., 2023; Wang et al., 2024a],以及歌词转录。乐谱令牌表示音符级细节,如音高、持续时间、在小节中的位置、与音符对齐的声乐音素,以及轨道级属性,如段落、乐器和节奏。

• 乐谱令牌与可读乐谱之间的一对一映射使创作者能够直接理解、编辑和与乐谱互动。我们尝试了不同的方法来生成乐谱令牌序列:REMI风格 [Huang和Yang, 2020] 和 xVal [Golkar et al., 2023]。REMI风格的方法将乐器轨道交错到量化的基于节拍的格式中,而xVal将起始和持续时间编码为连续值。虽然xVal风格编码在更贴合我们生成模型的最终产品——音乐表现,但我们发现REMI风格更适合与音乐家的用户互动。

• 乐谱令牌允许在训练和推理过程中融入人类知识。例如,可以在预测序列中下一个令牌时应用音乐理论规则作为约束,以提高预测准确性。

• 由于乐谱令牌缺乏声学特征表征,我们需要在级联渲染器中扩大令牌到潜变量的扩散模型,以实现与音频令牌基础系统相同的端到端性能。

Vocoder Latent-based Pipeline

先前的研究 [Evans et al., 2024c,d; Levy et al., 2023; Rombach et al., 2022] 表明,“文本到音乐”的任务可以通过直接预测声码器潜变量来实现高效的方法。类似地,我们训练了一个在低潜变量帧率下运行的变分自编码器(VAE),并配合一个扩散变换器(DiT),将条件输入映射到标准化的连续声码器潜变量,如图4所示。

图4. Seed-Music管道,使用声码器潜变量作为中间表示。(1) 通过交叉注意、前缀或时间条件将各种输入类型输入到扩散变换器(DiT)。(2) 扩散变换模型预测连续声码器潜变量。(3) 然后,声学声码器生成高质量的44.1kHz立体声音频

基于音频令牌的管道相比(见第3.1节),自回归变换器模块被省略,尽管DiT和声码器的架构仍然大体相似。为了实现可比的性能,其他剩余模块的模型大小被扩大。在自回归方法中,所有条件输入被编码为前缀序列中的令牌,这可能导致过长的前缀,从而在处理更大和更复杂的输入时性能下降。相反,基于声码器潜在设计提供了更大的灵活性,能够更好地融入更广泛的条件信号,并支持多通道输入和输出。我们总结了不同类型提示的使用方式如下:

  • 声码器潜在空间中的上下文条件:这使得音频修补场景成为可能,例如音频延续和编辑。
  • 输入噪声空间中的上下文条件:对于歌词和风格描述等可变长度输入,交叉注意层在每个变换器块中应用,以融入这些输入。
  • 跨多个轨道的时间输入:时间变化信号(如旋律轮廓、强度曲线和时间对齐的乐器音轨)可以在去噪过程中每一步添加作为条件输入。
  • 多通道输出:在训练期间提供多通道输出示例时得到支持。例如,模型可以生成多个音乐上不同的音轨(如人声、贝斯、鼓和吉他),从而实现混音和重混等下游制作场景。这些音轨级别的训练示例可以通过音乐源分离(MSS)获得。

Model Training and Inference

对于上述所有管道,Seed-Music经历三个训练阶段:预训练、微调和后训练,类似于Seed-TTS和其他基于文本的语言模型。预训练阶段旨在为通用音乐音频建模奠定更好的基础。微调阶段包括数据微调以增强音乐性,或指令微调以提高特定创作工作流程的可控性、可解释性和互动性。

Seed-Music的后训练通过强化学习(RL)进行,这已被证明在文本和图像处理方面是一种有效的学习范式。近期研究表明,近端偏好优化(PPO)可以扩展到音乐和语音生成。受这些发现的启发,我们探索了RL方法,以改善生成输出与各种输入控制信号的对齐,并增强音乐性。我们考虑的奖励模型包括:原歌词提示与从生成音频提取的歌词转录之间的编辑距离,输入流派与音频输出检测流派的比较精度,以及歌曲结构提示与生成音频检测结构之间的匹配。此外,基于节奏、乐器、音频参考和用户语音提示的额外奖励模型可以用于指示生成输出中强调哪些音乐属性。此外,结合人类反馈可以产生捕捉用户细微偏好的奖励模型。我们将对RL的深入研究留待未来工作。

在推理过程中,样本解码方案的选择对自回归和扩散模型的输出质量和稳定性至关重要。我们观察到,仔细调整无分类器引导至关重要,以确保音乐性和对提示的遵循。为了减少延迟,我们应用模型蒸馏以最小化DiT模型所需的迭代步骤。此外,我们开发了一种流式解码方案,允许在自回归模型继续生成令牌序列的同时进行音频流生成。

Experiments

在本节中,我们展示了四个基于模型能力的应用:Lyrics2Song(第4.1节)、Lyrics2Leadsheet2Song(第4.2节)、MusicEDiT(第4.3节)和zero-shot唱歌声音转换(第4.4节)。

Lyrics2Song中,我们介绍了一个基于用户提供的歌词和音乐风格输入生成高质量人声音乐的系统。Lyrics2Leadsheet2Song在Lyrics2Song的基础上,结合了符号音乐表示,以增强可解释性,并生成乐谱,用户可以访问并调整旋律和节奏,从而更精细地控制最终音频输出。MusicEDiT探索了一种基于扩散的修补系统,使用户能够编辑现有音乐音频的歌词和旋律,作为后期制作工具来修改歌曲的人声。在zero-shot唱歌声音转换中,我们提供了一种解决方案,允许用户基于自己的声音在现有音频中修改人声音色,且仅需最少的参考数据。这一应用以低准备成本促进了人声个性化。对于上述每个应用,我们讨论了与中间表示、模型架构和其他配置相关的设计选择,以优化系统以适应各自的用例。

Lyrics2Song

Lyrics2Song生成基于用户提供的音乐风格描述和带有章节标签(如“段落”、“副歌”和“桥段”)的歌词的声乐音乐表演。这项任务利用音频基于令牌的管道,借助令牌化和自回归技术对多模态数据(即歌词、风格、标签和音频)进行对齐,并支持流式解码以实现快速、响应式的交互。

该系统支持短音频片段的生成和完整曲目的制作。生成的音频展示了富有表现力和动态的人声表演,旋律动人,并且乐器种类繁多,涵盖多种风格,展现出成熟的音乐性。

带音频参考的人声音乐生成

除了风格描述外,我们的系统还支持音频输入作为提示来指导音乐生成。通过收听示例,可以看到输出是如何参考音频提示的音乐风格生成的。由于用文本或标签描述所需音乐对新手用户来说可能不够直观,因此音频提示提供了一种更有效的交流音乐意图的方式。

我们的系统支持两种音频提示模式:继续模式和混音模式。在继续模式中,从音频参考提取的音频令牌被连接到前缀中,以继续自回归生成,从而确保与参考音频在结构、旋律和声响上的高度相似。在混音模式中,音频参考被转换为预训练的联合文本-音频嵌入空间中的嵌入向量。这一嵌入总结了音频参考的全局特征,然后被纳入前缀中以指导生成,使生成的音频能够采纳不同的风格。

在这两种模式下,我们的模型展示了强大的能力,能够保持输入歌词与音频参考中固有歌词之间的连贯性,即使在没有自动歌词转录的帮助下。当输入歌词在结构和语义上与音频参考中的歌词相似时,模型倾向于模仿参考的旋律和结构。然而,当输入歌词在风格上显著不同(例如语言、结构、押韵)时,连贯性会减弱。尽管如此,模型仍能有效保持自然的节奏模式、乐器、声乐质量和整体音乐主题。

器乐音乐生成

虽然音频基于令牌的管道主要设计用于声乐音乐生成,但如果歌词输入仅包含章节标签而没有文本,它也支持器乐音乐生成。我们提供了多种风格的器乐生成示例,每个部分按指定时间展开,并展示了部分之间清晰的结构转换(例如,从段落到副歌)。

评估指标

我们使用以下定量指标在开发过程中评估生成质量。这些指标也被重新用于自回归语言模型的强化学习过程中的奖励模型。

  • 词错误率(WER):我们使用内部开发的唱歌歌词转录模型,该模型支持英语和中文,以转录生成的音频并计算与歌词提示的词(或拼音)错误率。虽然有用,但由于延长元音、辅音、音高变化和类似非语言节奏等因素,WER并不是评估音乐声乐质量的完美指标。这些特征可能会引入噪声。
  • 音乐标签性能:为了评估生成音频与输入风格描述之间的对齐,我们使用内部开发的音乐标签和结构分段模型,从生成的音频中预测高层次的音乐属性,包括流派、情绪、声乐音色、声乐性别和结构部分。这些预测属性与输入的风格描述和章节标签进行比较,以平均精确度分数作为相关性的定量指标。

对于定性评估,我们使用比较平均意见得分(CMOS),基于一组音乐训练评审员的反馈。我们定义了以下三个评估维度:

  • 音乐性:评估音乐属性,包括声乐旋律的新颖性、和声的适当使用、惯用音乐形式(例如主题、变奏)、连贯结构、合适的和弦进行、特征节奏模式和完善的乐器配器。
  • 音频质量:评估声学特性,如声乐清晰度、乐器真实感、频谱细节以及鼓的瞬态和起音的清晰度。评审员还考虑任何不希望的音频伪影,如失真、闷音或某些频段能量缺失。
  • 提示遵循:衡量生成音频与输入歌词和风格提示的吻合程度。

在语音领域,基准数据集已建立用于评估TTS系统,采用WER和自动说话人验证(ASV)等指标。然而,目前没有相应的音乐生成基准提供定量评分。此外,音乐性—评估音乐生成质量的关键因素—具有高度的主观性,并且难以用客观指标量化。我们鼓励读者收听提供的音频示例,以更好地评估我们系统的质量。

音频令牌与声码器潜在

我们还使用声码器潜在基础管道进行Lyrics2Song实验,取得了与音频令牌基础管道相当的性能。然而,我们发现自回归语言模型在交互应用中固有地更适合于扩散模型。其因果架构使流式解决方案能够提供近乎实时的体验,同时还允许与多模态模型的未来集成。

Lyrics2Leadsheet2Song

Lyrics2Leadsheet2Song管道是一个两步过程,用于实现Lyrics2Song任务:Lyrics2Leadsheet和Leadsheet2Song。在第一步中,从输入的歌词和风格描述生成乐谱令牌。在第二步中,从乐谱令牌生成音乐音频。整体管道如第3.2节所示。乐谱令牌使用户能够参与生成过程,在最终渲染之前编辑旋律、和弦、乐器和节奏。

Lyrics2Leadsheet

我们基于[Chen et al., 2024c]开发了一种基于规则的符号音乐编码方案,以将音乐音频片段的符号特征编码为乐谱令牌序列。如图5所示,该方案编码了歌词和各种音乐事件。它识别八种事件类型:歌词音素、小节、和弦、声乐音符、低音音符、钢琴音符、吉他音符和鼓音符。除“小节”外,每种事件类型在乐谱令牌中都表示为一个独特的“轨道”。小节事件定义了基本的时间结构,各轨道按小节交错排列。

对于轨道内的每个事件(例如,音素、音符、和弦),我们在适用时编码开始时间、持续时间和音高值。

如第3.2节所述,生成器使用我们内部的MIR模型提取的乐谱令牌进行训练。以下是一些示例,展示了自回归语言模型如何根据输入的歌词和风格提示预测与音素对齐的音符,以及适合流派的旋律和节奏。

Leadsheet2Song

Leadsheet2Song管道涉及从一系列乐谱令牌渲染完整的音频混音。在演示示例中,我们展示了生成的声乐音乐如何遵循给定乐谱令牌中的声乐旋律、音素、节奏、和弦进行和乐器音符。渲染器有效地生成自然且富有表现力的多乐器音乐表演的细微差别,为专业人士提供了一种强大的工具,以快速回顾音频结果,而无需在合成器中进行细致的参数调整。

Leadsheet2Vocals

除了生成完整的音频混音外,Lyrics2Leadsheet2Song系统可以配置为生成单独的音轨,包括人声、鼓、低音、钢琴和吉他,既可以使用符号表示也可以生成音频。唱歌声音合成(SVS)是该系统的一个应用,其中模型设置为仅输出人声音轨,如这些示例所示。

Music Editing

在本节中,我们探讨音乐音频编辑作为后期制作过程。第3.3节中描述的基于扩散的方法的非因果特性使其特别适合此类任务。例如,在文本条件下的修补中,扩散模型能够在遮蔽音频段前后访问上下文,从而确保更平滑的过渡[Wang et al., 2023c]。我们将此框架视为乐谱条件下的修补任务,以训练DiT模型。在推理过程中,修改后的乐谱作为条件输入,遮蔽与乐谱中修改部分对应的音频段并重新生成。

在这些听力示例中,我们展示了系统在保持旋律和伴奏的同时,精确修改演唱歌词的能力,支持英语和普通话的演唱。在某些情况下,歌词在同一语言内进行修改,而在其他情况下,系统允许在语言之间交替。此外,在这些示例中,我们展示了用户如何在指定的时间段内精确调整旋律,同时保持歌词、其余旋律和伴奏轨道不变。这种新的“生成音频编辑”范式让我们感到兴奋,因为它保留了原始曲目的音乐表现和基本特质,而这一点在没有重新录制人声及原始乐器音轨的情况下以往是复杂或几乎不可能实现的。

Zero-shot Singing Voice Conversion

为创作者编辑声乐音乐的最直观方式之一是将声乐音色转换为与其自身声音相匹配的音色。本节探讨了作为Seed-Music套件最终组成部分的唱歌声音转换(VC)系统。尽管我们的唱歌VC方法与Seed-TTS中介绍的语音VC有相似之处,但在声乐生成背景下的声音克隆和转换面临更大的挑战[Arik et al., 2018]:

  • 声乐混合:声乐音乐通常由声乐和背景乐器伴奏组成,两者在和声和节奏方面具有强一致性。相比之下,语音信号往往包含与语音内容无关的背景环境声音。尽管现代MSS模型可以隔离声乐,但通常会引入降低质量的伪影。我们的目标是开发一个可扩展的系统,能够直接处理声乐与背景轨道的混合,而不依赖MSS,从而避免这些伪影。
  • 声乐范围:唱歌声音的音高范围远大于语音。在零-shot唱歌VC中,系统必须将参考声音的音高范围推广到合成的唱歌声音,这对模型的鲁棒性提出了很高要求。
  • 声乐技巧:唱歌声音具有高度表现力,并涉及比语音更多的技巧。同一位歌手在歌剧中、音乐剧或爵士即兴中演唱时,听起来可能截然不同。唱歌VC系统必须准确捕捉和重现这些表现性技巧,同时处理清晰发音和韵律等常规语音特征。
  • 唱歌与语音参考:在VC应用中,用户通常提供语音作为参考声音,无论是用于语音还是唱歌合成。我们的系统专门设计为能够接受无论是语音还是唱歌的参考声音,并能够有效地使用短语音片段作为参考进行唱歌VC。
  • 业余与专业唱歌:与语音VC数据相比,业余唱歌与专业唱歌的配对数据显著较少。这使得唱歌VC特别具有挑战性,因为模型必须适应非专业唱歌输入,并将其转换为专业质量的表现。例如,如果用户提供的唱歌参考音调不准,唱歌VC系统不仅要捕捉其声音的音色,还必须纠正音高。

听力示例展示了我们的唱歌VC系统在不同场景下的表现。结果的质量在很大程度上取决于参考声音与目标唱歌信号之间的相似性。例如,当两者都是用英语演唱的男性声音时,效果最佳。然而,处理跨性别和跨语言的情况更具挑战性,往往会导致伪影、失真和发音不一致等问题。

结论

在本报告中,我们介绍了Seed-Music,这是一个全面的音乐生成和编辑系统套件,旨在支持多样化的音乐创作工作流程。我们展示了该系统如何基于多模态输入(包括歌词、风格描述、音频参考、乐谱和声音提示)生成高质量的声乐音乐。我们的统一框架通过三种中间表示(即音频标记、乐谱标记和声码器潜在表示)及其相关管道,满足各种用例,为用户提供灵活的工具,从创意到生成和编辑。

从应用的角度来看,Seed-Music 降低了艺术创作和音乐表达的门槛。我们相信本报告中的演示可以赋能从初学者到专业人士的广泛创作者。例如,文本到音乐系统与零-shot唱歌声音转换的结合,使初学者能够更深入地参与创作过程。初学者不仅是从远处与音乐互动,而是能将自己独特的声音和身份融入到过程中,增强创意的构思。

音乐也是短视频、电影、游戏和增强现实/虚拟现实体验等补充媒体的重要组成部分。实时条件控制和生成音乐的渲染引入了全新的互动形式,超越了传统的音频播放。我们展望新的艺术媒介,在这些媒介中,生成音乐能够响应来自文本、游戏叙事和视觉艺术风格的条件信号。

对于专业人士而言,提议的乐谱标记旨在无缝集成到音乐家、作曲家、歌手和艺术家的工作流程中。我们相信,这些标记有潜力发展成为音乐语言模型的符号标准,类似于传统音乐制作中的MIDI。音乐家和制作人可以在保持对旋律、和声和节奏元素的熟悉控制的同时,利用生成模型的强大功能。此外,能够编辑和操控录制的音乐,同时保持其音乐语义,将为行业节省大量时间和成本。我们对未来在音轨生成和编辑方面的发展特别感兴趣,这将超越声乐轨道。这些能力将使专业人士能够更高效地探索音乐创意,从而增加发现“意外惊喜”的可能性,这通常对创作过程至关重要。

讨论:如何用1024张显卡训练一个模型?

文章来源于一个知乎问题:如何判断候选人有没有千卡GPU集群的训练经验?确实对于普通开发者来说,大概率从未尝试过使用数千张GPU训练一个模型,这方面确实是一个很好的研究方向,也是成为顶尖算法工程师所必需的必经之路,因此记录下知乎的一些回答,用于学习和记录。虽然目前还没有机会能够调用数千张GPU用于模型训练,但对于目前几十张GPU进行并行训练也有帮助。

高赞回答1:如何用千卡进行训练

最近看到知乎一个回答,把千卡训练的难度吹上天了。但其实真正用过千卡就会发现也就那么几个点。于是想写一篇文章简单讲讲。

本文将包括三个部分:

  • 首先我们将讨论千卡训练的难题,以及应该在什么时候使用千卡训练;
  • 接着,我们将讨论如何在一千张卡上开始训练,如何让他达到近乎线性的性能提升;
  • 最后我们将展开讨论一些千卡训练当中仍然悬而未决(至少对于开源社区来说)的问题。

为什么千卡训练是困难的?

其实那篇回答在这部分说的没错。千卡训练和八卡训练的区别是—显卡多了一百多倍。

这意味着什么呢?

  1. 通信时间增加
  2. 故障概率增加

这俩问题都很好理解。

时间上,PyTorch 内部支持 NCCL / Gloo / MPI 三个通信后端(请务必使用 NCCL。)其中训网络最常用的 AllReduce 操作【从多个sender那里接收数据,最终combine到一个节点上】会根据具体硬件配置走 Ring AllReduce 和 Tree AllReducering allreduce和tree allreduce的具体区别是什么?。Ring 的时间复杂度是 O(pn),Tree 的时间复杂度是 O(log⁡pn)。就算是理论上 128 节点也比单节点慢至少七倍,实践当中跨节点通信要远比单节点慢得多。

故障上,一个节点出问题的概率是 p,128 个节点就是 1−(1−p128)。也就是说如果一个操作在一个训练当中的出错概率是 1%,那么在 128 节点当中的出错概率就是 72.37%。

此外,随着规模的增大,许多问题都会变得难以忍受。比如数据增强要花 0.1s,一亿条数据就是 278 个小时(当然这只是胡拆的一个数字,实际有各种机制所以不会有这么大影响。

因此,钱多烧手并不是使用千卡训练的理由。闲得蛋疼可能是,但你得多蛋疼才能想出这么折磨自己的 idea?

因此,千卡训练解决的问题是大模型&大数据问题如果你的训练时间没有超过 8192 GPU 日,那么你绝对不需要一千张显卡。

看到这里,绝大多数人已经可以关掉这篇文章了。除非你的模型和数据都以 B(十亿)来作为计量单位。当然如果你正在厕所里手机没电想看点儿东西解闷儿的话(虽然我很怀疑是否会有人把他打出来……那么可以继续往下看

如何使用一千张卡训练?

如何提高计算效率?

这件事情其实是一个 case by case 的事情。因为通信、计算速度啥的受硬件影响更多。同样是 A100 集群,我全 DGX 节点,每一张 A100 都是 SXM 接口并配一块儿专属的 IB 网卡。你一个小破普惠服务器插 8 张 PCI-E A100,IB 卡一个节点只给一张。那咱俩遇到的问题就完全不是一个问题。

因此,要讨论如何提高训练效率、减少训练耗时,我们首先要了解训练耗时在哪里。那么,一个训练步的耗时在哪里呢?需要谨记,没有 profile 的优化是没有意义的。

你可能会说,forward backward sync。很好,这说明你了解 PyTorch 的基本流程。不过现实当中要复杂得多。

  1. dataset 读取数据,构建输出
  2. dataloader collate 数据,进行数据预处理
  3. 模型 forward 计算输出
  4. loss compute
  5. 模型 backward 计算梯度
  6. 模型 sync 梯度
  7. 优化器 step 更新权重
  8. 打印 log

当然这是可以无限细分下去的,但一般这些就够了。需要注意的是,除了 4-7 的耗时是真耗时,其他都需要通过异步操作来盖掉。这也是我们的优化目标。

异步执行在 PyTorch 的 dataloader、CUDA 和分布式当中都存在。前者可以通过设置 num_workers 和 prefetch_count 为 0 来关闭,后两者可以通过 cuda.synchornize 和 dist.barrier 来执行手动同步。在 profile 时,我们需要首先需要测整个 step 的时长。然后再在每次测量前执行手动同步来计算每个部分的时长。如果前者的总耗时等于后者 4-7 的耗时之和,那么通常不需要执行任何操作。但这种情况在千卡操作中几乎不可能发生。

第 6 步通信往往需要耗费大量时间。因此,我们还需要进一步优化通信。

以下内容是对PyTorch Distributed的概括,有感兴趣的同学建议通读并背诵全文。

计算-通信重叠

在 PyTorch 当中,梯度的通信和反向传播是交叠进行的。也就是说,每完成一层的梯度计算,都会立即触发当前层的同步。实现起来也很简单,每个进程在完成自己第 k 层的梯度计算后都会触发一个钩子来给计数器+1s。当计数器达到进程数时开火进行梯度通信。有很多同学在计算梯度过程中遇到过 RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. 错误,这就是因为有的模块没有参与计算 loss,导致梯度同步卡住了。需要注意,当 find_unused_parameters=True 时,PyTorch 分布式使用 nn.Module.__init__ 当中定义子模块的反向顺序来作为梯度桶的构建顺序。因此,确保模块定义和调用的顺序一致是一个良好的实践。

梯度合桶

尽管理论上来说,同步发生的越及时,重合度越高,性能越好。但实际上每次发起通信都是有上头的。因此,现实当中梯度同步并不是越多越好越快越好。为此,PyTorch 引入了梯度合桶机制,通过把多个 Tensor 装在一个桶里再通信桶来减少通信次数从而减少总耗时。合桶的 bucket_cap_mb 默认是 25MiB,这对于绝大多数模型来说都是太小的。目前已经有提升这个默认值的特性需求,但是这个还是调一下更好。

梯度累加

当你做完所有操作之后,惊喜的发现 TMD 怎么同步时间还是单节点的好几倍。这其实是正常情况……实际上超过 256 卡的训练想要把通信盖掉就是一件不可能的事情。你说老师我看 FB 论文说他们 256 卡就是线性提升啊…那这里不得不提的一个策略就是梯度累加了。梯度累加会执行 k 次 forward+backward 之后再执行优化器步进。这有很多好处,首先对于大模型 batch size 通常不能开多大,梯度累加可以提升等效 batch size。其次累加期间的 backward 不需要通信梯度,加快了训练速度。

少即是快

Python 是一种很慢的语言。当然你说 JIT trace+torch.compile 有提升我也不反对,但对于最高效率来说,只有必须要存在的代码和不存在的代码两种。

抱抱脸的 Transformers 就是一个反例。两个子模块就能写完的 TransformerLayer 他们硬是能写出来一堆…偏偏他们还信奉 Single Model File Policy……我寻思你这完全不考虑继承的封这么多层是要搞鸡毛啊?正例反而是 PyTorch……(笑死,我竟然会夸脸书代码写得好。具体来说就是 nn.functional 当中的各种实现。你会发现他们第一行往往是 handle_torch_func。熟悉 Python 装饰器的小伙汁通常要问了,为啥这里不用个装饰器统一一下?因为装饰器会引入额外的函数调用,额外的函数调用就是额外的上头。

因此,如果你想确保最高的效率,写一个简单的训练代码和模型代码非常重要。毕竟,1%的效率提升,节省的可能是数百个 GPU 日。

如何平稳训练

这一段当中中咱们只讨论你能控制的问题。

捕捉不致命的异常

故障率高的问题其实很好解决。在训练当中,大部分异常都是非致命异常,接住他们就好了。我之前写过一个装饰器,catch,它的作用就是接住异常,然后调回调函数(默认当然就是把错误打印到 log 里)。所有你需要做的只是使用它来装饰所有非 fatal 的操作。

在实际应用当中,我们遇到的最常见的问题是存 ckpt 写满了磁盘(不准笑,从商汤到上海 AI Lab,这个问题在哪儿都日常出现。咱也不知道为啥肯买那么多显卡但不肯多插点儿硬盘,咱也不敢问)。接住所有保存操作,如果你有闲心可以在回调里删一下之前的 ckpt。没闲心的话…大不了重训一次嘛(逃。)第二常见的问题,你猜对了……存 log 写满了硬盘……所以所有 logging 操作也都是要 catch 的。这就是为啥我都用 tmux 然后开很长的缓存窗口,总是能抢救一些 log 出来的。

咳咳,说点儿正经的。任何联网操作都是需要 catch 的,常见的联网操作主要包括从 ceph 读取数据和…写 log 到远程(逃。其他就没啥了吧,我见过有大哥尝试恢复 OOM 的,但效果似乎不是很好,至少我自己没用过。简单来说,唯一不应捕捉的错误是集群炸了。

那有的大兄弟就说了,集群没爆炸,但是有两张卡突然掉了咋办。这个咱第三部分再讨论。

管好模型的输出

模型训着训着发散了几乎是每个训大模型的人都会遇到的问题。输出和 loss 只要有 nan 果断丢掉。梯度先 clip by value 再 clip by norm 都是常规操作。哦对了,还有初始化……关于大模型收敛性的论文有一堆,此处不再赘述。

比更大,还更大,再更大

弹性训练

实际上当你的训练超过 2048 个 GPU 日时,在整个训练过程当中发生单个 GPU 甚至单个节点下线是再正常不过的事情了。

PyTorch 在 1.10 就引入了 torchelastic 弹性训练机制。这个东西,用过的都骂娘。等下,让我先骂一遍。呸。ok 咱们继续吧。

我印象当中在微软的最后一轮面试当中被问到了这个问题:如何设计一个弹性分布式系统。

我的回答很教科书。每 k 分钟,系统会做一次 AllGather 来统计存活进程数,然后选举出一个主进程。主进程会计算好每个进程的 rank 和 local rank 然后广播给各个进程。所有进程每次前向传播开始时向主进程发送一个心跳包来汇报状态。主进程会根据心跳包来确定这一个 step 参与同步的机器有多少。

但很可惜,2024 年了。还是没人去写。他妈的。

层次化梯度同步

我一直认为梯度同步不应该以 GPU/进程为单位。而应该分为大同步(节点间同步)和小同步(节点内同步)。小同步可以更高频的进行,大同步则可以更慢的执行。这样不仅能提高实际的梯度同步频率,降低同步总耗时,并且还能天然的去结合小 batch 和大 batch 训练的优点—节点内小 batch 关注个体,节点间大 batch 关注整体。

有没有发现所有东西都很简单?
是这样的,千卡训练是任何一个普通CS本科生花三个月就能学会的东西。没有任何复杂的地方。

延伸阅读

PyTorch DDP 设计笔记

PyTorch 微调菜谱

分析与优化使用 PyTorch 训练机器学习模型

使用 Nsight Systems 来分析 GPU 负载

DLProf

NVProf

NCCL AllReduce 设计

Spike No More

Understanding the difficulty of training deep feedforward neural networks

高赞回答2:关于千卡训练的难度分析

千卡,其实是个相对模糊的概念,对于多数人而言,这就跟你告诉你,我有1兆资产和10兆资产一样,你只知道很多很多,但是完全傻傻分不清楚,这到底是多少,能买多少东西。千卡,也是一样。按照常见的一机8卡GPU的类型来看,用过125台机器训练的,就算得上是千卡了。从这个角度上说,其实门槛也没有那么那么的高。可事实呢?真正的大模型要用多少机器训练?答案是远超千卡 —— 看看下面的GPT-4信息,这是千卡吗?比万卡还要多!!!

How much compute was used to train GPT-4?
2.15e25 floating

Some key facts about how this enormous model was trained: Used 25,000 Nvidia A100 GPUs simultaneously. Trained continuously for 90–100 days. Total compute required was 2.15e25 floating point operations.Sep 27, 2023

另外,从根本上说,千卡训练是一个复合体。很多时候,大家就知道一件事,“牛逼”,除了知道喊666之外,就少有了解到底牛逼在哪里。以至于说,觉得非常的高大上。我可以这么说一句,千卡及其以上的训练对于绝大多数人和企业而言,这就是个屠龙术 —— 除了某些个,用手指头数的出来的地方,别的地方完全没有这样的需求,也没有这样的资源来进行千卡训练。这是什么意思?意思就是。如果真有这样经验的人,流了出来,大概率很难对口的找工作,因为他在千卡集训中的训练经验和工程实践,大概率根本别的地方用不上。另一层意思是,如果你只是个一般人,那你想想就得了,就跟你可以意淫下某个自己喜欢的明星,但别真去追求,真要去了,你大概是连榜一大哥的待遇都不会有,注定了人财两空。我当然知道有人会说,那难道流出来的人,不能去那几个指头数的出来的地方吗?可以的,但是别着急,你们往后面看就知道了 —— 去还是能去的,但是如果他不是跟着大佬一起跑,到了新地方他们真不见的能继续干。

再来说说,千卡训练是个什么复合体 —— 至少是,科学,工程和人情世故。先看大模型训练中的任务怎么从“量变到质变”的 —— 任何一个小规模训练上的问题,放大几百几千倍之后,都有可能成为不可忽视的问题。比如,数据预处理,小的时候,你也许完全不在意,这到底是多少个毫秒搞定的。但是,如果你现在有上百T的数据要处理,手一抖,写个不那么高效的算法,多处理个几天,甚至几周都有可能。当然,更可怕的就不是慢,而是坏了 —— 一个小bug可以坏了整条pipeline。有的时候,你甚至都不能说是bug,但是反正不爽就是了。比如,两个人写预处理,一个人把图片弄成了BGR,一个弄成了RGB —— 又不是不能用,但是就是膈应人;又比如,数据原图太大了,要统一缩放,然后有人做的时候直接就缩成了方形,然后呢?我们之后需要的模型要正常长宽比的数据又该怎么办呢?再来一次嘛?再搞两个礼拜?你说这是个什么问题?可以看成是科学,当然也可以看成是工程的一部分,这两个就是紧密结合在一起的,单单你会调模型,在这个千卡训练的事情上,你是玩不转的。因为很多问题卡脖子的问题,根本就是,或者大概率是工程问题 —— 什么网络通信,什么磁盘空间,什么读取速度,什么数值稳定,小规模的时候,你都可以不用管,想怎么搞怎么搞,怎么搞可以怎么有。可是上了规模之后,很多东西都被限定死了,根本不是你想怎么干就能怎么干的。我说的这个话,大概很多用pytorch+cuda的朋友也不见的认同,毕竟这套组合下,没有太多技术支持的团队也干成了这样的事情。但是,这背后是因为,使用能支持这样训练的云服务本身就意味着,付了更多的钱,在已经白嫖了nvidia一波的前提下,外加meta(pytorch),外加微软(deepspeed),外加……,又变相雇佣了一个专门的支持团队。但是,这些都不改变一个事实 —— 那就是,这都是你跟着前人的脚步前进,有人替你已经把这条路上的坑,踩的差不多了。可是,如果你要做些原创性的工作呢?必然是会遇到很多前人都不会有的问题。

多说一句,也许有人会说,“我不关心别的,我就只关心pytorch+cuda下,做训练的经验”。那我告诉你,这本质上这跟你单机单卡训练就不应该有什么不一样,跟是不是pytorch,用不用cuda都没什么大关系 —— 你想想最理想情况下,这是不是就应该跟单机单卡训练一样么,无非就是现在的这个“单机”的GPU内存是所有的机器GPU内存的总和,能让你用一个更大的batch size和学习率。至于,GPU内部怎么通信,数据怎么通信,各个机器怎么通信,gradient传播怎么实现,需要你这个训模师知道吗?你在单机单卡的时候都不用知道,在单机多卡的时候不用知道,在小规模分布式训练的时候不用知道,那为什么到了千卡的时候,你就应该知道了?理想情况下,就算到了百万卡,也不用做建模的你去知道这里的各种工程实践。

那千卡训练到底难在哪里了?首先,就是难在之前提及的工程上面了 —— 简单假设一个卡在一天内不挂掉的概率是p,那么现在现在千卡同时一天内不挂掉的概率是多少?算算你就知道,对于p^1000,其实有机器挂掉才是正常的。如果是万卡呢?你可见的是,机器N越多,p^N就越小,这个事情就是越难。有人要说“我单机训练的时候,几年都遇不到问题,老黄的GPU稳定的一塌糊涂。”对此,我也只有呵呵,没人告诉你训练不下去都是GPU的问题。你大概是选择性忘记了各种自己训练中遇到的事情 —— 比如,上次实验中断,GPU进程没杀干净,还占着内存;和人共享的服务器上,有个卧龙觉得你训练的时候CPU占用率低了点,给你加了点任务;好巧不巧,默认的缓存地址没地方了,包装不上了,预训练模型下不来了…… 说这么多看似和训练无关的事情是因为,所有这些都要能自动化,因为里面有一个地方翻车了,你训练就进行不下去了。通信连不上,磁盘满了,遇上了奇葩的GPU,IO巨慢 …… 不管什么原因挂掉了,关键的是之后应该怎么办?有没有可能对这个出问题的机器进行热替换?怎么办才能最大程度不影响训练进程?怎么样才能在下次避免同样的问题。当然,实际情况可以更加复杂,GPU不见的是同批次的,模型也可以大到,哪怕在A100上也只能这个机器放一部分,那个机器放一部分……

但是也别误解,以为千卡训练,就对训模师而言,其实没什么挑战。这样的理解显然是错的。这对训模师的实操来说,肯定是一个巨大的挑战。完全是拿着卖白菜钱(想想你年薪才多少,算你年薪百万好了),操着卖白粉的心(这千卡训练要花多少钱?你年薪都不够它的一个零头)。因为这机器一开,实在是太烧金了。而且可见的是,你必然是要去debug的 —— 为什么小模型的时候,训练的挺好的,一变大就翻车了?或者说,虽然没翻车,但是为什么性能就涨了一丢丢?或者为什么前面训练挺稳定的,到了后面的loss curve就会有很大的spike?有经验的训模师能更早,更快的发现问题。也能更快和更好的解决问题。很多时候,也真不见的看log就能看出来点啥的,看数据,看gradient的大小分布,和其他模型的训练进行记录做比对,甚至做可视化,都是很有必要的。而这所有的一切,都需要你很有经验 —— 同样的log,有人就能一眼看出来问题在哪里,有人就只能对着发呆,或者机械性的说“换一组参数再试一下”。同样觉得可能哪里有问题,有人就能知道应该来验证这个猜想是对是错,有人就只能天马行空的给出一堆,谁也不知道对不对的原因。所以,一旦这条路线被摸索出来之后,其实也就没什么难度了 —— 数据,脚本,机器都在那里了,我就问你,我在服务器上run那条千卡训练命令,跟你run的能有什么不同?所以,真正的关键不是在于有没有用过千卡GPU训练过模型,而是有没有从头至尾,一路披荆斩棘的自己淌出来一条可重复的模型技术路线!!

当然,如果你要以为,这事情就只是技术,那也是太年轻了点。机器一开,要多少钱,这账真要算准从训模师的角度说是很难的,毕竟具体价格都是大公司之间协议的,属于商业机密,但是估算个大概的数目不难。按照aws的p4d算(8卡A100,见下图),便宜的算法,千卡训练一个月,需要花费 $11.57/每台小时*24小时/天*125台*30天 = $1,041,340;按照阿里云的算法,单卡年费¥170533.8,也就是¥19.47每小时,但是算上多卡的费用,这实际上比上面aws的价格更贵。当然,你也许能用更便宜的价格拿到机器,比如别找这么大的云服务平台,找个小的,但是再少还能少多少,算打5折,这都是50多万美刀,350多万人民币一个月。要知道,这可是训练一次的价格哦。一个能用的模型背后,可是5x,甚至10x更多的不能用模型哦,所以烧个几千万,真跟玩一样。

正是因为这么贵,所以也同样表明了,为什么一定要找有经验的训模师 —— 你要知道,你自己的每个实验决定,都是变相的花出去十几,几十甚至上百万的美金。早发现问题,早停下来;早解决问题,早开始;知道怎么偷懒,什么样的ablation study可以跳什么必须做,什么时候可以用小模型替代,什么时候可以用一个老的checkpoint来个jump start,什么时候直接白嫖论文上的结论就行……,所有这些都和花多少钱才能把这个事情办了,输出一个达标的模型,直接相关 。相反的,万一你要找个拉垮的训模师,前面不知道怎么计划,代码不知道怎么验证,训练起来了不懂怎么有效监控,有了异常不知道如何排除,……,最后都要靠着模型训练全完了之后做evaluation才知道行不行的那种。那么就算预算全花完了,什么都没有训练出来,我也没有什么好奇怪的。

铺垫这么多,终于可以来谈谈最后一个层面 —— 人情世故了。你看,千卡训练这个事情,有这么大的风险翻车,要花这么多的预算,那么现在问题来了,你要是部门领导,你让谁来干这个事情?哦,你想放权给下面的经理,让他来找人?又或者找个刚来的博士?找个顶校+顶会的博士?不管你怎么找,可问题是,你就这么信得过他吗?你怎么保证他,能干这个,能干好这个,不会中途跑路,不会磨洋工…… 要知道,这样大的项目和预算,如果要真干塌了,不说整个部门要一起完蛋,至少这一条线的人员必然是要担责的,哪怕是主要领导也跑不掉。所以喽,关键的关键是,你必须找自己信的过的人,还要找确实有能力可以担当重任的人 —— 真正最后来干这个千卡训练的人,不但自己技术要过硬,更是团队的中坚力量,至少也要得到一两个大头目的支持,而且还要得到小头目支持。你再牛逼,没信任没大佬支持,这事情不说完全不可能,也是基本没可能。你再牛逼,要是真的小头目给你上眼药,比如,跟上面吹风,“好像看见你在看招聘网站”,你想大头目心里会不会有阴影?所以,别给我扯什么,老子有多少顶会顶刊,老子导师是谁谁谁,这在绝大多数情况,都不好使。所以,刚毕业的,或者做实习的,或者刚工作的,如果宣称自己有这个经验,就是一眼丁真。因为上面是绝对不会找不信任的人来这样重要的工作,这跟你有没有相关的工作经验无关。这同样意味着,真正干这些事情的人也很难流出来 —— 因为对于嫡系来说,加薪升职,在干好了的前提下,那还不都是so easy吗?所以,是你,你愿意出来吗?出来了,就算你牛逼,但是获取信任,成为嫡系也要一个时间,不是吗?

Qwen2-Audio:让LLM 拥有“耳朵”

Qwen2-Audio-7B 🤖 🤗  | Qwen-Audio-7B-Instruct 🤖 🤗  | Demo 🤖 | 🤗 

论文链接https://arxiv.org/abs/2407.10759

代码链接github.com/QwenLM/Qwen2-Audio

Qwen2-Audio作为一个大规模音频语言模型,Qwen2-Audio能够接受各种音频信号输入,并根据语音指令执行音频分析或直接响应文本。我们引入两种不同的音频交互模式:

  • 语音聊天:用户可以自由地与Qwen 2-Audio进行语音交互,无需文字输入;
  • 音频分析:用户可以在交互过程中提供音频和文本指令进行分析;
  • 多语言支持:该模型支持超过8种语言和方言,例如:中文、英语、粤语、法语、意大利语、西班牙语、德语和日语。

Qwen 2-Audio是一个大规模的音频语言模型,它能够接受各种音频信号输入,并对语音指令进行音频分析或直接的文本响应。与复杂的分层标签相比,我们通过利用不同数据和任务的自然语言提示简化了预训练过程,并进一步扩大了数据量。我们提升了Qwen 2-Audio的语音追踪能力,并实现了语音聊天和音频分析两种不同的音频交互模式。在语音聊天模式下,用户可以自由地与Qwen 2-Audio进行语音交互,无需文字输入。在音频分析模式下,用户可以在交互过程中提供音频和文本指令进行分析。请注意,我们不使用任何系统提示来在语音聊天和音频分析模式之间切换。 Qwen 2-Audio能够智能地理解音频中的内容,并按照语音命令做出适当的响应。例如,在同时包含声音、多说话者对话和语音命令的音频片段中,Qwen 2-Audio可以直接理解命令并提供对音频的解释和响应。

Qwen2-Audio、Qwen-Audio 以及之前 LALM 顶级产品的性能,例如 SpeechT5 、SpeechNet、 SpeechLLaMA、SALMONN、Whisper、Pengi,和 SpeechVerse。 我们展示了 10 个数据集的测试集结果,涵盖自动语音识别 (ASR)、语音到文本翻译 (S2TT)、语音情绪识别 (SER)、声音分类 (VSC) 和指令跟踪基准。 ASR 数据集(例如 Librispeech 和 Aishell2)的结果参考 1 – WER%。 CoVoST2的结果是七个翻译方向(en-de、de-en、en-zh、zh-en、es-en、fr-en和it-en)的平均BLEU得分。 AIR-Bench 聊天基准测试的结果包含四个维度:语音、声音、音乐和混合。 每个维度的分数由 GPT-4 自动评估,值范围为 0 到 10。 Qwen2-Audio 无需任何针对特定任务的微调即可实现卓越的性能,超越了同类产品。
图2:Qwen2-Audio的三阶段训练过程概述。

介绍

音频是人类和其他生物之间互动和交流的重要媒介,承载着丰富的信息内容。 全面理解各种形式的音频信号对于实现通用人工智能 (AGI) 至关重要。Qwen2-Audio主要重点是增强其指令跟踪能力。 Qwen2-Audio 是一种大型音频语言模型 (LALM),旨在处理音频和文本输入以生成文本输出。 与之前的模型相比,Qwen2-Audio 显着扩展了训练数据集。 为了减少训练前和训练后阶段之间的差距,我们通过直接使用自然语言提示各种数据和任务来简化预训练过程,如下图所示。 遵循大语言模型(OpenAI,2023;Qwen,2023)的实践,我们进一步进行指令调优和直接偏好优化,使模型的输出与人类偏好保持一致。

Qwen2-Audio 以两种不同的模式运行:音频分析语音聊天。 这两种模式从功能上有所区别,但用户在使用过程中无需区分。 在音频分析模式下,用户可以利用Qwen2-Audio来分析多种音频类型,包括语音、声音、音乐或各种混合音频形式。 命令可以通过音频或文本发出,Qwen2-Audio 将自动识别音频中的命令片段。 相反,在语音聊天模式下,用户可以与 Qwen2-Audio 进行交互,就好像它是一个会话代理一样,进行不受限制的对话。 提供音频交互,用户可以随时切换到文本交互。 例如,如果用户输入一个音频剪辑,其中初始部分是键盘打字的声音,然后用户询问“这是什么声音?”在口语中,Qwen2-Audio 预计会直接回复“这是键盘的声音”。

方法

模型架构

Qwen2-Audio的训练过程如图2所示,其中包含音频编码器和大语言模型。 给定配对数据(𝒂,𝒙),其中𝒂和𝒙表示音频序列和文本序列,训练目标是最大化下一个文本词符的概率为:

以音频表示和先前文本序列 𝒙<t 为条件,其中 θ 和 ϕ 分别表示大语言模型和音频编码器的可训练参数。

与Qwen-Audio不同的是,Qwen2-Audio的音频编码器的初始化是基于Whisper-large-v3模型。 为了预处理音频数据,我们将其重新采样到 16kHz 的频率,并使用 25ms 的窗口大小和 10ms 的跳跃大小将原始波形转换为 128 通道梅尔频谱图。 此外,还合并了步长为 2 的池化层,以减少音频表示的长度。 因此,编码器输出的每一帧大约对应于原始音频信号的 40ms 片段。 Qwen2-Audio 仍然采用大型语言模型 Qwen-7B 作为其基础组件。 Qwen2-Audio的总参数为8.2B参数。

预训练数据集的统计(小时)。

预训练

在预训练阶段,我们用自然语言提示替换分层标签。 如图2所示。 我们发现使用语言提示可以提高更好的泛化能力和更好的指令跟随能力。

有监督微调

Qwen2-Audio的彻底预训练使模型对音频内容有了全面的理解。 在此基础上,我们采用基于指令的微调技术来提高模型与人类意图保持一致的能力,从而形成交互式聊天模型。 我们的初步研究强调了 SFT 数据的质量和复杂性对模型性能的关键影响。 因此,收集了一组精心策划的高质量 SFT 数据,并实施了严格的质量控制程序。

我们考虑两种不同的人类互动模式:

  • 音频分析:在音频分析模式下,用户可以灵活地让 Qwen2-Audio 分析各种音频。 用户指令可以通过音频或文本给出。该模式常用于音频文件的离线分析。
  • 语音聊天:在语音聊天模式下,鼓励用户与Qwen2-Audio进行语音对话,提出各种问题。 请随意将其视为您的语音聊天助手。该模式常用于与 LALM 的在线交互。

为了一致性和模型统一性,两种交互模式都经过联合训练,用户在使用过程中不会出现模式差异化,也无需使用单独的系统提示在不同模式之间切换。 两种模式在实际使用中是无缝结合的。

直接偏好优化(DPO)

我们采用 DPO (Rafailov 等人, 2024) 来进一步优化模型以遵循人类偏好。 通过获取带有三元组数据(𝒙,𝒚𝒘,𝒚𝒍)的数据集𝒟,其中𝒙是带有输入音频的输入序列,𝒚𝒘和𝒚𝒍 分别是人工注释的好响应和坏响应,我们对模型 𝒫θ 进行如下优化:

其中𝒫ref表示用𝒫θ初始化的参考模型,σ表示sigmoid函数,β是超参数。 图2说明了Qwen2-Audio的三阶段训练过程。

实验

在实践中,我们发现之前的许多测试数据集都非常有限,无法充分反映现实场景中的性能,例如一些SLU(口语理解)和SER(语音情感识别)数据集。 因此,我们主要直接在AIR-Bench上评估性能。 我们发现 AIR-Bench 的分数更符合实际的用户交互体验。 同时,为了评估Qwen2-Audio的通用理解能力,如表1所示,我们仍然进行了涵盖各种任务的综合评估,即自动语音识别(ASR)、语音识别-文本翻译(S2TT)、语音情感识别(SER)、语音分类(VSC)。 评估是在 13 个数据集上进行的。 评估数据集被严格排除在训练数据之外,以避免数据泄露。 我们比较的模型包括开源模型和可调用的 API,例如 Gemini。

表2:自动语音识别 (ASR)、语音到文本翻译 (S2TT)、语音情绪识别 (SER)、声音分类 (VSC) 和 AIR-Bench 聊天基准测试的结果。 请注意,对于 Qwen2-Audio,Fleurs 的结果是零样本,而 Common Voice 的结果不是零样本。

案例:

结论:

在本文中,我们提出了 Qwen2-Audio,它建立在 Qwen-Audio 分析各种类型音频的能力之上,同时还被赋予了语音交互能力。 在预训练阶段,我们针对不同的数据和任务利用自然语言提示,进一步扩大了数据量。 在SFT阶段,我们通过提高SFT数据的数量、质量和复杂性来增强Qwen2-Audio与人类交互的一致性,从而实现无缝的语音和文本交互。 此外,我们还通过 DPO 阶段提高了 Qwen2-Audio 的响应质量。 在不同基准上测试的客观指标证明了 Qwen2-Audio 在音频理解和对话能力方面的熟练程度。 论文中的案例也说明了Qwen2-Audio流畅灵活的语音交互能力。

补充:语音/文本嵌入融合

Qwen-audio-chat模型如何将音频特征与文本提示无缝融合,通过特征编码、位置标记和信息整合,提升模型的跨模态理解能力。

系统会提取音频的特征,然后对文本提示进行嵌入(Embedding)处理。具体来说,它通过将音频特征转换成一个三维向量(如[1,56,4096]),并将这个向量嵌入到文本提示中。例如,考虑到一个文本提示信息,其中包括标记转换为ID的过程,随后是与音频特征的结合,即在文本中通过和标签指明音频的开始与结束位置。

在融合过程中,系统通过ID定位到这些标签所代表的位置,并用音频特征向量A替换掉文本提示中的“Audio_path/audio_name.flac”相对应的向量表示。这样,音频特征就被有效地融合到文本提示中,形成了一个语言模型能够理解的向量表示。

 // A code block
     <|im_start|>system
    You are a helpful assistant.<|im_end|>
    <|im_start|>user
    Audio 1:<audio>Audio_path/audio_name.flac</audio>
    what does the person say?<|im_end|>
    <|im_start|>assistant

代码实现:

// An highlighted block
bos_pos = torch.where(input_ids == self.config.audio['audio_start_id'])
eos_pos = torch.where(input_ids == self.config.audio['audio_start_id'] + 1)
audio_pos = torch.stack((bos_pos[0], bos_pos[1], eos_pos[1]), dim=1)
if audios is not None:
	for idx, (i, a, b) in enumerate(audio_pos):
	     hidden_states[i][a : b+1] = audios[idx]
	output_shape = input_shape + (hidden_states.size(-1),)