1. 从“能听”到“能写”:Jukebox到底做了什么
如果只说一句话来概括,Jukebox是OpenAI在2020年放出的一个直接以原始音频波形为目标的音乐生成模型,输入可以是艺术家、风格、歌词,输出是完整的、带人声的、44.1kHz采样率的歌曲片段。换句话说,它不只是生成几秒钟的音效或者一段MIDI旋律,而是真的“唱”出歌来。
在做音乐生成这个方向上,之前绝大多数工作都避开了原始音频。原因很简单:音频的采样率太高了,一秒44100个点,就算只处理几分钟的歌,序列长度也是百万级别,这直接撞上了自回归模型的计算瓶颈。所以几十年来,主流方案一直是符号音乐生成——先转成MIDI、乐谱或者钢琴卷帘,然后在符号空间里做生成。但符号空间有个致命缺陷:它丢掉了真实声音的全部信息。音色、混响、人声的质感、演唱的呼吸感、吉他的失真,这些统统没有。你做出来的东西可能旋律对、和声对,但听感像玩具。
Jukebox的路径完全不一样,它选择直接从原始音频学,而且在一个足够高分辨率的音频表征上工作。核心思路可以拆成三层:第一层,用VQ-VAE把连续的音频波形压缩成离散的code,把序列长度缩短到可控范围;第二层,在这个离散code序列上训练一个稀疏Transformer做自回归生成;第三层,用多个不同时间分辨率的VQ-VAE组合实现从低分辨率到高分辨率的粗到细生成,最终输出44.1kHz的完整歌曲。
这篇文章适合谁来读?我觉得两类人最应该看。一类是做音频生成的研究者或工程师,想了解“原始波形自回归生成”这条路到底怎么走通、瓶颈在哪、哪些设计是为了解决什么问题;另一类是做内容生成、多模态模型的开发者,哪怕不做音乐,Jukebox里关于层次化离散表征、稀疏注意力、条件控制的做法,放到图像、视频生成里也有很强的迁移价值。它不像如今的扩散模型那样随手可跑,但它把“生成一段长序列”这件事里最棘手的问题——计算量、时间一致性、条件控制——都暴露得清清楚楚,读完之后你会对后续的AudioLM、MusicLM这些工作理解得深得多。
我建议你在往下读之前,先找一首生成的样歌听一听。不用多,就听开头30秒。你会立刻明白什么叫“听起来像真的但有明显瑕疵”,也会立刻理解为什么大家说Jukebox是那个阶段最强但离实用最远的音乐生成方案。
2. 论文核心方案逐层拆解,每一步都是为了解决一个具体到不能再具体的问题
2.1 VQ-VAE——把音频从“连续长序列”变成“离散短序列”
直接对44.1kHz的原始音频做自回归生成是不现实的。我们算一笔账:假设你想生成一段5分钟的歌曲,采样率44.1kHz,那就是1323万个样本点。就算Transformer的显存和算力都能撑住,这也毫无工程意义,而且音频里相邻样本点之间的信息冗余非常高,用逐点预测的方式建模等于把大量计算浪费在本来就能猜到的内容上。
Jukebox的解决办法是用VQ-VAE做压缩。VQ-VAE全称是Vector Quantized Variational Autoencoder,一个关键点是它把连续的特征映射成离散的编码,而不是连续向量。它先通过编码器把音频波形压成低帧率的特征,然后在有限大小的码本里找到最接近的向量来替换,解码器再从这个离散向量序列重建出音频。
整个Jukebox体系里,VQ-VAE不止一个,而是三个,分别处理不同的时间分辨率:
- 编码器把44.1kHz原始音频压缩成帧率不同的离散code。三个模型的code帧率分别是8Hz、32Hz、128Hz,对应的压缩倍数分别是512倍、256倍、64倍(论文里不同阶段描述略有差异,核心思想是顶层表征帧率最低、压缩最狠,底层表征帧率最高、保留更多细节)。
- 最小的code序列长度决定了顶层模型的序列长度。以一首5分钟的歌曲为例,8Hz的code一共产出约2400个token,这在一个Transformer的可处理范围内,也是整个模型能“记住”全局结构的基础。
为什么用VQ-VAE而不是普通的自编码器?关键原因是自回归模型对连续值做预测太难。连续值的分布是无限可能的,模型每预测一步都要输出一个连续值,误差会逐级累积,而且你没法用交叉熵这类分类损失去优化。变成离散token之后,每一步预测变成了一个分类问题,类别数就是码本大小,优化稳定,生成质量更容易控制。
2.2 稀疏Transformer——用滑动窗口注意力把自回归扩展到长序列
有了离散code序列,下一步就是在上面训练一个自回归Transformer:给定前面的code,预测下一个code。但这里又冒出一个问题,Transformer的self-attention是平方复杂度,序列长度2400个token还好,12层网络能扛住,但如果要生成更长的歌曲,或者要在128Hz的高分辨率code序列上建模,长度会到几十万,平方复杂度就彻底完蛋。
Jukebox的解决方案是稀疏Transformer,确切地说是Sparse Sparse Attention的变体。论文里用了两种注意力模式的组合,一种是行注意力(row attention),每个位置只和自己所在行范围内的token交互;另一种是列注意力(column attention),每个位置只和自己所在列范围内的token交互。这两种模式叠加起来,既保证了每个token能感知到一定范围的局部上下文,又不会退化成纯粹的局部窗口模型。
如果你觉得这两个术语太抽象,可以换个方式理解:标准的Transformer注意力是每个人都能看到全局所有人,稀疏注意力相当于把二维的token矩阵铺开,每个人只和前后一定范围内的邻居说话,但通过“行列交替”的方式,信息仍然可以逐层传递到较远的位置。这有点像城市交通,不是每个人都有直达线路,但通过换乘站,你总能到目的地,只是路径更长。
在实际配置上,Jukebox的顶层模型用了72层Transformer,注意力头数、隐藏维度都是大模型级别的配置,在当时的算力条件下能训练起来,很大程度就是靠这个稀疏注意力结构把计算量压了下来。
2.3 三阶段上采样——从粗糙的全局结构到精细的音频细节
如果你只用单一VQ-VAE做一次性压缩,会陷入一个两难:code帧率太低,模型一个token对应好几秒的音频,能抓住歌曲整体结构,但重建出来的人声和乐器细节全糊掉了;code帧率太高,序列长度爆炸,自回归建模的计算开销和训练难度指数上升。
Jukebox的解法是把生成过程拆成三个阶段,分别在不同的时间分辨率上工作。顶层模型在8Hz的code上生成全局结构,输出的是一段长度很短的粗糙token序列,它对应歌曲整体的旋律走向、结构安排、风格基调。然后中层的上采样模型以顶层的输出为条件,在32Hz的分辨率上生成更精细的细节;最后底层的上采样模型再以中层的输出为条件,在128Hz或更高的分辨率上还原出接近原始音频的波形。
上采样模型本身也是自回归Transformer,但它和顶层模型有个重要区别:它不仅能看自己这一层的code历史,还能通过注意力机制读取上一层模型的输出作为条件。这个设计很像图像生成里的粗到细策略(coarse-to-fine),先规划轮廓再填充像素。音频生成里的具体好处是:低分辨率模型已经把歌曲的结构、和声走向定死了,高分辨率模型只需要在这个约束下补细节,所以即便底层模型的序列很长,它也不需要从零推理,只需要做“局部决定”,计算可控性大大提高。
2.4 条件控制——怎么让模型生成“特定艺术家风格”和“唱指定的词”
Jukebox真正让人眼前一亮的点在于它的条件控制能力。论文里用了三类条件信号。
第一类是艺术家(artist)条件。每个艺术家被表示成一个可学习的embedding向量,这个向量在模型的所有层中都会被注入。训练时给定歌曲的同时给出对应的艺术家标签,模型学会把艺术家的声音特征、编曲风格映射到embedding空间。到了推理阶段,你输入一个特定的艺术家embedding,模型就有很大概率生成与这位歌手的嗓音质感、风格调性相匹配的歌曲。
第二类是歌词(lyrics)条件。这个实现比较有意思,他们没有把歌词做成逐词对齐的输入,而是把一个完整的歌词字符串通过文本编码器映射成向量序列,然后在训练时通过网络自动学习歌词和音频之间的对齐关系。推理时模型会生成和歌词内容相关的发声——你输入包含某个单词的歌词,生成结果里可能在这个时间点附近出现对应的音节,但不会精确到逐字的对齐。这个粗暴但有效的方法,在生成效果上已经足够惊艳。
第三类是时间条件和时间结构。歌曲是有时间结构的——前奏、主歌、副歌、间奏、尾奏,不同段落之间的情绪和配器会有明显变化。Jukebox在模型输入中加入了歌曲内部的绝对时间位置信息(以某种周期性编码方式),让模型能感知当前生成到歌曲的哪个阶段,从而在不同段落呈现出对应的结构特征。这个设计虽然简单,但对维持长距离结构一致性有很大帮助。
3. 实操视角下的训练流程、推理机制与资源考量
3.1 从数据到训练:这活儿不是普通人能干的
Jukebox的训练数据集是经过授权的歌曲,数量级在百万级别。论文里提到数据经过了滤波、裁剪、匹配歌词等预处理。我需要坦白说一句:如果你真的打算自己从头训练一个Jukebox,哪怕只是复现缩小版,你也需要先想清楚几件事。
第一是数据量。百万首歌曲、每首4分钟以上、44.1kHz高保真格式,这个数据规模下来少说也是几个TB的存储。数据清洗的难度远超想象,你以为你下载的是干净的歌声文件,实际上可能混着纯音乐、没歌词、采样率不一致、左右声道信息混乱等一堆情况。
第二是算力。论文没有公开具体的训练算力消耗,但从模型规模(顶层72层Transformer)和序列长度来看,当时使用的应该是大规模GPU集群,训练周期以周甚至月为单位。我的建议是,除非你手上有足够的学术或工业资源支持,否则不要试图完整复现,而是应该用预训练权重做推理,或者缩小模型规模做教学实验。
第三是训练稳定性的问题。音频生成模型对比图像生成模型,收敛速度更慢,损失曲线更平,早期阶段你几乎听不出模型在变好。我见过不少朋友一开始兴致勃勃,跑了两周发现模型还在输出白噪声,心态直接崩了。实际上音频模型的“质变”往往出现在训练后期,你要有足够的耐心去等。
3.2 推理过程里的关键机制:采样、温度与歌词对齐
推理阶段,Jukebox的生成策略是自回归地逐token采样。顶层模型生成整首歌的8Hz粗code序列之后,中层和底层模型逐级上采样细化。采样策略用的是带温度参数的随机采样,温度越低,输出越保守稳定;温度越高,输出越有随机性和变化性。
实操里一个值得琢磨的细节是歌词的输入时机。Jukebox训练时歌词是在全曲范围内做整体对齐的,推理时也是一次性把所有歌词给进去。这样做的缺点是模型无法精准控制歌词在哪一秒出现,优点是实现简单、训练稳定。你给的歌词越长,生成结果和歌词的语义关联越松散;给的歌词短而精炼(比如几句副歌),对齐效果会明显更好。
另一个实操经验是条件输入的组合方式。你输入一个艺术家embedding加特定歌词,输出的风格可能摇摆不定——有时偏向艺术家的嗓音,有时偏向艺术家的编曲习惯。如果你希望控制更具体,可以尝试在多个候选采样里做筛选,或者在歌词里附带风格描述的词(比如“slow ballad about lost love”),模型的文本编码模块能捕捉到一部分语义信息。
3.3 资源评估与实际运行建议
说了这么多,直接跑一次Jukebox推理到底需要什么配置?我列一个参考:
| 配置项 | 最低要求 | 建议配置 | 说明 |
|---|---|---|---|
| GPU显存 | 16GB | 24GB以上 | 顶层模型推理时中间激活值占用很高 |
| 内存 | 32GB | 64GB | 加载多个VQ-VAE和Transformer权重需要大量RAM |
| 存储 | 30GB | 100GB | 预训练权重、缓存、输出文件加一起不小 |
| 推理时长 | — | 约10-20分钟/首 | 与显存带宽、采样长度、温度参数相关 |
如果你是第一次跑,强烈建议先用最短的生成长度(比如十几秒)跑通全流程,确认环境和依赖都没问题,再逐步加长。不要一上来就生成完整4分钟歌曲,中间一旦某个依赖库版本冲突或者显存溢出,报错排查的复杂度会把你劝退。
4. 实验效果评估与模型边界:强在哪,弱在哪里
4.1 从客观指标和主观听感两个维度看效果
论文在实验部分集中回答了一个问题:Jukebox生成的歌,到底多像真的?
客观指标上,他们用了几个维度来衡量生成质量和条件一致性,包括音频重建质量(VQ-VAE部分的重建误差)、生成样本的分类准确率(用预训练的分类器判断生成歌曲是否匹配输入的艺术家标签)、歌词内容的一致性(用语音识别工具转写生成歌曲的歌词,与输入文本对比)。
主观听感上,Jukebox生成的音乐在几种情况下表现特别突出:
- 结构完整的抒情歌曲。因为顶层模型能把握整体结构,生成出来的歌有前奏、有副歌、有段落过渡,这是很多短窗口生成模型做不到的。
- 风格粗粒度的模仿。你输入“猫王风格”,出来的歌确实带着那个年代的复古感和特定的嗓音韵味,虽然不够像到真人的程度,但风格指向很明确。
- 歌词大致的语义贴合。模型能学会把部分歌词里的重点词在对应时间点“唱”出来,尤其是一些重复出现的词句,效果很好。
但它的弱点也非常明显,你会经常听到这些令人出戏的瞬间:
- 乐器糊成一片。尤其在高频区,镲片、高音弦乐的声音经常有金属感和破碎感,这是层次化生成在细节还原上的天花板。
- 人声变形。高音区的嗓音经常出现不自然的颤音和电音感,偶尔还会出现类似“卡痰”的杂音,这是模型在声纹重构上的短板。
- 长时结构虽然存在,但内在逻辑弱。生成的歌曲有段落,但段落之间的情绪递进、和弦走向缺乏音乐意义上的必然性,更像“结构上像歌,内在逻辑不像歌”。
4.2 不同VQ-VAE层级的生成差异——这决定了你应从上采样还是顶层开始体验
实操里经常有人忽略的一个要点是:顶层模型的生成结果和底层模型的生成结果差异极大。看论文时如果只盯着最终生成的44.1kHz音频,很容易忽略中间层的输出其实也是可以用来做分析或者做研究的。
如果你用顶层模型的输出直接解码,得到的是非常粗糙的歌曲骨架,只有旋律走向和节奏轮廓,没有音色细节,也没有完整的泛音。这个输出的价值在于它反映了模型对歌曲全局结构的理解。你可以拿它来分析Jukebox的内置音乐知识——和声走势、段落切分、甚至风格偏好,这比直接听最终成品更有解剖意义。
中层和底层模型的作用则是把骨架填充成实际的声音。中间层的输出已经能听出音高和时长的相对关系,底层模型的输出则接近完整的音色和瞬态细节。我建议你在复现实验时,一定要把三个层级的输出都单独解码听一遍,这个过程会让你对“层次化生成”的理解远远超过只看论文文字。
4.3 局限性分析——从Jukebox到后续模型的演进线索
Jukebox最大的贡献,是证明了“原始音频直接生成”这条路虽然困难但并非不可能。它的局限性也几乎是后续所有工作的出发点:
- 推理速度太慢。一次完整推理需要几分钟,这还是在顺序执行三个模型的情况下。如果要做交互式创作或者大规模数据增强,这个速度完全不可用。后续的AudioLM和MusicLM通过非自回归或者更高效的架构来改善。
- 依赖算力太大。不仅是推理,训练更是天价。这导致模型很难在社区里被大规模复现和迭代。
- 生成质量的上限受限于VQ-VAE的重建质量。Jukebox的VQ-VAE重建已经足够好,但肯定不是无损,高频细节的损失直接限制了最终生成音频的真实感。
如果你把Jukebox和后来的AudioLM、MusicLM放在一起对比,会清晰地看到一条演进路径:Jukebox用离散token作为中间表征,AudioLM继承了离散token的思路但换成了语义特征加声学特征的组合,MusicLM则引入扩散模型做进一步细化,最后加上更强的文本理解能力。Jukebox是这条路上第一个把路探通的人,虽然还不够好,但方向对了。
5. 复现实验与踩坑记录——按我的经验,哪些坑你一定会遇到
5.1 环境配置:依赖兼容性问题能占全天坑的七成
Jukebox的官方代码基于PyTorch实现,实际用起来有一个永恒的痛苦:版本兼容性。
我建议你这样操作:创建一个独立的conda环境,Python版本锁死在3.8或3.9,PyTorch用1.7到1.10之间的版本,CUDA版本根据你的显卡驱动匹配。很多人一上来就装最新的PyTorch,结果某个底层库的接口对不上,报错信息又晦涩难懂,排查半小时起步。
还有一个容易被忽视的点是FFmpeg的安装。Jukebox处理音频需要用到FFmpeg做解码和重采样,如果系统里没有装或者版本太老,会出现一些看起来完全无关的报错,比如加载音频后结果全是静音或者直接崩溃。装好FFmpeg之后,建议先用一段短音频跑通预处理流程,确认音频能正确加载和编码,再进入生成环节。
5.2 权重下载与加载:网络问题和显存溢出是两大拦路虎
预训练权重的体积不小,如果网络不稳定,大概率会下载到一半断掉。建议用支持断点续传的下载工具,先把权重文件全部下齐,校验完整性之后再开始加载。加载权重的过程中,有几个常见的坑:
- 默认权重加载方式吃满内存。加载三个VQ-VAE和Transformer的总参数量很大,如果内存不足,进程会直接被OOM杀掉。建议在加载前释放无关缓存,如果有多个权重文件,加载一个用完后及时释放。
- 显存溢出经常发生在解码阶段,尤其是生成较长音频时。解决方法是减小batch size、缩短单次生成的音频长度,或者使用半精度推理(float16)。半精度在效果上的损失很小,但显存占用可以下降一半,是实测最有效的降本方案。
5.3 生成效果不如论文预期?先检查这几个变量
不少人在复现完之后跑来跟我说,生成的东西和论文展示的样例差太远。经过排查,90%的情况出在以下三个变量:
第一是温度参数。论文展示的经典样歌用的温度通常偏低,温度调高后虽然多样性上来了,但音乐性严重下降,会出现大量噪音和失谐片段。如果你想要稳定输出,可以先从低温试起,逐步提高找到自己应用的甜点。
第二是生成长度。模型在训练时见过的歌曲长度是有分布的,如果你让它生成远超训练分布时长的音频,模型很容易在后半段“放飞自我”,出现阿卡贝拉碎碎念加奇怪的节奏断片。
第三是条件输入的措辞。歌词作为条件输入,语义编码的质量直接影响生成结果的质量。实测中发现,措辞简洁、结构规整的歌词比口语化长句更容易让模型学会对齐,原因可能是长句经过编码之后的有效语义特征被稀释了。
5.4 一个值得记录的实操技巧:用Jukebox做音乐创作的“原料机”
纯粹把Jukebox当成“生成成品音乐”的工具,你会失望;但如果你把它当成“灵感原料机”,会发现它极其好用。
我试过的一个玩法是:给模型输入不同艺术家的embedding和几句随意写的歌词,生成十几段十几秒到几十秒不等的音乐片段,然后人工筛选出有潜力的段落,截取下来素材库。这些素材天然带有“AI味”,作为最终成品的底料未必合适,但作为采样素材、氛围垫底或者转场音效,稍微做过混音处理就能用得很好。在音乐创作者的日常工作中,最贵的不是技术而是灵感,Jukebox的价值恰恰在于能在几秒钟内给你十几条不一样的路让你选,这是人类创作者很难做到的。
6. 论文之外的个人体会与后续探索方向
读Jukebox这篇论文,我最深的感受是:它并不是一篇“完美”的论文,甚至很多方面在今天看来已经过时了,但你拆开它的每一个组件,会发现每个决策背后都有极其清晰的工程考量。
VQ-VAE选型避开了连续预测的优化难题;稀疏Transformer避开了长序列注意力爆炸的问题;层次化生成用一个粗到细的思路把“长序列难生成”这个根本矛盾拆成了多个短序列子问题;艺术家和歌词条件控制让生成过程从不可控变为部分可控。这些东西单独拎出来,每一个都是可以写一整篇论文的技术点,而Jukebox把它们组合成了一个整体,完成了一个当时几乎没人敢做的任务。
我在实际使用中最大的体会是:不要只把它当成一个“老模型”去考古,而是要把注意力放在它如何定义问题、如何拆解难点上。现在很多论文的工作都是在某个大框架下刷精度、刷指标,但Jukebox这种论文是在定义“能不能做”的边界,从无到有去解决一个几乎不可能完成的任务。这种类型的工作,哪怕技术细节被后续模型全面超越,它对思考方式的启发依然值得反复琢磨。
如果你对这个方向有兴趣,我的建议是这样一条实践路径:先用预训练权重跑通推理,听一听生成结果,建立对“层次化音频生成”的直观感受;然后读一遍开源源码里VQ-VAE的编码解码实现,理解离散token在中间表征中的地位;接着找一个现成的音频语言模型对比一下它的设计和Jukebox的差异;最后如果有余力,再考虑在一个小的子集或者缩小规模上试着训练一个极简版本。这条路走下来,你对整个音频生成领域的理解深度,绝对不会是只看几篇论文的阅读笔记能比的。
最后再分享一个小技巧:Jukebox论文的附录部分和开源代码仓库里包含了很多正文没详细讲的实验细节,比如不同注意力模式的效果对比、码本大小对重建质量的影响、采样温度对生成结果的影响等。这些内容你扫一眼可能觉得是补充材料,实际上对理解整个模型的商业化和工程化边界非常有价值。看这篇论文的时候,千万不要跳过附录,那才是让你从“看热闹”进阶到“看门道”的关键一步。