使用 Transformer 序列到序列的钢琴转录

论文原文

最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱(Serocs),感兴趣的读者欢迎试用与分享,感谢您的支持!serocs.cn

摘要

近年来,自动音乐转录通过在大型数据集上训练自定义深度神经网络取得了重大进展。然而这些模型需要对网络架构、输入/输出表示和复杂的解码方案进行特定领域的设计。在这项工作中,我们展示了使用具有标准解码方法的通用编码器解码器 Transformer 可以实现相同的性能。我们展示了该模型可以学习将频谱图输入直接转换为类 MIDI (MIDI-like)的输出,以用于多个转录任务。这种序列到序列的方法通过联合建模音频特征和类语言(language-like)的输出依赖关系来简化转录,从而消除对特定任务架构的需求。这些结果指出了通过专注于数据集构建和标记而不是自定义模型设计来构建新的音乐信息检索模型的可能性。

1 介绍

自动音乐转录(AMT)是音乐信息检索(MIR)的核心任务之一。AMT 的目标是将原始音频转换为合适的符号表示。在本文中,我们考虑将钢琴音频转录为一系列精确的开始/结束时间和力度的音符事件的问题,而不是与节律栅(metrical grid)对齐的乐谱。

钢琴转录的最新进展主要受到两个因素的推动:构建和发布包含对齐的钢琴音频和 MIDI 的数据集(最著名的是 MAPS 和 MAESTRO ),以及使用具有专为钢琴转录而设计的深度神经网络架构(如 Onset and Frames 架构分别建模了音符的开始与存续)。虽然特定领域的模型已经改进了基准数据集,但尚不确定这些方法是否可以应用于其他领域和 MIR 任务。

同时,使用自注意力的 Transformer 模型已经证明了一种惊人的能力,可以通过简单地改变输入和输出表示,在具有相同核心架构的各种领域中实现最先进的结果。

在本文中,我们展示了一个通用的 Transformer 模型可以实现最先进的钢琴转录,而无需适应任何特定的领域。使用“现成的”组件(来自 T5 论文的基本未修改的编码器解码器配置)和简单的贪婪解码策略,我们训练一个模型来编码原始频谱图帧并直接解码为受原始 MIDI 协议中消息(例如,音符(note on)和速度(velocity)消息)启发的一系列音符事件。因此,在本文的其余部分中,我们将模型的输出称为“类 MIDI”。我们在第 3.2 节中提供了模型词汇的详细信息。

此外,我们展示了这种与领域无关的方法使我们能够通过仅更改训练标签而不修改输入或模型来训练转录任务的多种变体(例如,仅转录音符开始)。

总之,这项工作展示了使用通用序列到序列的 Transformer 模型进行钢琴转录的价值,同时无需适应特定的领域,并指出了将类似方法扩展到各种 MIR 任务的潜力。

2 相关工作

2.1 钢琴转录

使用在对齐的音频和 MIDI 数据集上训练的深度神经网络模型在钢琴转录方面取得了很大进展。2012 年,Bolanger-Lewandowski 等人(Nam 等人建立的声学模型)训练了一个循环神经网络 (RNN) 转录模型来输出二进制钢琴卷(piano roll)。Böck 和 Schedl 仅针对钢琴开始事件训练了一个类似的基于 RNN 的模型。Hawthorne 等人通过使用基于卷积的单独模型堆栈来检测音符开始、音符存续和音符速度,从而提高了转录准确度。除非起始预测器给出的概率大于 0.5,否则模型输出使用硬先验(hard prior)通过不启用音符来解码为离散音符。

最近,钢琴转录的进展主要涉及添加更多特定领域的深度神经网络组件和修改解码过程。 在大多数情况下,这种额外的复杂性是针对提高钢琴转录准确性的特定目的而设计的。

Kong 等人使用与 Hawthorne 等人类似的网络架构,使用回归来预测精确的连续开始/结束时间,从而获得更高的转录准确度。Kim & Bello 在转录输出上使用对抗性损失来鼓励转录模型输出更合理的钢琴卷。我们的序列到序列方法通过自回归解码器显式地模拟这种输出间依赖关系,该解码器与提取有意义的音频特征的编码器进行端到端训练。

