[论文阅读] MIR音乐信息检索3

1. SEQUENCE-TO-SEQUENCE PIANO TRANSCRIPTION WITH TRANSFORMERS

1.1. 摘要

利用大数据集训练的定制深度神经网络模型近年在AMT上取得了进展,但这些模型需要特别设计的网络架构、输入输出表达和复杂的解码体系。这项工作中作者展示了使用标准解码方法的通用编码器-解码器Transformer来达到相同的表现。对于几个转录(transcription)任务,该模型直接将频谱图翻译成类MIDI的输出事件。这个序列到序列的方法通过为音频特征和类语言的输出依赖共同建模,简化了转录,去掉了特定于任务的架构。

1.2. 引言

这篇论文考虑的是将钢琴音频转写为一些列指示准确开始/结束时间与力度的音符事件,而非对齐测量栅格?(metrical grid)的乐谱。
近来钢琴转录的进展主要得益于两个因素:数据集(如MAPS和MAESTRO)以及专用于钢琴转录的深度神经网络(如Onset and Frames架构分别建模了音符的开始和存续)。虽然专用模型在基准数据集上取得了改进,但尚不清楚这些方法能否用于其他领域和MIR任务(other domains and MIR tasks)。
这篇文章通过使用现成的组件(来自T5论文中、基本上未修改的编码器-解码器格局(configuration))和一个简单的贪心解码策略,训练了一个模型,编码原始频谱帧,并直接解码为一个音符序列,根据原始MIDI协议中的信息进行(inspired by messages in the original MIDI protocol)。因此将模型的输出称为类MIDI。
[注]: MIDI protocol相关参考文献:MIDI Manufacturers Association and others, “The complete midi 1.0 detailed specification,” Los Angeles, CA, The MIDI Manufacturers Association, 1996.

更进一步,展示了这种任务不可知(domain-agnostic)的方法允许在转录任务上训练几个变种(如只转写音符开始的),仅需通过改变训练标签而不用修改模型输入。

1.3. 相关工作

1.3.1. 钢琴转录

2012年Boulanger-Lewandowski等人训练了一个RNN转录模型用于输出二元钢琴卷帘。Böck和Schedl训练了一个类似的、基于RNN的模型,仅用于钢琴onsets。Hawthorne等人将基于卷积的模型stacks分别用于音符开始、音符存续和音符力度,改进了转录精度。模型使用了硬性优先(hard prior),要音符开始的预测概率高于0.5才会初始化?(initiate)一个音符,其输出被解码成离散的音符。

Kong等人通过回归预测连续的开始/结束时间,取得了更高的转录精度。Kim & Bello在转录输出上使用对抗损失(adversarial loss)来激励转录模型输出更合理的钢琴卷帘表示。本文的序列到序列方法通过自回归解码器明确地建模了这种输出间依赖关系,这是带着抽取有意义的音频特征的编码器一起端到端训练。
Kwon等人使用了各种语言模型建模各音高音符的状态转换,而不是各自独立的开始、帧和结束栈?(stacks)。然而这种解码过程十分复杂,特别是对于不同音高间交互的处理。类似地,Kelz等人使用整个音符状态的隐马尔可夫模型进行解码,基于ADSR包络线?(envelope)。
以一种彻底的特定领域(domain-specific)的方法,Elowsson构建了分级模型,从频谱图中抽取基频轮廓,并使用这些轮廓去推断音符的开始和结束。虽然对于许多应用来说,这种中间表达十分有用,如在Engel等人的工作中,但本文用的是端到端的,更简单,而评估也展示了它同样有效。

1.3.2. Transformers

近来,通用的Transformer架构已经在多个领域得到应用,来解决端到端问题,取代了过去一直使用的特定任务专用架构。除了在最先被提出的NLP领域,它还被用于计算机视觉任务,如目标检测,基于说明文字的图像生成(caption-based image generation),姿态重构(caption-based image generation),也有音频相关的任务,包括语音识别,语音合成和音频事件分类。
注意到许多上述对于Transformer的使用,都利用了预训练,指的是模型使用自监督在大量未标注的数据上进行训练。虽然这种预训练阶段对于音乐转录可能也有帮助,但这项工作中作者以普通的监督方式使用标注的转录从头训练Transformer架构,探索更简单的设置(setting)。

