☰
Jukebox模型深度解析:VQ-VAE与稀疏注意力实现歌词生成歌曲
2026/9/30 1:51:39 网站建设 项目流程

1. 这篇论文到底在解决什么问题

翻这篇论文的时候,我的第一反应是:音乐生成这个方向,在 Jukebox 之前其实已经被 NLP 领域的进展“吊打”很久了。图像那边有 GAN、VAE 玩得风生水起,文本那边 GPT 系列一路高歌,唯独音频,尤其是带人声、带编曲的完整音乐,始终卡在“生成容易、生成得有意义很难”这个坎上。Jukebox 是 OpenAI 在 2020 年放出来的一个生成式音乐模型,标题全称是Jukebox: A Generative Model for Music,它做的事情简单说就是:给定艺术家、风格和一段歌词,模型能直接输出一整首可以听的歌,包含人声、乐器、旋律,甚至是混音后的成品。

这个工作最戳我的地方,是它把音乐生成拉回到了“压缩 + 自回归”这套已经被文本验证过的范式上。论文里反复强调的一个观点是:音频不是不能用自回归模型,而是直接对原始波形做自回归太贵了,所以要先找到一个好的“压缩表示”,再在这个表示上做生成。这个思路听起来直白,但真正把方案落地到“能生成 4 分钟以上完整歌曲”的级别,Jukebox 是第一个。它的价值不只是“多了一个能唱歌的模型”,而是给后来的 AudioLM、MusicLM、Stable Audio 这些工作铺了一条路。

这篇论文适合谁读?我觉得三类人最值得花时间:

  • 做生成模型的人,尤其是关注自回归范式如何处理高维连续信号的人;
  • 做音乐 AI 或音频理解的人,想搞清楚“音频的离散表示到底怎么设计”;
  • 以及所有好奇“GPT 那套东西能不能用来做音乐”的人。

我自己读完最大的感受是:Jukebox 不是一个“开箱即用”的工具,它更像一份实验报告,告诉你把语言模型里的 trick 搬到音频上,哪些管用、哪些失效、哪些需要额外设计。这篇文章我会把模型架构、关键技术选择、我复现和阅读时踩过的坑,以及它对后续工作的影响,全部摊开来说。

2. 三个核心组件:VQ-VAE、Sparse Transformer 和歌词条件注入

Jukebox 的整体架构可以拆成三个大块:先是一个多尺度的 VQ-VAE,把原始音频压成离散 token;然后是一个 Sparse Transformer,负责在 token 空间里做自回归生成;最后是一套条件注入机制,把歌手、风格、歌词这些信息喂给模型。这三个组件缺一不可,分开看每个都不算全新,但合在一起就形成了 Jukebox 的竞争力。

2.1 VQ-VAE 怎么把音频“翻译”成 token

音频的问题在于它太“密”了。一张 256x256 的图片,像素点也就六万多个,而一段 4 分钟的 CD 音质歌曲,44.1kHz 采样率下是超过一千万个采样点。直接在这上面做自回归,哪怕用再大的模型,计算量也是天文数字。所以 Jukebox 的第一步,是先用 VQ-VAE 把波形压成一个紧凑、离散的表示。

VQ-VAE(Vector Quantized Variational Autoencoder)的思路说起来不复杂:编码器把连续的音频帧映射到一个离散的 codebook(码本)里的某个向量索引,解码器再根据这些索引把音频“还原”出来。这样一段音频就变成了一串整数序列,和文本 token 的性质是一样的,之后就可以交给 Transformer 去建模。

Jukebox 在这里做了一个很关键的设计:它没有用单一级别的 VQ-VAE,而是用了多尺度的 VQ-VAE。具体来说,论文用了两种分辨率:一种是 32 倍下采样,适合建模低频结构,比如和声、节拍;另一种是 128 倍下采样,适合建模高频细节,比如音色、人声的细微起伏。这两个级别的 latent 是同时被建模的,生成的时候先从粗粒度开始,再逐步细化到细粒度。这个设计的动机非常直接:音乐是有层次结构的,旋律和鼓点的变化频率差异很大,用单一尺度要么丢掉细节,要么让模型去管太多细枝末节导致顾不过来。