Kwon 等人使用某种语言模型来模拟每个音高的音符状态转换,而不是使用单独的音符开始、音符帧和音符结束。然而解码过程相当复杂,尤其是在处理不同音高之间的相互作用的时候。类似Kelz 等人在基于 attack-decay-sustain-release (ADSR) 包络的音符状态上使用隐式马尔可夫模型进行解码。

在特定领域处理中,Elowsson 构建了一个层次模型,从频谱图中提取基本频率轮廓,并使用这些轮廓来推断音符的开始和结束。虽然对于许多应用程序来说,像 Engel 等人那样的中间表示可能很有用,但在这项工作中,我们将从音频到离散音符的复音转录视为端到端问题。这种方法概念简单,我们的评估(第 4.2 节)表明它也是有效的。

2.2 Transformer

最近,一种通用的 Transformer 架构已被用于跨多个领域来解决序列到序列问题,取代了以前使用的特定任务架构。在 Transformers 最初出现并被广泛使用的自然语言处理领域之外(例如 Brown 等人的 GPT-3 和 Raffel 等人的 T5),Transformer 已在计算机视觉中用于对象检测、基于字幕的图像生成和姿势重建等任务,以及包括语音识别、语音合成和音频事件分类在内的音频相关任务。

Transformer 的在上述许多用途中都利用了预训练阶段,在该阶段,模型使用自监督学习对大量未标记数据进行训练。虽然这样的预训练阶段也可能有助于音乐转录,但在这项工作中,我们探索了一种更简单的设置,即以普通监督学习在标记转录上从头开始训练 Transformer 架构。

2.3序列到序列的转录

使用 Transformers 进行音乐转录的想法也被研究过。Awiszus 在 2019 年探索了音乐转录的几种公式作为序列到序列的问题,使用 LSTM 和 Transformer 模型的各种输入和输出表示(包括类似于我们的表示)。然而,该论文未能展示明显的有效果,这似乎是由于在钢琴转录中使用了 framewise multi-F0 评估而不是基于音符的评估标准,使用相对时间偏移而不是绝对时间偏移(参见第 3.2 节),并在比我们使用的 MAESTRO 数据集小得多的 MAPS 数据集上进行训练。早些时候,Ullrich 和 van der Wel 似乎是第一个提出将音乐转录作为序列到序列问题的人(使用 LSTM 而不是 Transformer),但他们的系统只能处理单声道音乐。

3 模型

如上所述,我们的模型是一个通用的编码器-解码器 Transformer 架构,其中每个输入位置包含一个频谱图帧,每个输出位置都包含一个类 MIDI 词汇表事件。我们的模型、输入和输出如图 1 所示。

输入通过编码器自注意力层进行处理,从而产生与原始输入长度相同的嵌入层序列。然后,解码器层在解码器输出上使用 causally masked self-attention,在编码器的完整输出上使用 cross-attention。至关重要的是,这允许符号标记输出是可变长度的,仅取决于表述输入音频所需的标记数量。

3.1 模型架构

模型配置基于 T5 的“小型”模型,并按照 T5.1.1 的建议进行了修改。具体来说,我们的模型使用大小为 d m o d e l = 512 d_{model} = 512 dmodel=512 的嵌入层(embedding), d f f = 1024 d_{ff} = 1024 dff=1024 的前馈(feed-forward)输出维度, d k v = 64 d_{kv} = 64 dkv=64 的键/值维度,六头的注意力层(6-headed attention),编码器和解码器各有 8 层。

我们的模型与标准配置相比有一些细微的变化。为了使用连续的频谱图输入,我们添加了一个密集层来将每个频谱图输入帧投影到 Transformer 的输入嵌入层空间。 我们还使用固定的绝对位置嵌入层,而不是 T5 中使用的对数缩放的相对位置桶嵌入层,以确保所有位置都可以以相同的处理。最后,我们使用 float32 来获得更好的训练稳定性,因为我们的模型足够小,不需要使用大型 T5 模型中通常不太精确的 bfloat16 格式。

该模型是使用基于 Flax 和 JAX 构建的 T5X 框架实现的。 我们还使用 SeqIO 进行数据预处理和评估。 我们的实现代码将在 https://goo.gl/magenta/seq2seq-piano-transcription-code 上提供。

虽然最近使用 Transformers 的一些研究偏向于非常大的模型,例如具有 1750 亿参数的 GPT-3,但我们发现相对较小的模型足以完成这些任务。通过上述配置,我们的模型只有 5400 万参数,大约只有 Onsets and Frames 模型的两倍。