1.3.3. 序列到序列转录

使用Transformer做音乐转录早被考虑过,Awiszus在2019年就探索了几种音乐转录作为序列到序列问题的构想(formulation),使用各种各样的输入输出表达(包括一个类似本文的),既有LSTM也有Transformer模型。然而该论文未能证明取得了明显的成功,似乎是由于在钢琴转录中使用了逐帧的多F0评估而非基于音符的评估标准,使用了相对时间偏移而非绝对(见本文3.2节),并且在MAPS数据集上训练,其远小于本文用的MAESTRO数据集。更早些时候,Ullrich和van der Wel似乎是第一个将音乐转录充当为序列到序列问题的(使用LSTMs而非Transformers),但它们的系统只能处理单音音乐。

1.4. 模型

图1 该模型是一个通用的编码器-解码器架构,每个输入位置都包含一个频谱帧,每个输出位置都包含一个类MIDI词汇表中的事件?(event)。输出符号从解码器自动回归采样(autoregressively sampled),每个时间步都取最大可能的符号。

如前所述,该模型是一个通用的编码器-解码器Transformer架构,每个输入位置都包含一个频谱帧,每个输出位置都包含一个类MIDI词汇表中的事件。模型概述跟输入输出设置见图1
输入通过一堆编码器自注意力层进行处理,产生一个嵌入序列,其长度与原始输入相同。一堆解码器层使用解码器输出上的causally masked self-attention和完整编码器堆输出上的cross-attention。关键是,这允许符号输出长度可变,仅取决于描述输入音频所需的标记(token)数。

1.4.1. 模型架构

模型格局(model configuration)基于T5-small模型,根据 T5.1.1 recipe的建议做了修改。确切的说,这个模型的embedding大小为\(d_{model}=512\),前馈输出维度\(d_{ff}=1024\),键/值维度\(d_{kv}=64\),六头注意力,编码器解码器各有8层。
该模型跟标准的有些小改动,最重要的是为了使用连续频谱输入,增加一个dense层来将每个频谱输入投影为Transformer的输入嵌入空间。还使用了固定的绝对位置嵌入(positional embeddings),而非T5中使用的对数缩放相对位置桶嵌入(logarithmically scaled relative positional bucket embeddings),以此保证所有位置都可以同等分辨率地处理。最终使用float32激活得到更好的训练稳定性,因为模型足够小,不需要大型T5模型中用到的低精度bfloat16来提高内存效率。
该模型使用T5X框架实现,该框架由FLAX和JAX构建。使用SeqIO做数据预处理和评估。提供了实现的代码

[注] 根据知乎的一篇回答,JAX简单的说就是GPU加速、支持自动微分(autodiff)的numpy,而FLAX建立在JAX上,是一个实现神经网络的框架,对于在TPU上的训练很有用。

[注] 根据github的README,T5X是一个模块化、可组合、研究友好的框架,用于在多个尺度上对序列模型(从语言开始)进行高性能、可配置、自主训练(self-service training)、评估和推理。基本上是T5的新的、改进的实现。T5X在2021年11月才init commit,现在仍在开发中。

[注] 根据github的README,SeqIO是一个处理序列数据的库,这些数据将被喂入到下游的序列模型中。同样是google正在开发中的项目。

虽然近来Transformer的使用促成了许多大模型,如GPT-3有175B(billion)参数,但作者发现较小的模型就足以胜任这些任务,使用上述配置,模型仅有54M参数。

1.4.2. 输入和输出