2.2 codebook 大小和压缩率的选择逻辑

论文里对 VQ-VAE 的配置写得比较清楚,但有几个参数我觉得值得细说。比如 codebook 的大小,论文里用的尺寸是 8192 和 2048,前者对应粗粒度级别,后者对应细粒度级别。这个数字不是拍脑袋定的,codebook 太小,每个 token 能表达的信息有限,模型就需要更长的序列才能覆盖整首歌,计算成本反而上去;codebook 太大,则会让 VQ-VAE 的训练变得不稳定,因为梯度在大量离散候选之间分配,容易导致很多 codeword 闲置不更新。

压缩率的选择也一样。32 倍和 128 倍这两个数字,放在 44.1kHz 下意味着每秒音频分别对应大约 1378 个和 344 个 token。即便用了较高的压缩率,一段 4 分钟的歌曲在粗粒度级别仍然有大约 8 万个 token,这个序列长度对于 Transformer 来说依然是不小的压力。我一开始读到这个数字的时候有点意外:不是已经压缩了吗,怎么序列还是这么长?后来想明白了,音乐本身的信息量就在那里,不可能压得太狠,否则可听性会崩。Jukebox 能在这么长的序列上稳定训练和采样,靠的是下一节要讲的 Sparse Transformer。

2.3 稀疏注意力:Jukebox 的算力救星

如果直接用标准的 self-attention,Jukebox 根本跑不起来。原因很简单:8 万个 token 的全连接注意力矩阵,规模是 8 万乘 8 万,就是 64 亿个元素,单层就这么大,乘以几十层,显存直接就爆了。Jukebox 用的是 Sparse Transformer 里的两种稀疏注意力模式:行注意力(row attention)和列注意力(column attention)。

这两种模式的设计思路是把注意力计算从“每个位置要看所有位置”改成“每个位置只看一小部分但设计合理的位置”。具体到 Jukebox 里,它综合了多种稀疏模式:有局部的滑动窗口注意力,让每个 token 只关注附近一定范围内的 token,用来捕捉旋律的局部连续性和乐句的平滑过渡;也有跨序列的全局注意力,让某些特定位置可以访问整个序列的信息,确保全局结构不会丢。同时,Jukebox 还利用了音乐的多尺度结构:在多个不同分辨率的 latent 序列上联合计算注意力,允许模型在同一层内同时处理粗粒度的整体结构和细粒度的音色细节。我最早看 Sparse Transformer 论文的时候觉得这有点为了稀疏而稀疏,但在 Jukebox 这个场景里,它确实是唯一可行的路。

这里我补充一个读论文时容易忽略的点:稀疏注意力模式的选择不是随意的,它隐含了模型对数据结构的先验假设。比如局部窗口注意力假设相邻 token 之间的依赖是最紧密的,这在音乐里基本成立,因为音符之间的过渡是平滑的;而全局注意力则负责把“这首歌的主题是不是在副歌里重现了”这类跨时间距离的信息引进来。Jukebox 的这两个假设,和音乐本身的特性是对齐的。

2.4 歌词和条件信息是怎么“喂”进去的

Jukebox 一个很吸引人的能力是给定歌词生成歌曲。这在技术上并不简单,因为歌词和音乐的对齐关系非常松散。同一句歌词可能在一首歌里唱 5 秒,在另一首歌里拖 10 秒;有些地方是纯间奏,歌词根本不出现。Jukebox 的处理方法是用一个文本编码器把歌词编码成向量序列,然后通过 attention 机制让音频侧在生成时能“看到”歌词信息,但不是逐字强对齐,而是让模型自己学会什么时候该参考哪段歌词。这个设计很聪明,它没有去强行做强制对齐,而是把对齐的问题也交给模型去隐式学习。

