深度学习表达钢琴演奏

2021-02-09 20:24:08

在过去的四年中,Popgun的一个小团队一直在研究深度学习在音乐分析和生成中的应用。这项研究的最终成果是发布了Splash Pro,Splash Pro是一款免费的,由AI驱动的数字音频工作站(DAW)插件。随着此博客的发布,我们希望通过解释我们已经从事的一些核心项目,为音乐深度学习提供一个易于访问的介绍。

在这篇文章中,我想描述表达钢琴综合模型的设计。该模型(我们称为“ BeatNet”)能够分析钢琴演奏并生成模仿原始演奏风格的新作品。在开始技术工作之前,下面是BeatNet生成的一些示例:

风格为“肖邦-E-flat专业夜曲,作品。 9号2号”

BeatNet能够复制人类钢琴演奏中存在的许多特征,尽管我要解决一些弱点和局限性。为了解释该模型的工作原理,我将博客的其余部分分为两部分。第一部分将讨论音乐表现,而第二部分将探索模型设计并展示其更多功能。

*注意:BeatNet不对延音踏板事件建模。延音是手动添加到此作品中的。

在设计音乐生成模型时,选择合适的表现形式至关重要。此选择确定可以忠实地编码哪些数据,可用的建模技术以及整个系统的效力。因此,我决定首先简要解释一些常见的音乐表现形式。如果您对这一切感到熟悉,请随时跳到第二部分。

当我们谈论机器学习中的音频时,通常是指一组时域样本。这些样本是物理声压波的数字近似值。这种近似的质量取决于采样率和位深度(请参阅:PCM)。在研究中,通常会看到16-22kHz的采样率。但是,为了捕获整个人类可听到的频率,大多数HiFi应用程序(例如音乐,播客等)使用大约44kHz的频率(请参阅:奈奎斯特定理)。

由于其高维度,对原始音频进行建模非常具有挑战性。对于要在几秒钟的时间尺度上重现音频结构的生成模型,它必须捕获成千上万个样本之间的关系。尽管执行此操作变得越来越可行(请参见[1]),但是有更有效的方法来编码钢琴演奏。

注意:有关直接在音频域中进行音乐建模的示例,请参见OpenAI的Jukebox [2]。

MIDI是一项允许电子乐器和计算机进行通信的技术标准。它由一系列“消息”组成,每个消息描述一个特定的音乐事件或指令。可以传送和存储与音符时间,音高和响度(即速度)有关的指令。例如,编码为MIDI的钢琴演奏可以记录按下音符的力度,力度和时间。

要将MIDI文件转换回可听的音频,一段软件会重放这些说明并合成相关音符。 MIDI不对声学信息进行编码,例如乐器的声音或录音环境。因此,它比音频要高效得多,这是我们探索的一个很好的起点。

使用MIDI时,我们使用Colin Raffel的出色的PrettyMIDI库。这消除了原始格式的许多复杂性。有关MIDI文件格式的更详细说明,请参阅Colin Raffel的论文。

请注意,我们用这种方式表示FürElise的方式非常简洁,并考虑到等效音频部分包含大约50k样本(对于44kHz录音)。

对于使用GarageBand或Ableton等数字音频工作站(DAW)的任何人来说,这看起来都很熟悉。垂直轴表示音高,水平轴表示时间。每个音符的速度由其大小编码。除了提供直观的方式来可视化MIDI之外,钢琴卷帘还具有一些有趣的机器学习属性。

例如,考虑将歌曲的音调提高一个半音或将其开始延迟几秒钟的效果。这些换位保留了钢琴卷的空间结构。设计模型时,我们可以通过应用2D卷积神经网络(CNN)来利用此属性。 Popgun的早期实验正是使用PixelCNN进行了此尝试。但是,这种方法有一些严重的缺点。

编码为钢琴卷的典型歌曲非常稀疏:几乎所有条目均为零。天真地应用CNN会浪费大量的时间在完全空白的区域上。为时间轴选择合适的分辨率也很困难。如果对原始数据进行量化,以使每个音符与统一的音乐网格完美对齐,则可以基于量化强度选择分辨率。但是,这对于具有表现力的钢琴演奏来说很困难,在这种情况下,时间的自然变化对音乐性至关重要。