模型以频谱帧作为输入,每个位置一帧。为了匹配T5的设置,使用可学习的EOS(序列结束)嵌入标志输入序列的结束。每步的模型输出是在离散事件词汇表(discrete vocabulary of events)的softmax分布。这个词汇表深受MIDI规范中最初定义的消息(message)启发。使用事件作为输出表达而不是钢琴卷帘矩阵,有更加稀疏的好处,因为只有事件发生的才需要输出,不用每帧都注释(annotate every frame)。该词汇表由一下列标志(token)类型组成。

  • 音符。128个值。指示128个MIDI音高之一的音符开始(note-on)或音符结束(note-off)事件。为了灵活使用了完整的MIDI音高范围,但这些实验中,仅有对应钢琴的88个键是有用的。
  • 力度。128个值。指示应用于所有后续音符事件的力度变化(直到下一个力度事件为止)。有包括0在内的128个值,0是个特殊值,使后续音符事件被解释为音符结束事件。
  • 时间。6000个值。指示片段中的绝对时间位置,量化为10ms的区间(bins)。这个时间也会应用到所有后续音符事件,直到下一个时间事件。该事件必须按时间顺序的出现。灵活起见,定义词汇表的时间最长可达60秒(所以才6000个值,每个代表10ms的区间),但每个片段都会重设时间,因此实际上该类型的事件只用到前几百个。
  • EOS。1个值。指示序列的结束。

[注] 该模型输出的格式是一个标记序列,其中事件按 <时间偏移>, <力度>, <音高> 的顺序出现,每个时间偏移指示了紧跟在它后面的其他非时间偏移事件产生的时间,这个偏移仅在段内有效,也就是说如果将音频切成 4.088 秒一段,那么按这里精度10ms,所需的最大时间偏移事件值就是409,所以才说远远用不了6000那么多个。

使用这种类MIDI事件词汇表的项目(work)使用事件之间的相对时间偏移,指示自上一个时间偏移后经过的时间。然而,在序列到序列场景中,一个相对时间偏移的错误会后续的输出步都不正确,这种错误还会随着序列长度增加而积累。为了调整这点,Transformer模型不得不学习对所有过去的时间偏移执行累加和,以便最终决定正确的时间(determine the current position in time)。本文使用的绝对时间偏移简化了模型的任务,只要独立地判断每个时间步就好了。
每个时间事件的时间解析度为10ms,因为一些实验证实,这种设置(displacement)几乎就是人类的知觉极限。作者留下了使用更精细事件解析度改进结果的可能性,例如像Kong他们那样预测连续的时间。
使用简单贪心自回归算法推断模型输出,每次选择当前时间步中最大可能的事件,再将其作为下一个时间步的输入喂回网络,持续进行该步骤直到模型输出EOS。

使用事件预测序列作为训练目标而非钢琴卷帘矩阵或其他基于帧的格式提供了很大的灵活性(又重复了一遍...)。例如,在4.4节中展示了完全相同的模型格局使用相同输入可以被训练于只预测onsets(只是用音符,事件和EOS事件)或onsets、offsets和力度(使用上述整个词汇表)。唯一需要改变的是使用不同的标记集合作为训练目标。这与之前的项目大为不同,它们预测新特征需要增加新的输出头(或整个模型stack),再为那些输出设计损失函数,并且修改(经常是不可微的)解码算法将模型输出转换为最终期望的表达。
通过使用序列到序列的方法,我们的模型通过联合建模音频特征和类语言的输出依赖可以直接输出期望的表达,并且是一种完全可微、端到端的训练设置。增加新输出特征或是改变任务定义都只需简单地改变用于描述目标输出的标志。

1.4.3. 序列长度考虑

Transformer每层都可以处理序列中的所有标志,这特别适合需要每个事件音高和事件的细粒度信息的转录任务。然而,注意力机制空间复杂度为\(O(n^2)\),n为序列长度。这种实际后果是大多数用于转录的音频序列无法放入内存。为了解决这个问题,在训练和推断时,作者将音频序列及其相应的符号描述拆分成更小的片段。
在训练过程中,对于批量中的每个序列使用下述步骤:

  1. 从完整的序列中随机挑选一个音频片段作为模型输入。该片段长度可以在单一输入帧到最大输入长度中变化,开始的位置根据均匀分布随机选择。
  2. 选择跟选中的音频片段对应的符号片段作为训练目标(training target)。由于音符可能会跨越两个片段,因此训练模型,能够在没有观测到音符开始事件的情况下预测音符结束事件。
  3. 为选中的音频计算频谱图,并将符号序列映射为词汇(vocabulary)。计算符号片段中的绝对时间偏移,这样时间0就是片段的开始。
  4. 提供连续频谱输入和独热编码的类MIDI事件作为Transformer的训练用例