除了歌词,歌手和风格这些条件信息是通过 embedding 向量注入的。每个艺术家有一个可学习的 embedding,每种风格也类似。论文实验了 20 个左右的艺术家和若干风格,模型在生成时可以根据这些 embedding 决定输出的大致走向:比如你给了 Frank Sinatra 的 embedding,生成的歌声就会更偏向爵士和复古的滤镜感;给了 Katy Perry 的 embedding,编曲就会更流行、更有节奏感。

这里我个人的一个体会是:Jukebox 对条件信息的利用并不像现在的扩散模型那样精细,它的本质还是“把条件作为前缀拼在序列里”这种很粗的方式。但即便如此,实验已经证明模型能够学习到 singer 的声线差异,说明自回归模型的条件注入机制虽然简单,效果却足够可靠。后来的很多工作其实还在沿用这套做法。

3. 训练方法和两个阶段的生成流程

方法论讲完,最想聊的是 Jukebox 怎么训练,以及它采样的时候是怎么把 8 万个 token 变成一首能听的歌的。这一部分我读了一些原始论文和后来社区复盘的技术博客,把流程重新梳理了一遍,这里做一个比较完整的总结。

3.1 第一步:训练 VQ-VAE 重建音频

Jukebox 的训练是分阶段的,不是端到端一起训。第一阶段只训 VQ-VAE:输入原始音频,输出重建后的音频,中间把音频编码成离散 token 再解码回来。训练的损失函数包括重建损失、codebook 的 commitment loss,以及一个小比例的 adversarial loss 和 perceptual loss——后者主要用来提升重建音频的主观听感,避免重建结果听起来像“被强压过的 MP3”。

这个阶段训练完成之后,VQ-VAE 的编码器就变成了一个“音频转 token”的工具,解码器是“token 转音频”的工具。它们的参数在第二阶段会被冻结住,不再参与更新。这样做的原因和迁移学习一样:把表示学习的问题和序列建模的问题解耦。如果两端同时训,模型的收敛会极其困难,因为两条梯度路径会互相干扰。

3.2 第二步:在 token 空间上训练先验模型

第二阶段的任务是训练 Sparse Transformer,让它学会 token 序列的分布。输入是 VQ-VAE 编码器产出的离散 token 序列,输出是下一个 token 的概率分布。这一步和训练 GPT 几乎没有区别,唯一的不同是输入是超长序列,所以用上了稀疏注意力和分层的建模方式。

分层的生成是 Jukebox 最有特色的地方。它训练了一个先验模型来自回归地生成粗粒度 token,然后另一个先验模型在粗粒度 token 的条件下生成细粒度 token。你可以把这两个 token 级别理解成:先决定“整首歌的结构框架”,比如主歌、副歌、间奏怎么排,再进行局部的细修,比如某个和弦的具体音色和人声的细节质感。这种两级 pipeline 的方式,从设计上规避了“一刀切分辨率”的尴尬。

在训练细粒度模型时,Jukebox 还做了个很有意思的 trick:它不是只输入粗粒度 token 当作条件,而是会随机遮挡一部分细粒度 token,强迫模型学会“在信息不完整时也能做预测”。这个思路我在读的时候觉得特别眼熟——这不就是 BERT 的 mask 思想用在自回归上吗。实践证明这种带噪训练让细粒度模型在采样时稳定了很多,因为它不再完全依赖前面的 token 一直对到结尾,而是可以容忍生成过程中的一些意外偏差。

3.3 采样阶段:从粗到细,最后合成波形

生成一首歌的过程可以粗略分成三步:

  1. 给定条件(歌手、风格、歌词),先用先验模型生成粗粒度 token 序列;
  2. 把粗粒度 token 作为条件,再用细粒度模型生成细粒度 token 序列;
  3. 把两个层级的 token 拼起来,交给 VQ-VAE 解码器,得到最终的原始波形。

这中间每一步的采样都有讲究。粗粒度 token 的采样直接决定了整首歌的走向,如果粗粒度崩了,后面再怎么细化都是白费。所以论文里在采样时使用了 top-k 采样和 temperature 控制,让输出在“多样性”和“稳定性”之间取一个平衡。细粒度阶段则相对“机械”一些,因为它的任务是补全细节而不是做创造性的决定,这时候 temperature 要调低,否则会产生大量听起来很毛糙的噪声。