注意:许多作品都尝试使用广泛的神经网络架构来模拟钢琴卷。对于那些有兴趣了解更多信息的人,本文是一个很好的起点[16]。

2017年,Google Magenta发布了一个名为Performance RNN [3]的模型,该模型展示了能够以高保真度对富有表现力的钢琴演奏进行建模的功能。关键的创新是非常适合此任务的新格式。出于显而易见的原因,我们将这种“绩效表示”简称为“时移”。与MIDI一样,时移通过一系列离散的音乐事件对音乐进行编码。它与众不同的是它编码时间进程的独特方式。代替沿特定轴表示时间(钢琴滚动)或作为每个单独音符(MIDI)的属性,在时移中有一个特定事件指示乐曲的前进。

272-设置速度= 6476-开启MIDI音符76(E5)317-提前0.3秒204-关闭MIDI音符76(E5)271-设置速度= 6075-开启MIDI音符75(D#5)317-提前0.3秒203-关闭MIDI Note 75(D#5)274-设置速度= 7276-开启MIDI Note 76(E5)317-提前0.3秒204-关闭MIDI Note 76(E5)273-设置速度= 6875-打开MIDI Note 75(D#5)317-提前0.3秒...

这种一维标记序列类似于语言模型中使用的编码。这意味着NLP的现代发展(例如ByteNet [4],Transformers [5])可以很容易地应用于时移格式。

0-127:记录事件128-255:记录事件256-287:32个速度变化事件288-387:100个量化的时移值(10ms-> 1000ms)

注意:我们尚未考虑延音踏板事件,但是纳入未来的最小工作可能很有趣。

2016年,谷歌公司DeepMind实验室的研究人员发布了现在著名的WaveNet论文[1]。核心见解是,一维卷积可以消除训练过程中对昂贵的重复计算的需求,从而可以生成有效的序列模型。原始音频生成的演示证明了其有效性。不久之后,ByteNet [4]的发布将这一思想扩展到自然语言处理领域。

受这项工作的启发,Popgun开发了自己的ByteNet模型用于符号钢琴音乐。我们将此工作称为“ BeatNet”。在传统上占主导地位的RNN上使用ByteNet的选择是出于以下几个因素:

炒作。在基于Transformer的体系结构[5]迅速普及之前,WaveNet和ByteNet是最早威胁RNN统治地位的论文。

我们通过从许多在线资源中绘制来策划MIDI数据集。一个重要的来源是雅马哈电子钢琴比赛数据集,其中包括爵士和古典音乐表演。另一个来源是Lakh MIDI数据集,其中包含更广泛的流派,包括许多现代作品。

为了创建一个能够表现出高表现力的模型,我们处理了数据以滤除“低质量”的商品。使用MIDI数据集的任何人都会欣赏很多歌曲听起来“不好”的声音。这会带来一些困难的问题:什么是音乐质量?我们如何解释主观偏好?有些歌曲很奇怪,我们可以自信地认为它们不是“音乐剧”吗?可以说,这些问题超出了本文的范围。

最终,我们的工作解决方案可以总结为:工程师听了一些数据项,每种情况下都说“是的,听起来很音乐”或“不,我不喜欢”。在此过程中,他们开发了自动启发式过滤器来过滤不需要的项目,从而使数据集偏向于主观“音乐”的歌曲。将来,将这些评估进行众包或在音乐理论的基础上设计启发式方法将很有趣。

我们在2017年7月完成了我们的第一个工作原型。它实质上是无条件的ByteNet [4]解码器,可按时移格式序列运行。图5说明了基本的生成过程。

在每个步骤中,BeatNet都会根据历史情况在下一个时移令牌上输出概率分布。要生成一首歌曲,我们使用来自测试集的序列对模型进行预填充,然后对预测的延续进行采样。这是此模型的示例:

请注意,时间和响度存在自然变化,模仿了人类表演中存在的各种功能。尽管有一些有趣的繁荣发展,但该模型倾向于漫无目的地徘徊,而规划或长期结构的证据有限。时序也不常见,因为该模型没有拍号节奏的概念。

对于面向用户的应用程序,这种“无条件”模型的控制非常有限。只能调整启动顺序(和一些次要生成设置)。改善此问题的一种方法是引入潜在变量。

变分自动编码器(VAE)[6]是一种流行的生成建模技术,其应用领域越来越多,例如图像[7],分子合成[8],符号音乐[9] [10]和语音合成[11] ]。其他作者[12] [13] [14]撰写了很多有关VAE的文章,因此在这里我不做全面的解释。重要的是:VAE提供了一种原则性的方法来学习数据集中不确定的变化因素。为了说明为什么这样做有用,请考虑在我们的钢琴模型中进行控制的两个途径:

