NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
扩散模型目前风靡一时,尤其是自去年夏天稳定扩散风靡全球以来。从那时起,无数的变体和新的扩散模型已经在各种各样的背景下发布。虽然令人惊叹的视觉效果抢走了风头,但与生成音频相关的扩散也取得了重大进展。
在扩散和其他方法的推动下,生成音乐最近取得了许多胜利,因为新模型层出不穷。OpenAI 在 2020 年发布 Jukebox 时,其功能让世界惊叹不已。但谷歌在今年年初制作出非凡的 MusicLM 时说“保留我的模型”。Meta 紧随其后,他们上个月发布并开源了 MusicGen。但大型机构并不是唯一加入的机构,因为 Riffusion(Forsgren 和 Martiros)和 Moûsai(Schneider 等人)等独立研究人员也做出了非常有趣的贡献。除此之外,过去几年还发布了许多其他模型,它们各有优缺点。
扩散模型因其非凡的创造能力而吸引了许多人;这是许多其他类型的机器学习 (ML) 所缺乏的。大多数 ML 模型都经过训练以执行任务,其成功可以通过正确与错误来衡量。但是当我们进入艺术和音乐领域时,如何将模型优化到可能被认为是最好的状态?它当然可以学习重现著名的艺术或音乐,但如果没有新颖性,那就毫无意义。那么如何解决这个问题——将创造力注入只知道 1 和 0 的机器?扩散是一种为这个难题提供优雅解决方案的方法。
1、扩散—从 10,000 英尺高空进行
从本质上讲,ML 中的扩散只是从信号中添加或去除噪声的过程(想想旧电视中的静电)。正向扩散会给信号添加噪声,而反向扩散会消除噪声。我们最熟悉的过程是反向扩散过程,模型吸收噪声,然后将其“去噪”为人类可以识别的东西(艺术、音乐、语音等)。这个过程可以通过多种方式进行操纵,以实现不同的目的。
扩散中的“创造力”来自启动去噪过程的随机噪声。如果你每次都为模型提供不同的起点来去噪为某种形式的艺术或音乐,这就模拟了创造力,因为输出将始终是独一无二的。
从最初的想法来看,教导模型执行此去噪过程的方法实际上可能有点违反直觉。该模型实际上是通过做完全相反的事情来学习去噪信号的——一遍又一遍地向干净的信号中添加噪声,直到只剩下噪声。这个想法是,如果模型可以学习如何预测在每个步骤中添加到信号的噪声,那么它也可以预测在每个步骤中消除的噪声。实现这一点的关键要素是,添加/消除的噪声需要具有定义的概率分布(通常是高斯分布),以便噪声/去噪步骤是可预测和可重复的。
这个过程有更多细节,但这应该能让你对幕后发生的事情有一个合理的概念理解。如果你有兴趣了解更多关于扩散模型(数学公式、调度、潜在空间等)的信息,我建议你阅读 AssemblyAI 的这篇博文和这些论文(DDPM、改进 DDPM、DDIM、稳定扩散)。
2、微小音频扩散
我对扩散的兴趣源于它在生成音频中展现的潜力。传统上,为了训练 ML 算法,音频被转换成频谱图,这基本上是随时间变化的声音能量热图。这是因为频谱图表示类似于图像,计算机在处理图像方面非常出色,并且与原始波形相比,数据大小显著减少。
然而,这种转换也带来了一些弊端,包括分辨率降低和相位信息丢失。音频信号的相位(phase)表示多个波形相对于彼此的位置。这可以通过正弦函数和余弦函数之间的差异来证明。它们表示完全相同的振幅信号,唯一的区别是两者之间的 90°(π/2 弧度)相移。如需更深入地解释相位,请观看 Akash Murthy 的这段视频。
相位是一个永远难以理解的概念,即使对于从事音频工作的人来说也是如此,但它在创造声音的音质方面起着至关重要的作用。可以说,它不应该被轻易丢弃。相位信息在技术上也可以用频谱图形式(变换的复杂部分)表示,就像幅度一样。然而,结果很嘈杂,而且在视觉上看起来很随机,这使得模型很难从中学习任何有用的信息。由于这个缺点,最近人们开始关注不要将音频转换成频谱图,而是将其作为原始波形(waveform)来训练模型。虽然这带来了一系列挑战,但幅度和相位信息都包含在波形的单个信号中,为模型提供了更全面的声音图像以供学习。
这是我对波形扩散感兴趣的一个关键部分,它显示出在为生成音频产生高质量结果方面的潜力。然而,波形是非常密集的信号,需要大量数据来表示人类可以听到的频率范围。例如,音乐行业的标准采样率为 44.1kHz,这意味着需要 44,100 个样本才能表示仅 1 秒的单声道音频。现在立体声播放需要两倍的采样率。因此,大多数波形扩散模型(不利用潜在扩散或其他压缩方法)需要高 GPU 容量(通常至少 16GB+ VRAM)来存储训练时的所有信息。
动机
许多人无法使用高性能、高容量的 GPU,或者不想支付租用云 GPU 的费用用于个人项目。我发现自己处于这种情况,但仍然想探索波形扩散模型,于是我决定开发一个可以在我微薄的本地硬件上运行的波形扩散系统。
硬件设置
我配备了一台 2017 年的 HP Spectre 笔记本电脑,配备第 8 代 i7 处理器和 GeForce MX150 显卡(配备 2GB VRAM)——这并不是训练 ML 模型的强大设备。我的目标是能够创建一个可以在该系统上训练并产生高质量(44.1kHz)立体声输出的模型。
3、模型架构
我利用 Archinet 的 audio-diffusion-pytorch 库来构建此模型 — 感谢 Flavio Schneider 帮助使用这个主要由他构建的这个库。
注意力 U-Net
基本模型架构由带有注意块的 U-Net 组成,这是现代扩散模型的标准。U-Net 是一种神经网络,最初是为图像 (2D) 分割而开发的,但已适应音频 (1D) 以供我们使用波形扩散。U-Net 架构因其 U 形设计而得名。
U-Net 与自动编码器非常相似,由编码器和解码器组成,它在网络的每个级别都包含跳跃连接(skip connections)。这些跳跃连接是编码器和解码器相应层之间的直接连接,有助于将细粒度细节从编码器传输到解码器。编码器负责捕获输入信号的重要特征,而解码器负责生成新的音频样本。编码器逐渐降低输入音频的分辨率,提取不同抽象级别的特征。然后,解码器获取这些特征并对其进行上采样,逐渐提高分辨率以生成最终的音频样本。
这个 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、预训练模型
我训练了 4 个独立的无条件生成模型来制作底鼓、小军鼓、踩镲和打击乐(所有鼓声)。用于训练的数据集是我为音乐制作工作流程收集的小型免费一次性样本(全部开源)。更大、更多样化的数据集将提高每个模型生成的输出的质量和多样性。根据每个数据集的大小,模型经过了不同数量的步骤和时期的训练。
预训练模型可在 Hugging Face 上下载。你可以查看 Weights & Biases 中记录的训练进度和输出样本。
5、示例样本
总体而言,尽管模型尺寸缩小,但输出质量相当高。然而,仍然有一些轻微的高频“嘶嘶声”,这可能是由于模型尺寸有限造成的。这可以从下面波形中残留的少量噪音中看出。生成的大多数样本都很清晰,保持了瞬态和宽带音色特性。有时模型会在样本末尾添加额外的噪音,这可能是模型层数和节点数限制的代价。
点击这里收听模型的一些输出样本。每个模型的示例输出如下所示。
6、结束语
除了在本地硬件上探索波形扩散模型外,这个项目的一个重要目标是能够与他人分享同样的机会。我想为那些资源有限、想要尝试音频波形扩散的人提供一个简单的切入点。因此,我构建了项目存储库,提供有关如何训练或微调自己的模型以及如何从 Inference.ipynb 笔记本生成新样本的分步说明。
此外,我还录制了一个教程视频,该视频介绍了如何设置 Anaconda 环境,并演示了如何使用预训练模型生成独特样本。
对于生成音频,尤其是扩散而言,这是一个激动人心的时刻。通过构建这个项目,我学到了很多东西,并进一步扩大了我对音频 AI 未来的乐观态度。我希望这个项目也能对其他想要探索音频 AI 世界的人有所帮助。
原文链接:Tiny Audio Diffusion: Waveform Diffusion That Doesn’t Require Cloud Computing
BimAnt翻译整理,转载请标明出处