实际跑过采样的人可能会有这种体验:temperature 稍微调高一点,人声就会开始“漂”,像是喝多了的人在唱歌;稍微调低一点,虽然稳定但会变得很无聊,所有的歌都像是同一个模板套出来的。Jukebox 论文给出的经验是,粗粒度阶段 temperature 控制在 0.98 附近,细粒度阶段可以更低一些。这个数值仅供参考,根据数据集和先验模型的拟合程度,最优点会浮动。

3.4 数据准备:音乐生成项目的隐形重活

Jukebox 论文里提到它用了大约 120 万首歌曲来训练,而且是从网络上抓取的原始音频和对应的歌词。这部分工作量其实被严重低估了,我甚至觉得它占了整个项目的一半以上。

首先,原始音频的格式千奇百怪,采样率不统一、时长差异大、响度不一致,必须全部做标准化预处理,否则即使是最简单的模型也学不到一致的模式。其次,很多歌的音频和歌词是对不上的,有的歌词缺句、有的一首歌被分成了好几个文件,清洗起来需要大量的脚本和人工校验。论文里提到用了一个自动对齐的流程,但它也只负责粗对齐,真正的质量控制还是靠数据规模和训练的鲁棒性去兜底。

我自己在做类似项目的时候有一个很深的感受:音频 AI 项目的数据管线,远比模型结构更消耗时间。Jukebox 之所以能成功,不光是模型设计得好,更因为它在数据层面砸了足够多的资源。这一点在论文里是轻描淡写的,但我劝所有想复现或者借鉴 Jukebox 的人,把时间预算的一半留给数据处理。

4. 实操复现与踩坑细节:那些论文没写明白的地方

Jukebox 的官方代码是开源了的,虽然它的训练代码因为依赖太重(用了 TPU、特定的环境库版本)几乎没办法在普通的 GPU 机器上完整跑起来,但推理和采样部分是可以折腾通的。下面是我实际跑代码、看 issue、翻社区讨论时积累下来的一些经验,可能比论文本身更有参考价值。

4.1 环境配置的隐性要求

Jukebox 代码仓库对环境的约束非常严格,尤其是涉及到 CUDA、PyTorch 和 mpi4py 的版本匹配。我一开始试图用最新的 PyTorch 版本去跑,结果在一堆依赖报错里浪费了整整一个周末。后来发现,老老实实按照 requirements.txt 里锁的版本来配置环境,反而是一路最顺畅的方案。

有一个点特别值得提醒,就是 Jukebox 的训练代码是依赖 mpi4py 做多机多卡通信的。如果你只是想用单卡跑一下推理,可以跳过 mpi4py 的配置,但直接 import jukebox 的时候它会检查这个依赖,所以最简单的办法是把它一并装上,哪怕不真的用它。

另一个常见问题是,模型的权重文件是放在 S3 上的,官方脚本会自动下载,但国内网络访问 S3 有时候不稳定。社区里已经有人把权重转存到了其他网盘,或者在 Hugging Face 上重新打包过,可以直接去搜“jukebox weights”。

4.2 VQ-VAE 可视化:先看压缩效果再碰生成

我强烈建议第一次上手的朋友,先不要急着生成歌曲,而是先拿几段音频跑一下 VQ-VAE 的编解码流程,对比一下原始音频和重建音频的差别。这个过程能让你直观地感受到压缩带来的信息损失,大致知道 model 能保留什么、丢了什么。

我自己试过的结果是:重建后的音频和原始音频相比,低频部分保留得相当好,鼓点、贝斯这些都很扎实,但高频的一些泛音会有“模糊化”的感觉,像是罩了一层纱。尤其是镲片的声音,原来的清脆感会打一些折扣。这个现象其实是 VQ-VAE 训练中比较典型的“高频信息瓶颈”,codebook 的容量有限时,模型优先保住感知上更重要的中低频。

如果想要改善高频重建质量,可以尝试在 VQ-VAE 的训练损失里加大 adversarial loss 的权重,或者提高细粒度 codebook 的大小。但注意,这个改动会连锁影响后面先验模型的训练成本,如果不是特别在意音质细节,不建议一上来就动。