在推断中,使用下述步骤:

  1. 可能的话,以最大输入长度将音频序列切分为不重叠的片段,然后计算频谱图
  2. 对于每个片段,依次将频谱图作为Transformer的输入,然后根据每步的模型输出贪心地选择最可能的标志来解码,直到EOS标志输出。任何标志发生在一段超过音频片段长度的时间偏移后都会被丢弃
  3. 将来自所有片段的解码事件拼接成一个单一序列,拼接后可能仍存在没有相应音符开始的音符结束事件,将其移除。如果遇到一个已经存在的音高的开始时间,就将其结束并开始一个新的。在序列的最后结束任何激活的、缺失音符结束事件的音符

图2 模型事件输出与ground truth的对比渲染所得钢琴卷帘的一部分,来自MAESTRO验证集中肖邦的降D大调摇篮曲Op.57。黑色垂线代表推断过程中片段的边界。模型成功预测了对应音符开始事件发生在另一个片段中的音符结束事件。

该模型出乎意料地能够预测对应事件在不同片段中的音符开始或结束事件,正如图2所示。该能力也被4.2节中模型在Onset、Offset和Velocity的F1分数从实践上证明。

1.5. 实验

模型使用Adafactor优化器(optimizer),批大小为256,学习率设置为常数1e-3,子层输出和嵌入输入的dropout都设置为0.1。批大小选择最大化训练吞吐量的,因为初次试验尝试的其他的批大小似乎在最终结果上都没有差异。学习率和dropout值与用于微调任务的T5保持一致。
输入频谱图用TensorFlow的tf.signal库计算,所用音频采样率为16,000kHz,FFT长度为2048个样本,一跳宽度(a hop width)为128个样本。将输出缩放到512个梅尔区间(mel bins)(以此匹配模型的嵌入尺寸),并且使用了对数级规模?(log-scaled magnitude)。
输入序列限制512个位置(511个频谱帧加上一个可学习的EOS嵌入),输出限制到1024个位置(1023个符号标记加上一个可学习的EOS嵌入)。这对应于最大段长度4.088秒。这里使用512个输入位置匹配T5的序列长度,但将来可能会探索是否其他序列长度效果更好。使用1024个输出位置是因为512个输出位置不能保证描述输入音频的符号足够。
在32个TPUv3核上训练所有模型,因此每个核的批大小为8。使用这种格局(configuration)是出于速度考虑,但该模型够小,可以在但一个TPUv2实例(8个核)上训练。基于验证集结果,似乎没有过拟合的问题,因此训练了40万步(progress for 400K steps),这在baseline模型上大约需要2.5天时间。

1.5.1. 数据集

使用MAESTRO数据集,其在音频和ground truth音符标注上实现了良好的对齐。对比先前的转录工作,我们在MAESTRO v1.0.0上训练,其他研究则使用MAESTRO v3.0.0,因为它包含额外的26小时的92段演奏数据,还有选择延音踏板和柔音踏板的事件,不过本模型没有充分利用这些。也没有像Kong等人那样直接建模延音踏板事件,而是类似Hawthorne等人,当延音踏板被踩下时延长音符持续时间。

1.5.2. 评估

使用音符F1分数指标(Note F1 score metric)来评估钢琴转录系统的表现:单个音符检测中准确度和召回率的调和平均值。这涉及到基于开始时间、音高和可选的结束时间,用唯一的ground truth匹配每个预测的音符。此外,起始力度(onset velocity)可以用于丢弃力度差异巨大的匹配。主要使用考虑了起始时刻、结束时刻和力度的F1分数。还包含了只考虑起始或起始跟结束时刻一起的F1分数。作者使用了mir_eval库来得到所用标准转录指标的准确定义。
钢琴是一种击弦乐器(percussive instrument),相比结束,它相对容易(知觉上也更重要)来准确地辨认音符开始。对于音符开始,我们使用mir_eval的默认匹配容忍度50ms,对于结束,使用大于50ms或音符时值的20%。

1.5.3. 与先前项目的对比

如表1所示,将本文的方法与基于MAESTRO v1.0.0数据集的先前钢琴转录对比,本方法取得了相当有竞争力的F1分数,而保持着相对简单的概念,使用通用的架构和解码算法以及标准表达。