3.2 输入和输出

该模型使用频谱图帧作为输入,每个输入位置一帧。为了匹配 T5 设置,我们使用 EOS(序列结束)嵌入层来终止输入序列。每个步骤的模型输出是离散事件词汇表上的 softmax 分布。这个词汇表很大程度上受到了最初在 MIDI 规范中定义的消息的启发。使用事件作为输出表示而不是钢琴卷矩阵具有更加稀疏的优点,因为仅在事件发生时才需要输出,而不是需要对每一帧进行标注。词汇表包含以下标记类型:

音符(Note)【128 个值】:表示 128 个 MIDI 音高之一的音符开或音符关事件。我们使用完整的 MIDI 音高范围以获得灵活性,但对于这些实验,实际上只使用了与钢琴键对应的 88 个音高。

力度(Velocity)【128 个值】:表示要应用于所有后续 Note 事件的力度变化(直到下一个 Velocity 事件)。有 128 个包括零的力度值,零是一个特殊值,它表示后续 Note 事件被当成音符关事件。

时间(Time)【6000 个值】:表示段内的绝对时间位置,量化为 10 ms。此时间将适用于所有后续 Note 事件,直到下一个 Time 事件。时间事件必须按时间顺序发生。为了灵活性,我们将时间定义为最多 60 秒的词汇表,但由于每个段的时间都会重置,因此在实践中我们只使用这种类型的前几百个事件。

结束符(EOS)【1 个值】:表示序列的结束。

以前使用这种类 MIDI 的事件词汇表的工作使用事件之间的相对时间偏移,表示自上次时间偏移以来经过的时间量。然而,在序列到序列的场景中,输出早期的单个相对时移误差会导致所有后续输出步骤不正确,并且此类误差会随着序列长度的增加而累积。为了调整这种漂移,Transformer 模型必须学习对所有先前的时间偏移进行累积求和,以便及时确定当前位置。我们改为使用绝对时间,其中每个时间事件表示从段音符开始的时间量,如图 1 所示。这使模型更容易独立确定每个时间戳;我们还在第 4.4 节中对这种选择进行了实证研究,发现使用绝对时间偏移而不是相对偏移会产生更好的性能。

我们对时间事件使用 10 ms,因为一些实验发现这种偏移应该是人类感知的极限(尽管其他人报告了更小的值,例如在 Handel 中为 5 ms)。我们保留了通过更精细的事件进一步改进我们结果的可能性,例如Kong 等人通过预测连续的时间。

在推理过程中解码模型输出是使用简单的贪婪自回归算法完成的。我们在每一步选择最大概率事件,并将其作为该步骤的预测事件反馈到网络中。我们持续上述过程,直到模型预测出 EOS 事件为止。

使用事件序列作为我们的训练目标,而不是使用钢琴卷矩阵或其他基于帧的格式,可以实现显著的灵活性。例如,我们在第 4.4 节中演示了具有相同输入的完全相同的模型配置可以被训练为仅预测音符开始(仅使用 Note、Time 和 EOS 事件)或音符开始、音符结束和音符力度(使用上面的完整词汇表)。唯一需要做的改变是使用一组不同的标记作为训练目标。这与之前的工作形成对比,在之前的工作中,预测一个新特征需要添加新的输出头(或整个模块),为这些输出设计损失函数,并修改(通常是不可微分的)解码算法以将所有模型输出组合成最终的形式。

通过使用序列到序列的方法,我们的模型可以通过在完全可微的端到端训练设置中联合建模音频特征和类语言的输出依赖关系来直接输出我们想要的表示。添加新的输出特征或更改任务只需要更改用于表述目标输出的标记。

3.3 序列长度注意事项

Transformers 可以在每一层处理序列中的所有标记,这特别适用于需要关于每个事件的音高和时间的细粒度信息的转录任务。然而这种注意机制对于序列长度为 n 时的空间复杂度为 O ( n 2 ) O(n^2) O(n2)。导致大多数用于转录的音频序列无法放入内存中。为了解决这个问题,我们在训练和推理期间将音频序列及其相应的符号表述分成更小的片段。