4.3 条件嵌入的维度选择

论文里对歌词、歌手、风格的 embedding 维度其实没有给得很细,只是模糊地说“each is embedded into a vector”。我翻了源码之后才确认,歌词是通过一个预训练的 BERT 模型编码成 768 维的向量,然后经过一个线性层映射到模型的 hidden size。

这里有一个需要注意的点:歌词编码器是单独预训练的,它和音频模型之间是“冷连接”。也就是说,音频侧模型只能通过 attention 去参考歌词向量,但无法反过来影响歌词向量的生成。这带来的后果是,如果歌词语义和音乐风格有冲突(比如一段悲伤的歌词配上了一个欢快的编曲),模型只会机械地把两个信息拼在一起,很难做深度的情感调和。

我不建议在入门阶段去改歌词编码这部分的结构,因为冻结预训练模型的 weight 能节省大量训练资源,而重新端到端训练歌词编码器的成本,几乎等于把整个项目重新跑一遍。这种高投入低回报的事情,除非有明确的业务需求,否则踩一次就够了。

4.4 采样时的加速手段

Jukebox 的官方采样过程非常慢。在单张 V100 上生成一首 4 分钟的歌曲,需要大约 2 到 3 个小时。这个速度在实际项目中是完全不可用的,所以社区里有一些加速的手段,简单整理如下:

第一,降低采样率。Jukebox 支持在采样时指定较低的采样率(比如 22.05kHz 甚至 11.025kHz),这样 VQ-VAE 解码器要处理的帧数会大幅减少,速度提升非常明显。代价是输出音频会缺失一部分高频信息,听起来更“闷”。

第二,采样长度裁剪。如果做实验只是为了验证条件控制的效果(比如对比不同歌手的 embedding 带来的差异),没必要生成整首歌。把时长限制在 20 到 30 秒,足以听到明显的人声风格差异,但耗时可以从小时级降到分钟级。

第三,使用半精度。把模型权重和计算切到 FP16,可以在不损失太多音质的前提下获得大约 30% 到 40% 的速度提升。需要注意的是,BN 和某些层在 FP16 下会有数值稳定性的问题,但 Jukebox 整体是卷积和 attention 为主,实测下来问题不大。

这些加速手段不是为了走捷径,而是为了“能跑起来做实验”。毕竟如果一次采样要等三个小时,你根本没法快速迭代验证自己的思路,AI 项目最怕的就是这个。

5. Jukebox 的已知短板和遗留问题

任何一篇有分量的论文都会包含对自身局限性的讨论,Jukebox 也不例外。搞清楚它哪里做不好,比知道它哪里做得好看得更透彻。

5.1 音乐连贯性:局部好,全局弱

Jukebox 生成的结果在“局部乐句”上是挺像样的,但整体结构经常出问题。比如它可能在一首歌的前 30 秒重复了 8 遍同样的副歌旋律,或者歌曲进行到一半突然风格突变,像是 MIDI 文件被随机切碎了再接起来。

这个问题的根源,本质上是自回归模型的“短视”——每个 token 的生成只看到前面的内容,但序列太长之后,靠 attention 很难把 8 万个 token 之前的全局信息有效地引到当前生成位置。局部窗口注意力的设计更是加重了这种短视,局部是稳了,全局却飘了。

后来的一些工作比如 MusicLM 用扩散模型替代了自回归,很大程度就是为了解决这个长程结构问题。扩散模型在生成时可以对整首歌同步进行去噪,天然更容易保持结构一致性。

5.2 歌词生成的质量参差不齐

Jukebox 的歌词和旋律对齐做得一般,尤其是在歌曲的后半段,经常出现“歌词已经唱完了,旋律还在继续”的情况。更常见的问题是发音质量不稳定,有些单词会被唱得含混不清,甚至被吞掉。

