
探索如何在消费级笔记本电脑和少于2GB VRAM的GPU上训练模型和生成声音的音频波形扩散
背景
扩散模型目前非常流行,特别是自从稳定扩散在去年夏天席卷全球以来。此后,各种各样的扩散模型和新的扩散模型在各种不同的背景下被发布。尽管令人惊叹的视觉效果吸引了人们的注意,但与生成音频相关的扩散方面也有显著的发展。
在扩散和其他方法的推动下,生成音乐取得了许多最近的成功,因为新的模型一直在不断发布。 2020年,OpenAI发布了Jukebox,令世界瞩目。 但是,在今年年初,Google发布了令人瞩目的MusicLM之后,它说“请看我自己的模型”。在过去的一个月里,Meta也不甘落后,他们发布并开源了MusicGen。 但并非只有大型机构参与其中,独立研究人员也做出了非常有趣的贡献,例如Riffusion(Forsgren和Martiros)和Moûsai(Schneider等)。 除了这些之外,过去几年里还发布了许多其他模型,它们都有各自的优点和缺点。
扩散模型之所以吸引人,是因为它们具有非凡的创造能力;这是许多其他机器学习(ML)领域所缺乏的。大多数ML模型的训练目标是执行一个任务,并通过正确与错误的区分来衡量其成功与否。 但是,当我们进入艺术和音乐领域时,如何使模型优化到被认为是最好的状态呢?它当然可以学习复制著名的艺术或音乐,但如果没有新颖之处,就没有意义。那么,如何解决这个问题——向只知道1和0的机器中注入创造力?扩散是提供优雅解决方案的一种方法。
扩散——从一万英尺的高度
在机器学习中,扩散的核心是从信号中添加或删除噪声(类似于旧电视机的静态)。前向扩散向信号添加噪声,而反向扩散则去除噪声。我们最熟悉的过程是反向扩散过程,模型接收噪声,然后将其“去噪”为人类可以识别的形式(艺术、音乐、语音等)。可以以多种方式操纵此过程以实现不同的目的。
扩散中的“创造力”来自于启动去噪过程的随机噪声。如果每次为模型提供不同的起始点,让其去噪成某种形式的艺术或音乐,那么输出将始终是独特的,从而模拟创造力。




教授模型执行这种去噪过程的方法实际上可能与最初的想法有些相反。模型实际上通过执行相反的操作——在干净的信号上一遍又一遍地添加噪声,直到只剩下噪声。这样做的理念是,如果模型能够学习如何预测在每个步骤中添加到信号中的噪声,那么它也可以预测在反向过程中每个步骤去除的噪声。实现这一点的关键因素是添加/去除的噪声必须具有定义的概率分布(通常是高斯分布),以便噪声添加/去除步骤是可预测和可重复的。
这个过程涉及更多细节,但这应该能够提供对发生在内部的事情有一个扎实的概念性理解。如果你有兴趣了解更多关于扩散模型(数学公式、调度、潜在空间等)的内容,我建议阅读AssemblyAI的这篇博客文章以及这些论文(DDPM,改进DDPM,DDIM,稳定扩散)。
微小音频扩散
理解机器学习中的音频
我对扩散的兴趣来自于其在生成音频方面展示出的潜力。传统上,为了训练机器学习算法,音频被转换为频谱图,这基本上是声音能量随时间的热图。这是因为频谱图的表示类似于图像,计算机在处理图像方面异常出色,并且相对于原始波形而言,数据大小显著减少。

然而,这种转换也存在一些权衡,包括分辨率降低和相位信息丢失。音频信号的相位表示多个波形相对于彼此的位置。这可以在正弦函数和余弦函数之间的差异中演示出来。它们在幅度方面表示完全相同的信号,唯一的区别是两者之间存在90°(π/2弧度)的相位移。关于相位的更详细解释,请参阅Akash Murthy的这个视频。

相位是一个永恒难以理解的概念,即使对于从事音频工作的人来说也是如此,但它在创建声音的音色特性方面起着关键作用。可以说它不应该轻易丢弃。相位信息也可以在频谱图中表示(变换的复数部分),就像幅度一样。然而,结果是嘈杂的,视觉上看起来是随机的,使模型难以从中学习任何有用的信息。因此,最近有人开始对将音频转换为频谱图保留为原始波形以训练模型产生了兴趣。虽然这带来了自己的一套挑战,但幅度和相位信息都包含在波形的单个信号中,为模型提供了更全面的声音图像。

这是我对波形扩散的兴趣的一个关键方面,它已经显示出在生成音频方面产生高质量结果的潜力。然而,波形是非常密集的信号,需要大量数据来表示人类可以听到的频率范围。例如,音乐行业的标准采样率是44.1kHz,这意味着表示1秒单声道音频需要44,100个样本。对于立体声播放,需要再加倍。因此,大多数波形扩散模型(不使用潜在扩散或其他压缩方法)需要高的GPU容量(通常至少16GB+ VRAM)来存储所有信息进行训练。
动机
许多人无法获得高功率、高容量的GPU,或者不想为个人项目支付租用云GPU的费用。我发现自己处于这种境地,但仍希望探索波形扩散模型,因此决定开发一个可以在我现有的低配硬件上运行的波形扩散系统。
硬件配置
我配备了一台2017年的惠普 Spectre 笔记本电脑,配备了第八代i7处理器和2GB VRAM的GeForce MX150图形卡,不算是训练机器学习模型的强力设备。我的目标是在这个系统上能够创建一个能够训练和生成高质量(44.1kHz)立体声输出的模型。
模型架构
我使用了Archinet的audio-diffusion-pytorch库来构建这个模型,感谢Flavio Schneider在使用这个库的过程中提供的帮助,他在很大程度上贡献了这个库。
Attention U-Net
基本模型架构包括一个带有注意力块的U-Net,这在现代扩散模型中是标准的。U-Net是一个最初设计用于图像(2D)分割的神经网络,但已经适应了音频(1D)并应用于波形扩散。U-Net的架构得名于其U形设计。