在训练期间,我们对批次中的每个序列使用以下过程:

  1. 从完整序列中选择一个随机音频片段用于模型输入。所选片段的长度可以从单个输入帧到最大输入长度不等,起始位置从均匀随机分布中选择。
  2. 为与所选音频片段对应的训练目标选择符号片段。因为音符可能在一个片段中开始并在另一个片段中结束,所以该模型被训练为能够针对未观察到音符开事件的情况预测音符关事件。
  3. 计算选定音频的频谱图,并将符号序列映射到我们的词汇表中(参见第 3.2 节)。计算符号段内的绝对时间偏移,以使时间 0 是该段的开始。
  4. 提供连续的频谱图输入和独热编码(one-hot-encoded)的类 MIDI 事件作为 Transformer 架构的训练样本。

在推理期间,我们对批次中的每个序列使用以下过程:

  1. 尽可能使用最大输入长度将音频序列拆分为不重叠的片段,然后计算频谱图。
  2. 依次为每个段提供频谱图作为 Transformer 模型的输入,并通过在每个步骤中根据模型输出贪婪地选择最可能的标记来解码,直到预测出 EOS 标记。在超过音频段长度的时间偏移之后出现的任何标记都将被丢弃。
  3. 将所有片段中的解码事件连接成一个序列,我们会删除没有对应音符开的音符关事件。如果我们遇到一个已经开始的音高的音符开事件,我们结束它并开始一个新的。在序列结束时,我们会结束所有缺少音符关事件的活动音符。

如图 2 所示,该模型在预测相应事件位于不同片段中的音符开或音符关事件方面的能力令人惊讶。模型在第 4.2 节中对 Onset、Offset 和 Velocity F1 分数的结果也以经验展示了这种能力。

4 实验

我们使用 Adafactor 优化器训练我们的模型,批量大小为 256,学习率为 1e-3,并且子层输出和嵌入层输入的 dropout 设置为 0.1。选择批量大小是为了最大限度地提高训练吞吐量,因为我们在一开始的实验中尝试了其他批量大小似乎对最终性能没有影响。学习率和 dropout 值与 T5 用于微调任务的设置一样。

使用 Tensorflow tf.signal 库计算输入频谱图。 我们使用了 16,000 kHz 的音频采样率、2048 个样本的 FFT 长度和 128 个样本的跳频。 我们将输出缩放到 512 个 mel bins(以匹配模型的嵌入层大小)并使用对数缩放幅度。

输入序列限制在 512 个位置(511 个频谱图帧加上 EOS),输出限制在 1024 个位置(1023 个符号标记加上 EOS)。这对应于 4.088 秒的最大段长度。我们使用 512 个输入位置来匹配 T5 的序列长度,但未来可以探索其他序列长度是否会带来更好的性能。使用 1024 个输出位置是因为我们发现 512 个输出位置并不总是足以表述输入音频。

我们在 32 个 TPUv3 内核上训练了所有模型,每个内核的批量大小为 8。我们使用此配置来提高训练速度,但该模型足够小,可以在单个 TPUv2 实例(8 个内核)上进行训练。根据验证集的结果,过度拟合似乎不是问题,因此我们训练了 40 万步,这对于我们的基线模型大约需要 2.5 天。

4.1 数据集

为了评估我们的模型在钢琴转录任务中的表现,我们使用了 MAESTRO 数据集,该数据集包含大约 200 小时钢琴演奏家的演奏,并精确对齐音频和真实音符。为了与之前的转录工作进行比较,我们在 MAESTRO V1.0.0 上进行训练,但对于其他研究,我们使用 MAESTRO V3.0.0,因为它包含额外的 92 个表演, 26 小时的数据。MAESTRO V3.0.0 还包含延音和无弦踏板事件,尽管我们的模型(和评估)没有使用这些。我们也没有像 Kong 等人那样直接模拟延音踏板事件,而是在延音踏板被按下时延长音符持续时间,类似于 Hawthorne 等人的做法。

4.2 评估

在评估钢琴转录系统的性能时,我们使用 Note F1 分数度量:检测单个音符的调和平均值精度和召回率。这涉及根据音符开始时间、音高和可选的结束时间将每个预测音符与唯一的真实音符相匹配。此外,音符开始力度可用于丢弃具有截然不同音符力度的匹配。我们主要使用考虑了音符开始、音符结束和音符力度的 F1 分数。我们还包括了仅考虑音符开始或音符开始和音符结束 F1 分数的结果。我们遵循 mir_eval 库来精确定义我们使用的(标准)转录度量。