我见过一个最典型的失败案例:用户在条件里输入了一首英文诗,Jukebox 生成的结果里,人声部分只在某些句子上能听出是在“说英语”,其他部分更像是无意义的音节串。这说明歌词编码器对模型的控制力是偏弱的,它更像是“氛围提示”而不是“逐字指令”。这和语言模型里可控文本生成遇到的问题本质是同一个——条件信息没有以足够强的形式注入。

5.3 训练成本过高,不适合中小企业复现

Jukebox 的训练使用了数百块 TPU,训练时长和资源消耗都是天量。论文里虽然没有明确公布总成本,但按同期的其他 OpenAI 项目来估算,单次完整训练的云资源费用应该在数十万美元量级。

这个成本决定了一件事:Jukebox 更多是“研究范式验证”而非“工程落地模板”。如果你想在资源有限的情况下做音乐生成,其实有更便宜的路径。比如直接在 token 级别用当前更流行的自回归模型(如基于 EnCodec token 的 AudioLM),或者使用 latent diffusion 架构,在 Relative 较低的资源下训练出可用的模型。

6. Jukebox 的后续影响和遗产

读一篇论文,最好带着“它在科学史上占什么位置”的视角去看。Jukebox 的影响并不在于它本身被大规模应用,而在于它证明了几件事,这几件事在它之后的很多模型里都能看到影子。

最直接的继承者是 Google 的 AudioLM。AudioLM 的框架是“学一个音频 tokenizer + 在 token 上学语言模型”,本质上就是 Jukebox 的 VQ-VAE + Sparse Transformer 路线。只不过 AudioLM 在 tokenizer 部分换了更先进的 SoundStream,在序列建模部分换成了更精简的 Transformer 变体。你可以说 AudioLM 是 Jukebox 的“现代化重制版”,它在语义和声学两个层级上建模音频,和 Jukebox 的两级 VQ-VAE 设计有异曲同工之处。

再往后是 MusicLM,它用 AudioLM 作为 backbone,加上了文本条件,实现了“用一句话描述就能生成一段音乐”。这个能力在 Jukebox 里已经有了雏形——Jukebox 已经支持用歌词文本做条件,只是它的文本输入必须得是歌词,而且是逐句对应的,整体还是“填词谱曲”的逻辑,做不到 MusicLM 那种抽象的语义理解。但整个条件生成的设计思路,一脉相承。

还有一条线是 Stable Audio 和 AudioLDM 这类扩散模型。它们没有直接使用 Jukebox 的自回归框架,但都沿用了“先压缩音频到潜在空间,再在潜在空间上生成”的想法,这正是 Jukebox 最核心的贡献。VQ-VAE 变成了更顺滑的 autoencoder,扩散模型替代了自回归 Transformer,但分层压缩的想法没有变。

Jukebox 在音乐生成史上的位置,有点像 GPT-2 在文本生成史上的位置:它不够完美、不够高效,但它让后来的人看到了这条路是可行的,并且技术上的核心障碍都在“可解决”的范围内。这种“范式证明”的作用,有时比实际的模型效果更有价值。

7. 最后一个建议:如果你要读这篇论文,重点关注什么

我建议在读 Jukebox 论文时,不要花太多时间纠结在模型效果的好坏上,更值得关注的是三个“设计决策”的推理过程:

第一,为什么用 VQ-VAE 而不是连续的 autoencoder?因为这个决策直接决定了后面所有 token 化建模的可行性,理解了它,你再去读 AudioLM 的 SoundStream 就没有任何障碍了。

第二,为什么用两级分辨率而不是单级?这是对音乐信号本质的洞察——音乐是分层的。这种对信号结构的判断,是数据建模中最重要也最稀缺的能力。

第三,为什么条件注入要用 attention 而不是拼在输入里?这个选择意味着模型需要学习“什么时候听条件、什么时候不听”,是一种更灵活的约束方式。后来的很多多模态生成模型都沿用了这种设计。

读论文不只是为了知道“别人做了什么”,更是为了理解“别人为什么这么做”。Jukebox 作为一个把语言模型方法成功迁移到音乐领域的标杆工作,它的推理过程和实验细节,对任何做生成模型的人来说都是很好的思维训练材料。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询