1.5.4. 消融研究

表1 MAESTRO测试集的结果。与先前使用v1.0.0的项目对比,并且出于大尺寸比较了使用v3.0.0的不同模型格局。所有的Transformer模型都训练了400K步,除了Base格局,它只训练了100K步

[注] 总之上半部分使用v1.0.0的是不同模型的对比,下面使用v3.0.0的是本文这个模型进行的消融实验。

在表1中我们基于MAESTRO v3.0.0对本模型的一些组件进行了消融研究,首先(第二行)验证架构使用一套不同特征描述输入音频的灵活性。修改了符号数据,通过只使用音符、时间和EOS事件来仅描述onsets。该模型成功在这个经过修改、仅有onset的任务中取得了高F1分数。

接下来调查不同的输入表达,对于STFT(第三行),去掉了FFT计算之后进行的对数梅尔缩放,这使得输入帧大小为1025,通过dense层将其投影到512的模型嵌入大小。对于raw samples(第四行),我们简单地基于频谱图(128个样本)所用的跳宽(hop width)将音频样本切分成片段,然后直接将其作为输入,再次通过dense层投影到嵌入大小。这两个格局都训练得十分成功,但并不如对数梅尔输入表现得好。作者怀疑这是因为梅尔缩放产生了有用的特征,否则模型不得不花费一些容积(capacity,指额外分神去提取这些本该预处理能得到的信息?)来提取。
作者通过训练一个使用相对时间的模型(第五行)也验证了绝对时间偏移更适合这个架构。这个模型跟想象的一样,表现并不太好。更进一步说,作者注意到验证集上的基于音符的评估指标在训练过程中有巨大变化,有时在两个相邻的验证步中有高达15点的onset F1分数差距。作者猜想这是由于在遍历整个序列累加来就决定指标计算所需的绝对时间时,相对时间偏移预测中的小改变会被放大。例如,相对时间偏移导致随后的转录与音频产生漂移,变得不对齐。
最终,调查是否更大的模型会改进性能。作者基于T5的base格局放大了模型尺寸。详细来说,作者修改了下列超参数:\(d_{model}=768, d_{ff}=2048\),12头注意力,并且编码器解码器各有12层。这些改变使得模型参数达到213M,而“小”格局仅有54M。这个模型迅速对训练数据集过拟合,在验证集上的分数却在100K步之后下降,因此在那时停止了训练。即便提早停止(没有让其进一步过拟合),这模型还是没能像“小”格局那样好,清晰表明了尽管钢琴转录是一个相对复杂的任务,也不需要特别大的Transformer。

1.6. 结论与将来的工作

该论文已经展示了无需预训练,使用通用的Transformer架构将频谱图映射为类MIDI的输出事件,并且在AMT方面取得了当前最优的表现。作者尽可能多地使用标准的格式和架构,且能够取得跟那些专为钢琴转录定制的模型一样的效果。可能在体系?(setup)中复杂度的主要来源是将实例(example)切分为片段。将来的工作可能包括对稀疏注意力机制(sparse attention mechanisms)的研究,以便通过一遍编码解码就转录整首音乐。另一个值得探索的是知识蒸馏(distillation[39],G. Hinton, O. Vinyals, and J. Dean, “Distilling the knowledge in a neural network,” arXiv preprint arXiv:1503.02531, 2015. )或相关技术的使用,可以使这类模型在移动设备或web上实时运行。
该结果表明使用Transformer的通用序列到序列框架或许对于其他MIR任务也有用,如节拍跟踪(beat tracking),基频估计,和弦估计等等。NLP领域已经见证了单一大型语言模型,如GPT-3或T5,通过利用任务间的关系能够同时处理多任务。作者表示对该现象发生在MIR领域的可能性感到振奋,希望这些结果指向创造新MIR模型的可能性,通过聚焦于数据集创建和标注而非特定的模型设计。

附录B

表3 该模型格局基于T5-small,按T5.1.1方案进行了修改

[注]: 即用了T5的1.1版本,本质上跟T5一个模型,只是一些参数、设置有差别

2. 测评