预先指定所需的模型控制(例如“响度”,“速度”,“键”)。对于每个数据集项目(或较大的子集),我们收集与这些控件相对应的标签。我们提供这些标签作为训练期间模型的额外输入。生成新歌曲时,可以操纵这些功能来控制输出。

对VAE进行了培训,可以自动发现数据变化的潜在因素。训练后,受过音乐训练的听众会探索这些因素(例如通过对每个维度进行插值)并观察对模型输出的影响。基于此探索,我们为每个潜在维度设计了事后解释。通过向用户展示这些功能,他们可以按照(1)指导模型。

这些方法之间需要权衡取舍。如果可以为每个数据项轻松提取所需的控制特征,则(1)变得可行。但是,在我们的实验中,我们观察到此特征定义的方式倾向于在数据集中具有自然相关性。如果用户在生成时定义了不合理的配置,则可能对输出质量产生负面影响。与(2)中的方法相反,VAE目标鼓励学习的控制功能的独立性。

此外,请考虑我们可能希望控制难以正式定义的某些抽象功能,例如“样式”或“风格”。 VAE通过简单地学习可以解释数据可变性的功能来避开此问题。某个潜在的维度或子空间可能会映射到人类的“体裁”或“风格”概念,但并不能保证;可能很难解释学习到的功能。在实践中,我们有两个观察结果:

通常可以找到潜在维度的可解释子集,以暴露为用户控件。

与1.无关,潜在空间为用户控制提供了新颖的机制,例如音乐插值和样式转移。

在BeatNet VAE中,我们引入了一系列潜在变量来帮助指导模型的生成。该架构与Google Magenta的NSynth [15]非常相似。卷积编码器将输入嵌入到压缩的潜在表示中,然后将其作为附加上下文提供给ByteNet解码器。 VAE目标鼓励这些向量遵循简单的分布(即标准正态),并对其可能包含的信息量进行惩罚。通过调整潜矢量的大小和正则项,可以学习一种表示,它解释了序列中的某些(但重要的不是全部)变异。通过保持此潜在变量常数,我们可以对许多不同的输出进行采样,这些输出继承了给定输入的“样式”。

Beatnet VAE的FürElise的延续作品经许可,源自8notes的FürElise MIDI。

此代码段演示了BeatNet VAE如何生成给定输入序列的延续。输入运行18s,随后出现模型响应。源自原始作品的潜在变量有助于指导延续性,传递动感,调子和演奏风格等品质。请注意,与无条件模型相比,BeatNet VAE在持续播放方面做得更好。

图6显示了BeatNet在生成的前200个步骤中分配给每个令牌的概率。 y轴跟踪不同的事件类型,从y = 0到y = 127的“ note on”事件开始。 “音符关闭”事件位于该事件的上方,依时间平移规范依此类推。深色水平带对应于训练数据中钢琴音乐范围之外的音符。

图7给出了相同概率的放大图。我们专注于前40代步骤中的“注意事项”事件。为了比较,图8(下图)显示了与钢琴卷相同的短语。 BeatNet在每个步骤中选择的令牌都以紫色突出显示(请记住,仅显示“ note on”令牌)。

要了解发生了什么,请单独考虑一列。 BeatNet在x = 20时选择弹奏音符A3(令牌57)。考虑到我们处于A小调,BeatNet将高概率分配给B3(全音阶音符),将低概率分配给A#3(不和谐的小二音)似乎是合理的。在每个步骤中,都有许多分支轨迹是可能的,尽管有些分支的可能性要大得多。

对于将机器学习应用于创造性任务的更多应用,Google Magenta博客包含许多有趣的项目。

这个项目是Popgun团队的共同努力。我要特别感谢Adam Hibble在这个项目中领导团队。如果您有任何技术问题,请随时与Twitter联络。如有其他查询,请发送电子邮件至[email protected]