与自动编码器非常相似,U-Net由编码器和解码器组成,并且在网络的每个级别都包含跳过连接。这些跳过连接是编码器和解码器之间对应层的直接连接,有助于将细粒度的细节从编码器传递到解码器。编码器负责捕获输入信号的重要特征,而解码器负责生成新的音频样本。编码器逐渐降低输入音频的分辨率,提取不同抽象级别的特征。解码器然后接受这些特征并进行上采样,逐渐增加分辨率以生成最终的音频样本。

这个U-Net还在较低级别包含自注意力块,有助于保持输出的时间一致性。将音频下采样足够是非常关键的,以便在扩散过程中进行采样时能够保持效率,并且避免过载注意力块。模型利用了V-Diffusion,这是一种受到DDIM采样启发的扩散技术。
为了避免GPU VRAM耗尽,基本模型训练的数据长度需要较短。因此,我决定训练一次性鼓样本,因为它们的上下文长度固有地很短。经过多次迭代,确定基本模型长度为32,768个样本,采样率为44.1kHz,立体声,大约为0.75秒。这可能看起来特别短,但对于大多数鼓样本来说已经足够。
变换
为了对音频进行足够的下采样以适应注意力块,尝试了几种预处理变换。希望在训练模型之前,如果能够对音频数据进行下采样而不丢失重要信息,那么可以最大限度地增加节点(神经元)和层数,而不增加GPU内存负载。
尝试的第一种变换是“拼贴”的一个版本。最初用于图像,为了我们的目的,这个过程被适应成了音频。输入音频样本按照时间步长顺序分组成块,然后转置成通道。这个过程可以在U-Net的输出处反向操作,将音频解块还原为完整长度。然而,解块过程会导致混叠问题,在生成的音频中产生不良的高频伪影。
尝试的第二种变换,由Schneider提出,称为“学习变换”,它由U-Net的开头和结尾处具有大内核大小和步幅的单一卷积块组成。尝试了多个内核大小和步幅(16、32、64),并配合相应的模型变化适当地对音频进行下采样。然而,这导致了生成的音频中的混叠问题,虽然不如拼贴变换那么普遍。
因此,我决定需要调整模型架构,以适应没有预处理变换的原始音频,以产生足够质量的输出。
这需要增加U-Net内的层数,以避免过快地进行下采样并丢失重要特征。经过多次迭代,最佳架构是每一层仅进行2倍的下采样。虽然这要求每层的节点数减少,但最终产生了最佳结果。有关U-Net级别、层数、节点数、注意力特征等的详细信息可以在GitHub上的tiny-audio-diffusion存储库中的配置文件中找到。
结论
预训练模型
我训练了4个独立的无条件模型来生成踢鼓、响鼓、踩镲和打击乐(所有的鼓声)。用于训练的数据集是我收集的用于音乐制作工作流程的小型免费一发样本(全部开源)。更大、更多样化的数据集将会提高每个模型生成输出的质量和多样性。这些模型的训练步骤和周期数因每个数据集的大小而异。
预训练模型可以在Hugging Face上下载。查看训练进展和输出样本的日志记录在Weights & Biases上。
结果
总的来说,尽管模型的大小减小了,输出的质量还是相当高的。然而,仍然存在一些轻微的高频“噪音”,这很可能是由于模型的尺寸有限所致。可以在下面的波形中看到剩余的少量噪音。大多数生成的样本都很清晰,保持了瞬态和宽带音色特性。有时模型会在样本末尾添加额外的噪音,这很可能是模型的层数和节点限制导致的代价。
在这里听一些模型生成的样本。下面显示了每个模型的示例输出。





讨论
除了在我的本地硬件上探索波形扩散模型,这个项目的一个重要目标是能够与他人分享同样的机会。我希望为那些资源有限、想要尝试音频波形扩散的人提供一个简单的入门点。因此,我将项目存储库结构化,提供了逐步说明如何训练或微调自己的模型,以及如何从Inference.ipynb笔记本中生成新的样本。
此外,我录制了一段教程视频,介绍如何设置Anaconda环境,并演示如何使用预训练模型生成独特的样本。
现在是生成音频的令人兴奋的时刻,尤其是通过扩散技术。通过构建这个项目,我学到了很多东西,并进一步扩大了对音频AI未来发展的乐观态度。我希望这个项目对于其他人来探索音频AI的世界有所帮助。
除非另有说明,所有图片均为作者原创。
tiny-audio-diffusion代码在这里找到: https://github.com/crlandsc/tiny- audio-diffusion
关于设置环境以使用tiny-audio-diffusion生成样本的教程视频:https://youtu.be/m6Eh2srtTro
我是一名音频科学家,专注于人工智能/机器学习和空间音频,同时也是一名终身音乐家。如果您对更多的音频AI应用感兴趣,请查看我最近的关于音乐分离的文章。
在LinkedIn和GitHub上找到我,并在我的个人网站www.chrislandschoot.com上了解我的最新工作和研究动态。
在Spotify、Apple Music、YouTube、SoundCloud和其他流媒体平台上找到我的音乐,名字是After August。