深度学习革新音乐转录
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。
我是Srlua小谢,在这里我会分享我的知识和经验。🎥
希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮
记得先点赞👍后阅读哦~ 👏👏
📘📚 所属专栏:传知代码论文复现
欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙
目录
MT3模型:多任务多轨音乐转录的突破
Transformer模型:简化钢琴音乐转录
关键技术与创新点
Transformer模型的创新:自注意力机制、简化的模型设计
MT3模型和Transformer模型在音乐转录领域的贡献
部署过程
参考文献
本文所有资源均可在该地址处获取。
自动音乐转录(AMT)作为音乐信息检索(MIR)的一个重要分支,其目标是将音频信号转换成可读的乐谱形式,这在音乐分析、教育、制作等多个领域都有着广泛的应用。AMT的发展历程可以划分为两个主要阶段:早期基于规则的方法和现代基于深度学习的技术。
在早期阶段,研究者依赖于手工设计的特征提取方法,例如尺度不变特征变换(SIFT)和加速稳健特征(SURF)算法。这些方法虽然在特定应用上取得了成功,但它们的普适性和可扩展性受限,通常需要专业知识来定制特征提取器。这些传统方法往往需要专家对音乐信号进行深入分析,以手动定义特征提取规则和音高估计算法,这不仅耗时耗力,而且难以适应音乐的多样性和复杂性。
随着深度学习技术的兴起,计算机视觉领域迎来了革命性的变化,这一变革同样波及到了音乐转录领域。卷积神经网络(CNNs)的出现,使得计算机能够自动从图像中学习特征表示,极大地推动了图像分类、目标检测和图像分割等任务的发展。在音乐转录领域,深度学习技术的应用同样取得了显著的进展。自2012年AlexNet在ImageNet竞赛中取得历史性胜利后,CNNs便成为了计算机视觉领域的核心技术,而在AMT中,深度学习模型也逐渐展现出其强大的能力。
深度学习在音乐转录中的重要性体现在其能够自动学习从简单到复杂的音乐特征。这使得AMT系统在多种音乐任务上都取得了显著的成功。为了进一步提升性能,研究者们不断改进深度学习模型的设计,引入了批量归一化、残差连接和深度可分离卷积等创新技术,这些技术提高了网络的训练效率,并使得构建更深、更宽的网络成为可能。
尽管CNNs在多个视觉任务上表现出色,但它们的局限性也逐渐显现,尤其是在处理图像中长距离依赖关系时。为了解决这一问题,研究者们开始探索注意力机制,该机制最初在自然语言处理领域取得了巨大成功。Transformer模型通过自注意力机制处理序列数据,能够捕捉长距离依赖关系。这一机制的引入,使得AMT模型能够更加灵活地处理音乐中的结构关系,Vision Transformer(ViT)便是基于这一思想的代表模型。
MLP-Mixer模型的提出为音乐转录领域带来了新的思考。这是一种完全基于多层感知器(MLPs)的架构,它不依赖于卷积或自注意力机制。MLP-Mixer通过独立地在音乐片段上应用MLPs来进行特征和结构信息的混合,简化了模型结构,同时保持了对音乐特征的有效捕捉。MLP-Mixer的提出不仅挑战了CNNs和Transformers在音乐任务中的主导地位,而且展示了一种全新的视角,即通过基本的矩阵运算和非线性激活函数实现强大的音乐表征。
MT3模型:多任务多轨音乐转录的突破
音乐转录领域面临的一个主要挑战是如何处理多种乐器的同时演奏,这要求模型不仅要识别出不同的音符,还要区分它们是由哪种乐器发出的。MT3模型正是为了应对这一挑战而设计的,它通过多任务学习的方法,实现了对多种乐器声音的同时转录。
MT3模型的核心概念与架构
MT3能够从原始音频光谱图中转录任意数量的仪器。这里显示的是真正的4秒音频剪辑,从模型的标记输出重建钢琴卷,和相应的乐器标签(额外的 Slakh2100乐器省略了由于空间)。注意,在某些情况下,从单声乐器(如单簧管或圆号)预测的多个音符反映了包含该乐器的多个演奏者的合奏
MT3模型的核心概念是将音乐转录任务视为一个序列到序列的问题,其中输入是音频的频谱图,输出是一系列表示音符和乐器的标记。这种处理方式使得MT3能够处理多轨音乐,即同时对多个乐器的声音进行转录。MT3模型采用了Transformer架构,这是一种基于自注意力机制的深度学习模型,它能够处理长距离依赖关系,并在多种序列建模任务中表现出色。
MT3模型的架构包括一个编码器-解码器结构,其中编码器负责处理输入的音频频谱图,而解码器则生成表示音乐的序列输出。模型使用了一种紧凑且灵活的标记化方案,将模型输出的标记转换为多轨MIDI文件,这使得MT3能够支持不同组合的乐器数据集。
多任务学习在音乐转录中的应用
标记化/去标记化,MIDI 数据(左边,在这里表示为多音轨“ pianoroll”)可以标记为用于训练的类似 MIDI 的目标标记(右边)。可以确定地将使用相同词汇表的输出标记解码回 MIDI 数据。
多任务学习是MT3模型的另一个关键特点。在传统的单任务学习中,模型通常被训练来完成一个特定的任务。然而,在多任务学习中,模型被同时训练来完成多个任务,这有助于提高模型的泛化能力,并允许它在低资源的情况下也能表现良好。MT3模型通过联合训练多个数据集,能够同时学习到不同乐器的特征,从而在转录过程中更准确地识别和区分它们。
统一训练框架的优势
MT3模型的统一训练框架提供了几个显著的优势。它允许使用来自不同数据集的数据进行训练,这增加了模型训练时可以使用的数据量和多样性。统一框架简化了模型的训练和评估过程,因为所有的数据集都使用相同的评估指标和测试集分割。这种方法还有助于提高模型对低资源乐器的转录性能,因为它通过从高资源乐器中转移知识来增强对低资源乐器的识别能力。MT3模型的这些特点使其在多任务多轨音乐转录方面取得了突破性的进展。它不仅能够处理多种乐器的声音,还能够在低资源乐器上实现高质量的转录,这对于音乐研究和教育等领域具有重要的意义。随着深度学习技术的不断进步,MT3模型有望在未来的音乐转录任务中发挥更大的作用。
Transformer模型:简化钢琴音乐转录
序列到序列方法的原理
序列到序列(Seq2Seq)方法是机器学习中的一种重要框架,广泛应用于各种需要处理输入和输出序列的任务中。最初应用于机器翻译任务,该方法已经在多个领域取得了显著成果,包括文本生成、语音识别和音乐转录等。
在序列到序列框架中,模型由两个主要部分组成:编码器(Encoder)和解码器(Decoder)。编码器负责读取和理解输入序列,将其转换为一个固定长度的上下文向量(context vector),这个向量捕捉了输入序列中的重要信息。解码器则利用这个上下文向量生成输出序列,通过逐步预测下一个输出元素来完成任务。
传统的序列到序列模型通常采用递归神经网络(RNN)或长短期记忆网络(LSTM)作为其基本架构。这些网络通过其循环结构来捕捉序列中的时间依赖关系。然而,RNN和LSTM在处理长序列时存在一些固有的局限性,比如梯度消失和计算效率低下的问题。
Transformer模型的出现解决了这些问题。Transformer通过自注意力机制(self-attention mechanism)和并行计算,显著提高了序列到序列任务的性能和效率。自注意力机制允许模型在处理每个输入元素时都能访问整个输入序列,从而更好地捕捉全局依赖关系。此外,Transformer的架构中没有循环结构,完全依赖于注意力机制和前馈神经网络,这使得它在处理长序列时更加高效。
- Transformer模型在音乐转录中的创新应用
音乐转录,尤其是钢琴音乐转录,是一个复杂的任务,需要将音频信号转换为符号表示(如MIDI事件)。这不仅要求模型能够准确地识别音符的开始和结束,还要捕捉音符的力度、时间和其他细节。传统的音乐转录方法往往依赖于专门设计的特征提取器和复杂的后处理步骤,而Transformer模型提供了一种更简洁和高效的解决方案。
在论文《Sequence-to-Sequence Piano Transcription with Transformers》中,作者提出了一种使用Transformer模型进行钢琴转录的方法。该模型采用了标准的编码器-解码器Transformer架构,没有任何特定领域的调整或优化,这一设计选择展示了Transformer模型的通用性和强大能力。
具体来说,模型输入是音频的频谱图帧,这些帧表示了音频信号在不同时间点上的频率分布。通过频谱图,模型能够捕捉到音频中的时间和频率信息,这对识别音符非常关键。编码器将这些频谱图帧转换为高维特征表示,这些表示包含了输入音频的所有关键信息。解码器则基于这些特征表示生成音符事件序列,包括音符的开始和结束、力度以及时间。
这种方法的一个显著优势是它简化了整个转录过程。传统方法通常需要复杂的特征提取步骤,如频谱图处理、音高估计和音符事件检测等。而Transformer模型通过其强大的表征能力,可以直接从原始频谱图中学习这些特征,大大减少了手工特征提取和调试的工作量。
- 模型的编码器-解码器结构及其作用
Transformer模型的编码器-解码器结构是其成功的核心。该结构由多个编码器和解码器层堆叠而成,每一层都包含了自注意力机制和前馈神经网络。
编码器
编码器由若干相同的层堆叠组成,每层包括一个多头自注意力机制和一个前馈神经网络。多头自注意力机制允许模型在不同的表示空间中计算注意力权重,从而更好地捕捉输入序列中的复杂依赖关系。前馈神经网络则对注意力机制的输出进行进一步的非线性变换和处理。
在音乐转录任务中,编码器的作用是将输入的频谱图帧转换为高维特征表示。频谱图帧中的每个时间步都与一个特征向量对应,这些特征向量通过多层编码器的处理,逐渐融合了整个输入序列的信息,形成了对音频信号的全局理解。
解码器
解码器也由若干相同的层堆叠组成,每层包含一个多头自注意力机制、一个编码器-解码器注意力机制和一个前馈神经网络。自注意力机制用于解码器自身的序列建模,而编码器-解码器注意力机制则允许解码器在生成每个输出标记时,参考编码器的输出。
在音乐转录任务中,解码器的作用是基于编码器生成的特征表示,逐步生成音符事件序列。解码器在每一步生成一个音符事件,这些事件包括音符的开始和结束、力度和时间等信息。通过这种方式,解码器可以在生成过程中利用整个输入序列的信息,从而提高转录的准确性和连贯性。
这种编码器-解码器结构的一个重要特点是其并行计算能力。与传统的RNN和LSTM不同,Transformer中的注意力机制允许模型在处理每个输入元素时同时考虑所有其他元素,这极大地提高了计算效率,尤其是在处理长序列时。此外,Transformer的层次化结构使得模型可以更好地捕捉输入序列中的层次化特征,从而增强了模型的表达能力。
关键技术与创新点
- MT3模型的技术亮点:多任务学习、数据集整合、评估标准统一
多任务学习
多任务学习(Multi-Task Learning, MTL)是MT3模型中的一个关键技术亮点。传统的机器学习模型通常是为单一任务设计的,但在实际应用中,许多任务之间存在相互关联和依赖关系。多任务学习旨在通过同时训练多个相关任务,利用这些任务之间的共享信息来提高模型的泛化能力和性能。
在MT3模型中,多任务学习被应用于音乐转录任务中。音乐转录不仅包括识别音符的开始和结束,还包括识别音符的力度、持续时间和音高等多种信息。通过将这些相关任务整合在一个模型中,MT3能够在不同任务之间共享特征表示,从而更准确地捕捉音频信号中的细节信息。这种方法有几个主要优势:
- 共享信息和资源:多任务学习允许模型在多个任务之间共享底层特征表示,从而提高数据的利用效率。这种共享可以减少过拟合风险,提高模型的泛化能力。
- 互相增强:相关任务之间的信息共享可以互相增强。例如,在音乐转录任务中,识别音符的音高信息可以帮助模型更好地确定音符的开始和结束时间,反之亦然。
- 高效训练:多任务学习可以在一次训练过程中同时优化多个任务的目标函数,从而减少训练时间和计算资源的消耗。
数据集整合
数据集整合是MT3模型的另一个重要技术亮点。在实际应用中,获取大规模高质量的标注数据通常是一个巨大的挑战。不同的数据集可能包含不同的标注标准和格式,这给模型训练带来了额外的复杂性。MT3通过整合多个不同来源的数据集,并对其进行统一处理和标准化,解决了这一问题。
数据集整合涉及以下几个步骤:
- 数据收集:收集来自不同来源的数据集,包括公开数据集和自有数据集。这些数据集可能包含不同类型的音乐,具有不同的标注格式。
- 数据清洗和预处理:对收集到的数据进行清洗和预处理,包括去除噪声数据、填补缺失数据和标准化标注格式。这一步骤确保了数据的一致性和高质量。
- 统一标注标准:将不同数据集的标注标准进行统一,创建一个通用的标注格式。这一步骤使得模型可以在不同的数据集上进行一致的训练和评估。
通过数据集整合,MT3模型能够利用更大规模和更多样化的数据进行训练,从而提高模型的鲁棒性和泛化能力。同时,统一的标注标准也简化了模型的训练和评估过程,减少了由于数据集不一致带来的误差。
评估标准统一
评估标准的统一是确保模型性能和结果可比性的关键。不同的研究和应用通常采用不同的评估标准,这使得直接比较不同模型的性能变得困难。MT3通过引入统一的评估标准,解决了这一问题。
在音乐转录任务中,常用的评估标准包括准确率、召回率、F1分数等。这些指标分别衡量了模型在正确识别音符、未漏掉音符以及整体性能方面的表现。MT3模型采用统一的评估标准,对不同任务和不同数据集上的性能进行评估。这种方法有助于:
- 确保可比性:统一的评估标准使得不同模型的性能结果具有可比性,研究人员可以更准确地比较和评估不同方法的优劣。
- 提高透明度:统一标准增加了研究的透明度,使得研究结果更易于理解和复现。
- 促进进步:通过一致的评估标准,研究人员可以更加专注于模型本身的改进和优化,而不必担心由于评估标准不同带来的不确定性。
从 Slakh2100数据集的混合中15秒钟的 MT3转录摘录。黑线表示模型输入框架。蓝色音符表示“真正的积极”音符与正确的预测发病,偏移,音高和乐器。在这个片段中,模型实现了0.665的起始偏移 F1。
Transformer模型的创新:自注意力机制、简化的模型设计
自注意力机制
自注意力机制(Self-Attention Mechanism)是Transformer模型的核心创新之一。传统的序列模型如RNN和LSTM在处理长序列时存在诸多问题,如梯度消失和计算效率低下。自注意力机制通过允许模型在处理每个输入元素时,同时关注整个输入序列,从而解决了这些问题。
自注意力机制的工作原理如下:
模型是一个通用的编码器-解码器转换器架构,其中每个输入位置包含一个单一的谱图帧,每个输出位置包含来自我们的 MIDI 类词汇表的事件。输出令牌是从解码器自动回归采样,在每一个步骤采取最大概率的令牌
- 输入表示:每个输入元素被转换为一个向量表示,这些向量通过嵌入层生成。
- 注意力权重计算:对于每个输入向量,模型计算它与其他输入向量之间的注意力权重。这个权重反映了一个输入元素对另一个输入元素的重要性。
- 加权求和:每个输入向量通过与其他输入向量的注意力权重进行加权求和,生成一个新的向量表示。这个新向量综合了整个序列的信息。
自注意力机制有以下几个主要优点:
- 并行计算:与传统的RNN不同,自注意力机制允许并行计算,从而大大提高了计算效率。
- 捕捉全局依赖关系:自注意力机制能够捕捉输入序列中的全局依赖关系,而不仅仅是局部信息,这对于处理长序列特别重要。
- 可解释性:注意力权重提供了一种自然的方式来解释模型的决策过程,研究人员可以通过分析注意力权重来理解模型的行为。
- 简化的模型设计
Transformer模型的另一个重要创新在于其简化的模型设计。传统的序列模型如RNN和LSTM需要复杂的循环结构,而Transformer完全依赖于注意力机制和前馈神经网络,从而大大简化了模型结构。
Transformer模型的简化设计体现在以下几个方面:
- 无循环结构:Transformer模型完全摒弃了循环结构,取而代之的是多头自注意力机制和前馈神经网络。这种设计不仅提高了计算效率,还简化了模型的训练过程。
- 层次化结构:Transformer由多个相同的编码器和解码器层堆叠而成,每一层都包含了自注意力机制和前馈神经网络。这样的层次化结构使得模型可以更好地捕捉输入序列中的层次化特征。
- 模块化设计:Transformer的设计高度模块化,每个编码器和解码器层都是独立的模块,这使得模型的扩展和修改更加方便。
在肖邦的降 D 大调贝尔修斯作品57中,模型事件输出的钢琴滚动渲染部分,来自 MAESTROvalidationset 与地面真相的对比。黑色垂直线表示推理过程中的片段边界。真阳性(TP)帧标记为蓝色,假阴性(FN)标记为绿色,假阳性(FP)标记为红色。注意,该模型成功地预测了注释事件,其中注释事件发生在不同的片段中
这种简化的模型设计不仅使得Transformer在处理长序列任务时表现出色,还大大提高了模型的通用性和适应性。通过结合自注意力机制和简化的模型设计,Transformer模型在各种序列到序列任务中展示了强大的性能和灵活性。
MT3模型和Transformer模型在音乐转录领域的贡献
MT3模型和Transformer模型在音乐转录领域的贡献不可忽视。这些模型不仅在技术层面上带来了显著的创新,也在实际应用中展示了强大的潜力和广泛的适用性。
MT3模型的贡献
-
多任务学习:MT3模型通过多任务学习,成功将多个相关任务集成到一个模型中进行训练。这种方法不仅提高了数据的利用效率,还增强了模型的泛化能力。在音乐转录任务中,MT3模型能够同时处理音符的开始和结束、力度、持续时间和音高等信息,大大提高了转录的准确性和细节捕捉能力。
-
数据集整合:MT3模型通过整合多个数据集,并对其进行统一处理和标准化,解决了不同数据集之间的不一致性问题。这种方法使得模型能够利用更大规模和更多样化的数据进行训练,提高了模型的鲁棒性和适应性。
-
评估标准统一:MT3模型采用统一的评估标准,对不同任务和数据集上的性能进行评估。这种方法确保了模型性能结果的可比性和研究的透明度,有助于推动领域内的进一步研究和改进。
Transformer模型的贡献
-
自注意力机制:Transformer模型通过引入自注意力机制,解决了传统序列模型在处理长序列时的诸多问题。自注意力机制允许模型在处理每个输入元素时同时关注整个输入序列,从而捕捉到全局依赖关系,提高了模型的表现和效率。
-
简化的模型设计:Transformer模型摒弃了复杂的循环结构,完全依赖于注意力机制和前馈神经网络。这种简化的设计不仅提高了计算效率,还简化了模型的训练和扩展过程,使得Transformer在各种序列到序列任务中都表现出色。
-
通用性和适应性:Transformer模型的高度模块化和层次化结构,使得其具有很强的通用性和适应性。无论是在音乐转录、自然语言处理,还是其他序列到序列任务中,Transformer都展示了其强大的能力和灵活性。
部署过程
- 环境配置
-
安装依赖库
我们需要安装必要的Python库。这包括TensorFlow或PyTorch(根据您的模型实现),以及其他一些常用的库如NumPy和Matplotlib等。注意,某些库可能需要通过特定的Git仓库安装
提示
- `flax`: `pip install flax @ git+https://github.com/google/flax#egg=flax`
note-seq
:pip install note-seq @ git+https://github.com/magenta/note-seq#egg=note_seq
seqio
:pip install seqio @ git+https://github.com/google/seqio#egg=seqio
t5x
:pip install t5x @ git+https://github.com/google-research/t5x#egg=t5x
- 克隆代码库
如果还未克隆代码库,使用以下Git命令:
git clone https://github.com/magenta/mt3.git
cd mt3
3.设置环境
根据setup.py
,可能需要将项目目录添加到PYTHONPATH
。这可以通过修改.bashrc
或.zshrc
文件来实现,使用preprocessors.py
中定义的函数来预处理数据。例如,音频文件可能需要转换为模型训练所需的格式:
export PYTHONPATH="/path/to/mt3:$PYTHONPATH"
提示
替换/path/to/mt3
为你的MT3项目的实际路径。
# 假设samples是你的音频样本数据
samples = ...
spectrogram_config = spectrograms.SpectrogramConfig()
frames, frame_times = _audio_to_frames(samples, spectrogram_config)
# 将音频转换为模型可以理解的标记
# 需要提供序列化的音乐序列数据sequence和codec
sequence = ...
codec = event_codec.Codec()
tokenized = tokenize_transcription_example(
...,
spectrogram_config=spectrogram_config,
codec=codec,
...
)
-
定义Transformer模型
这里是一个简化的Transformer模型定义,用于音乐转录任务。class TransformerModel(tf.keras.Model): def __init__(self, num_layers, d_model, num_heads, dff, input_vocab_size, target_vocab_size, pe_input, pe_target): super(TransformerModel, self).__init__() self.tokenizer = tf.keras.layers.TextVectorization(max_tokens=input_vocab_size) self.encoder = Encoder(num_layers, d_model, num_heads, dff, input_vocab_size, pe_input) self.decoder = Decoder(num_layers, d_model, num_heads, dff, target_vocab_size, pe_target) self.final_layer = tf.keras.layers.Dense(target_vocab_size) def call(self, inp, tar): enc_output = self.encoder(inp) dec_output, _ = self.decoder(tar, enc_output) final_output = self.final_layer(dec_output) return final_output # 定义模型参数 num_layers = 4 d_model = 128 num_heads = 8 dff = 512 input_vocab_size = 8000 target_vocab_size = 8000 pe_input = 10000 pe_target = 10000 # 初始化模型 transformer = TransformerModel(num_layers, d_model, num_heads, dff, input_vocab_size, target_vocab_size, pe_input, pe_target)
-
定义和训练模型
使用
tasks.py
来定义任务并使用train.py
训练模型。这通常涉及到设置数据源、输出特征、预处理器链、后处理器函数和度量函数。复制from tasks import add_transcription_task_to_registry # 添加转录任务到seqio.TaskRegistry add_transcription_task_to_registry( dataset_config=..., spectrogram_config=SPECTROGRAM_CONFIG, vocab_config=VOCAB_CONFIG_FULL, tokenize_fn=..., onsets_only=False, include_ties=False, skip_too_long=False )
-
保存和加载模型
训练过程中,使用checkpoint.py保存模型的检查点,并在需要时加载它们。
from checkpoint import save_checkpoint, load_checkpoint
# 保存模型检查点
save_checkpoint(workdir, model_params, step)
# 加载模型检查点
model_params = load_checkpoint(workdir)
- 评估模型
使用metrics_utils.py中的函数来评估模型性能。
from metrics_utils import event_predictions_to_ns
# 将预测结果转换为NoteSequence
predictions = ...
codec = ...
encoding_spec = ...
result = event_predictions_to_ns(predictions, codec, encoding_spec)
- 模型部署
将训练好的模型保存并部署到生产环境中。您可以使用TensorFlow Serving或其他模型部署工具。
transformer.save('path/to/save/transformer_model')
# 使用TensorFlow Serving部署模型
# 请参考TensorFlow Serving文档进行详细配置和部署
#创建一个Web服务。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/transcribe', methods=['POST'])
def transcribe():
# 处理请求,进行模型预测
# ...
return jsonify(result)
if __name__ == '__main__':
app.run(debug=True)
9.应用
使用开源作曲软件 MuseScore 来打开下载的 mid 文件。即可查看乐谱使用的乐器
demo部署指南
- 安装依赖和工具
需要更新apt-get并安装一些基础的库和工具,例如libfluidsynth3、build-essential、libasound2-dev和libjack-dev。接下来,安装MT3模型和相关的Python库,如jax[cuda12_local]、nest-asyncio和pyfluidsynth。
!apt-get update -qq && apt-get install -qq libfluidsynth3 build-essential libasound2-dev libjack-dev
# 安装MT3和相关依赖
!git clone --branch=main https://github.com/magenta/mt3
!mv mt3 mt3_tmp; mv mt3_tmp/* .; rm -r mt3_tmp
!python3 -m pip install jax[cuda12_local] nest-asyncio pyfluidsynth==1.3.0 -e . -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
- 准备数据
下载模型的checkpoints和soundfont文件,这些是模型进行推断所必需的。
# 复制checkpoints
!gsutil -q -m cp -r gs://mt3/checkpoints .
# 复制soundfont
!gsutil -q -m cp gs://magentadata/soundfonts/SGM-v2.01-Sal-Guit-Bass-V1.3.sf2 .
- 导入和定义
导入必要的Python库和模块,并设置一些基本参数,例如采样率和soundfont路径。
# 导入和定义在代码的第二块单元格中给出
# 导入库如numpy, tensorflow, gin, jax等
# 定义SAMPLE_RATE和SF2_PATH等变量
- 上传音频
定义一个函数upload_audio
,允许用户上传音频文件,并将其转换为模型可以处理的样本数据。
# 定义upload_audio函数
def upload_audio(sample_rate):
# 实现音频上传和转换逻辑
pass
- 初始化模型
创建InferenceModel
类的实例,这个类负责加载模型、进行预测以及将预测结果转换为音符序列。
# 初始化模型实例
inference_model = InferenceModel(checkpoint_path, MODEL)
- 音乐转录
使用上传的音频和初始化的模型进行音乐转录。模型将音频转换为音符序列,并可以播放和展示结果。
# 音乐转录流程
est_ns = inference_model(audio)
# 播放和展示音符序列
note_seq.play_sequence(est_ns, synth=note_seq.fluidsynth, sample_rate=SAMPLE_RATE, sf2_path=SF2_PATH)
note_seq.plot_sequence(est_ns)
- 下载转录结果
将转录的音符序列导出为MIDI文件,并允许用户下载。
# 导出和下载MIDI文件
note_seq.sequence_proto_to_midi_file(est_ns, '/tmp/transcribed.mid')
files.download('/tmp/transcribed.mid')
参考文献
https://arxiv.org/pdf/2107.09142
https://arxiv.org/pdf/2111.03017v4
GitHub - magenta/mt3: MT3: Multi-Task Multitrack Music Transcription
https://paperswithcode.com/paper/mt3-multi-task-multitrack-music-transcription-1