因为钢琴是一种打击乐器,与结束相比,准确识别音符开始通常更容易(并且在感知上也更重要)。我们使用 mir_eval 的默认匹配容差,即 50 毫秒的开始,以及 50 毫秒或音符持续时间的 20% 中的较大者作为结束。

4.3 对比以前的工作

我们将序列到序列方法与表 1 中 MAESTRO V1.0.0 上以前钢琴转录论文报告的分数进行了比较。与现有的最佳方法相比,我们的方法能够获得具有竞争力的 F1 分数,同时在概念上非常简单,使用通用架构和解码算法以及标准表示方法。

4.4 消融研究

我们使用表 1 中 MAESTRO V3.0.0 对我们模型的一些组件进行了消融研究。首先我们验证了这种架构的灵活性,可以使用一组不同的特征来表述输入音频。我们通过使用 Note、Time 和 EOS 事件来只预测音符开始。该模型成功训练并在这个修改后的仅预测音符开始的任务上获得了较高的 F1 分数。

接下来,我们研究不同的输入表示。对于“STFT”,我们在 FFT 计算后去除了对数梅尔(log mel)缩放比例。这导致输入帧大小为 1025,由密集层投影到大小为 512 的模型嵌入层。对于“原始样本”,我们只需根据用于频谱图的 hop width(128 个样本)将音频样本分割成多个片段,然后直接使用这些片段作为输入,再次通过密集层投影到嵌入层。这两种配置都能成功训练,但性能不如使用对数梅尔对输入进行缩放。我们怀疑这是因为梅尔缩放会产生有用的特征,否则模型将不得不使用其他信息来提取这些特征。

我们还通过训练具有相对时间偏移的模型来验证绝对时间偏移更适合这种架构。正如预期的那样,相对时间偏移的模型的表现不佳。此外,我们注意到验证集上基于音符的评估度量在训练期间变化很大,有时相邻验证步骤之间的 Onset F1 分数差异高达 15 点。我们觉得可能是因为当在一个序列中累积以确定度量计算所需的绝对时间时,相对时间偏移预测的微小变化会被放大;即相对时间偏移会导致生成的转录与音频不一致。

最后,我们研究了更大的模型大小是否会提高性能。我们根据 T5 的“基本”配置扩大了模型大小。具体来说,我们修改了以下超参数: d m o d e l = 768 d_{model} = 768 dmodel=768 d f f = 2048 d_{ff} = 2048 dff=2048,12 头的注意力层,编码器和解码器各有 12 层。这些变化导致模型有 2.13 亿个参数,而我们的“小型”配置只有 5400 万参数。这个模型很快就过拟合了训练数据集,验证集的分数在 10 万步后开始下降,所以我们在那个时候停止了训练。即使提前停止,该模型的性能也不如我们的“小型”配置,这清楚地表明即使钢琴转录是一项相当复杂的任务,它也不需要特别大的 Transformer 模型。

5 结论和后续工作

我们已经展示了经过训练的通用 Transformer 架构可以在没有预训练的情况下将频谱图映射到类 MIDI 的输出事件,可以在自动钢琴转录上实现最先进的性能。我们尽可能地使用标准格式和架构,并且能够达到与专为钢琴转录定制的模型相当的结果。我们设置中复杂性的主要来源是将样本拆分为多个片段;后续工作可能包括研究稀疏注意力机制,以便能够在单个编码和解码过程中转录整首音乐。同样值得探索的是使用蒸馏或相关技术使这样的模型能够在移动设备或网络上实时运行。

我们的结果表明,使用 Transformer 的通用序列到序列框架也可能对其他 MIR 任务有益,例如节拍跟踪(beat tracking)、基频估计(fundamental frequency estimation)、和弦估计(chord estimation)等。在自然语言处理领域已经看到,单个大型语言模型,例如 GPT-3 或 T5,已经能够通过利用任务之间的共性来解决多个任务。我们对 MIR 任务可能出现类似现象的可能性感到兴奋,我们希望这些结果指出通过专注于数据集创建和标记而不是自定义模型设计来创建新 MIR 模型的可能性。

最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱(Serocs),感兴趣的读者欢迎试用与分享,感谢您的支持!serocs.cn

你可能感兴趣的:(论文翻译,深度学习,音频转录,论文翻译,Transformer,Seq2Seq)