!!经roblaw指出,本测评并不科学,musescore这类软件可以正确显示音高,但对于谱面的排版等还有不少不足,下面的内容权当一乐,有缘看到这篇文章的各位可自行部署、尝试(虽然现在肯定也有更好更优秀的模型了吧)

这里以放課後ティータイム - NO, Thank You!前奏的铃声部分,乐谱如图1所示

图1 NO, Thank You!铃声部分

并根据该谱合成了wav音频作为输入

2.1. Scorpiano

该项目来自论文Scorpiano – A System for Automatic Music Transcription for Monophonic Piano Music
完全依靠数字信号处理,不依靠神经网络、用Music21提供多种输出、有GUI界面、迅速小巧。
但是该项目只能处理单音音乐,无法识别和弦、速度不对、同一段音乐会被处理成分别两个谱表、速度较快的地方识别精度低、缺失连音线、缺失休止符、拍号依赖手动输入、有超出演奏范围的音出现、不同输出格式谱子不一样,效果一般。

图2 Scorpiano的处理结果

可以看到几乎就最开始的3个B5对了,考虑到它只能处理单音音乐,修改了原谱,只保留和弦的根音,但识别结果仍然不太好。

2.2. ByteDance

来自本文章介绍的第一篇论文High-resolution Piano Transcription with Pedals by Regressing Onset and Offset Times

图3 ByteDance的处理结果

跟Scorpiano一样,识别出了两个谱表,谱子看起来很累,但听起来确实有模有样,速度对了,拍号错误,可能是一开始的休止符没识别出来导致的?

图4 ByteDance的处理结果

图4是对于去掉和弦版本的识别结果,拍号还是错的,谱子更加让人眼花缭乱,竟然自己识别出了和弦,可能是音质的问题?
虽然听着更准确,但这种谱面也很难受啊。

2.3. VOCANO

来自github https://github.com/B05901022/VOCANO,根据README.md,这是Omnizart项目的一部分,上一篇阅读笔记也提过Omnizart。
这是人声多音音乐的音符转录框架,或许是由于这个原因,转录非人声的本前奏结果十分糟糕

图5 VOCANO的处理结果

几乎只有速度是对的,前面甚至有三个C-1音,十分离谱,后面只有寥寥几个音比较接近,怀疑中间复杂一点的识别不出来直接都当做了休止。
不过看它给出的demo,转录结果能认出旋律。没给原谱也不太好比较,但谱面仍旧很糟糕
值得一提的是它依赖的NVIDIA/apex库不能直接用pip安装,会是另一个不相关的库,应直接clone其github仓库,然后进入其目录执行pip install -v --no-cache-dir . (windows10)

2.4. Omnizart

来自论文Omnizart A General Toolbox for Automatic Music Transcription,使用pip直接安装
跟VOCANO不同,使用指令omnizart music transcribe ".\No,Thank_You.wav",VOCANO可能是其中负责vocal的部分。

图6 Omnizart的处理结果

结果类似ByteDance的,速度正确,也是两个谱表,旋律大体一样,但相较ByteDance其谱面更为杂乱,特别是不在截图中的后半段,有许多多余的休止符。而且对去和弦版本的处理结果仍然保留两个谱表,而且谱子似乎更杂乱,不过这可能是训练数据的差别导致的。

2.5. MT3

来自论文MT3 MULTI-TASK MULTITRACK MUSIC TRANSCRIPTION,google magenta团队研发,提供colab地址,使用很方便。
选用其中MT3模型,效果如下所示

图7 MT3的处理结果

跟ByteDance的差不多,但整体谱面更干净,用的是Transformer,不过代码有点难懂,似乎不太支持自己训练。

2.6. RSE

来自论文Residual Shuffle-Exchange Network for Fast Processing of Long Sequences,据论文所说这个残差混洗交换网络是对神经混洗交换网络的简化,复杂度同样是\(O(nlogn)\),比注意力机制(似乎就是Transformer用的)的复杂度\(O(n^2)\)更好,而Transformer又说比传统的CNN和RNN好,字节跳动他们用的就是CRNN,且自称state-of-the-art...
总之RSE这个看起来似乎很棒,但没有提供现成的checkpoints,需要自己训练,故没有测试。

posted @ 2022-04-22 14:07  NoNoe  阅读(497)  评论(3编辑  收藏  举报