资讯动态

Magenta 数据集构建指南:用 convert_dir_to_note_sequences 将 MIDI/MusicXML/ABC 批量转换为 NoteSequence TFRecord

发布时间:2026/10/1 21:58:32 来源:尧图企业网站定制
人工智能深度学习音频媒体生成计算机视觉【免费下载链接】magentaMagenta: Music and Art Generation with Machine Intelligence项目地址https://gitcode.com/gh_mirrors/ma/magenta点击查看免费下载导读本文以 Magenta 仓库中 magenta/scripts/README.md 的「构建你的数据集」章节为主线完整讲解 Magenta 数据准备阶段的第一步把一个包含 MIDI以及 MusicXML、ABC文件的目录批量转换为 NoteSequence 协议缓冲区protocol buffer并落盘为 TFRecord 文件。读完本文后你将掌握convert_dir_to_note_sequences命令的全部参数与用法、底层转换与异常处理机制并了解这批 TFRecord 如何通过 magenta/pipelines 的流水线 API 进一步加工成具体模型如 Melody RNN的训练数据。一、为什么需要构建 NoteSequence 数据集Magenta 中的大多数音乐生成模型Melody RNN、Drums RNN、Performance RNN、Polyphony RNN 等并不能直接消费原始的.mid文件。它们统一以NoteSequence这一 protocol buffer 作为输入数据格式——它把音符、节拍、调号、速度等信息标准化为结构化的消息对象note_seq包中的music_pb2.NoteSequence。因此数据准备的标准流程是收集一批 MIDI或 MusicXML、ABC文件放入一个目录可含子目录用convert_dir_to_note_sequences将目录内所有可解析的文件转换为 NoteSequence将序列化后的 NoteSequence 按 TFRecord 格式写入一个文件供后续各模型的*_create_dataset脚本消费。TFRecord 是 TensorFlow 的标准二进制存储格式适合大批量、顺序读取的训练数据。测试 convert_dir_to_note_sequences_test.py 展示了这条链路的预期结果转换出的每条 NoteSequence 都带有合法的id、collection_name和非空的notes列表。如果你手头暂时没有 MIDI 文件可以使用公开的 Lakh MIDI Dataset 或 MidiWorld 上收录的 MIDI 资源作为语料来源。二、前置条件安装 Magenta 并让脚本进入 PATH运行转换命令的前提是完成 Magenta 安装。根据仓库根目录 README.md 的说明有两种方式pip 安装推荐pip install magenta。安装完成后Magenta 的全部命令行脚本会通过 console_scripts 注册到你的 PATH 中。开发环境克隆仓库后在仓库根目录执行pip install -e .即可直接以python magenta/scripts/convert_dir_to_note_sequences.py ...的方式运行也支持pip install .安装到环境。convert_dir_to_note_sequences之所以能作为独立命令直接调用是因为 setup.py 在CONSOLE_SCRIPTS中注册了magenta.scripts.convert_dir_to_note_sequences并在 setup.py 中将其映射为同名 console script入口函数是该脚本中的console_entry_point()。三、准备源文件目录转换器目前支持以下三种格式见 convert_dir_to_note_sequences.py 的文件后缀判断格式扩展名说明MIDI.mid、.midi最常用的输入格式MusicXML.xml、.mxl乐谱交换格式可精确表达记谱信息ABC.abc纯文本乐谱记谱法一个文件内可包含多首曲子输入目录可以包含子目录是否递归扫描子目录由--recursive参数控制。目录里如果混有其他类型的文件转换器会给出警告并跳过详见下文异常处理。四、核心命令convert_dir_to_note_sequences 完整用法原文档给出了可直接套用的命令行模板以下将其完整保留并补充参数说明INPUT_DIRECTORYfolder containing MIDI and/or MusicXML files. can have child folders. # TFRecord file that will contain NoteSequence protocol buffers. SEQUENCES_TFRECORD/tmp/notesequences.tfrecord convert_dir_to_note_sequences \ --input_dir$INPUT_DIRECTORY \ --output_file$SEQUENCES_TFRECORD \ --recursive4.1 命令行参数一览参数由 convert_dir_to_note_sequences.py 中的 flag 定义解析具体如下参数类型默认值含义--input_dirstring无必填待转换文件所在的根目录--output_filestring无必填输出 TFRecord 文件路径若文件已存在会被直接覆盖--recursiveboolFalse是否递归扫描input_dir的子目录--logstringINFO日志级别阈值可取DEBUG、INFO、WARN、ERROR、FATAL两个必填参数在main()中会做校验缺失时直接以FATAL级别报错退出convert_dir_to_note_sequences.py。同时路径支持~展开os.path.expanduser输出文件所在的目录会自动创建convert_dir_to_note_sequences.py。4.2 直接以 Python 模块方式运行未安装 pip 包、处于开发环境时也可以等价地运行python magenta/scripts/convert_dir_to_note_sequences.py \ --input_dir/path/to/input/dir \ --output_file/path/to/tfrecord/file \ --logINFO该脚本的模块 docstringconvert_dir_to_note_sequences.py即给出了上述示例两种调用方式效果一致。五、源码级解析转换流程与异常处理5.1 顶层转换流程转换的入口是convert_directory(root_dir, output_file, recursive)convert_dir_to_note_sequences.py用tf.io.TFRecordWriter(output_file)打开输出文件调用convert_files(root_dir, , writer, recursive)扫描根目录遍历目录中的每个文件按扩展名分发到对应的转换函数若开启了--recursive遇到子目录时会把子目录压入队列逐层递归处理convert_dir_to_note_sequences.py每转换 1000 个文件会打印一次进度日志convert_dir_to_note_sequences.py。5.2 三种格式的底层转换调用链MIDIconvert_midi读取文件字节后调用midi_io.midi_to_sequence_protoconvert_dir_to_note_sequences.pyMusicXMLconvert_musicxml调用musicxml_reader.musicxml_file_to_sequence_protoconvert_dir_to_note_sequences.pyABCconvert_abc调用abc_parser.parse_abc_tunebook由于一个 ABC 文件可能包含多首曲子返回值是一个tune字典每首曲子会被分别转换成一条 NoteSequence 并逐一写入convert_dir_to_note_sequences.py。5.3 元数据字段的填充规则每条生成的 NoteSequence 都会补全三个关键元数据字段例如 convert_dir_to_note_sequences.pycollection_name取输入根目录的 basename用于标识这批数据来自哪个语料集filename源文件相对于根目录的路径sub_dir basename用于追溯原始文件id由generate_note_sequence_id生成格式为/id/type/collection_name/hash其中 hash 是对 filename 做 SHA-1 得到的十六进制摘要convert_dir_to_note_sequences.py。由于 hash 只依赖文件名重复运行转换不会产生不同的 id。5.4 坏文件的处理策略原文档关键提示原文档明确指出MIDI 解析器遇到格式异常的 MIDI 时可能打印警告这些警告可以安全忽略无法解析的 MIDI 文件会被直接跳过。源码中的实现与之完全一致可识别的坏文件如midi_io.MIDIConversionError、MusicXMLConversionError、ABCParseError会被捕获记录 WARNING 日志后返回None跳过该文件并继续处理其余文件convert_dir_to_note_sequences.py其他未预期异常会记录FATAL日志但同样通过continue跳过不会中断整个批次convert_dir_to_note_sequences.py无法识别后缀的文件既非 MIDI/MusicXML/ABC 也非目录会打印 WARNING「Unable to find a converter for file」后跳过convert_dir_to_note_sequences.py。因此即使语料目录中存在少量脏数据批量转换依然可以稳定跑完。5.5 测试用例验证convert_dir_to_note_sequences_test.py 构造了包含多层子目录、多个 MIDI 文件以及一个non_midi_file的测试目录分别验证非递归模式下只转换当前目录文件testConvertMidiDirToSequences_NoRecurse第 95-99 行递归模式下子目录文件全部被纳入testConvertMidiDirToSequences_Recurse第 101-105 行每条记录都能反序列化为 NoteSequence且id、collection_name、filename与预期一致notes非空第 83-91 行。这也是一个很好的参考如果你想给该脚本新增格式支持可以仿照此测试建立自己的回归用例。六、从 NoteSequence 到模型训练数据数据加工流水线 API原文档在结尾提示如果想添加自己的模型应进一步了解 Magenta 在底层是如何创建数据集的即 Data processing in Magenta对应目录 magenta/pipelines。核心概念是Pipeline——一个把输入数据类型转换为输出数据类型的数据处理模块。convert_dir_to_note_sequences产出的 NoteSequence TFRecord 只是数据链路的起点各模型随后用各自的*_create_dataset脚本把 NoteSequence 加工成模型真正需要的训练样本。以 Melody RNN 为例melody_rnn_create_dataset.py 的核心调用是pipeline.run_pipeline_serial( pipeline_instance, pipeline.tf_record_iterator(FLAGS.input, pipeline_instance.input_type), FLAGS.output_dir)其中--input本脚本转换出的 NoteSequence TFRecord 文件--output_dir输出目录会写入 training / eval 两个 TFRecord--eval_ratio默认0.1按比例随机切分出评估集。run_pipeline_serial将 TFRecord 中的 NoteSequence 逐条喂给流水线如Quantizer量化 MelodyExtractor提取旋律 EncoderPipeline编码 RandomPartition划分训练/评估集最终输出SequenceExample供模型训练。整个串联过程由DAGPipeline以「destination: dependency」字典形式描述见 magenta/pipelines/README.md。同样的模式适用于其他模型melody_rnn_create_dataset、drums_rnn_create_dataset、performance_rnn_create_dataset、polyphony_rnn_create_dataset等脚本均已注册在 setup.py 的 console scripts 中安装后可直接调用。七、常见问题与调试建议命令找不到确认 Magenta 已通过pip install magenta或开发环境pip install -e .安装且convert_dir_to_note_sequences已进入 PATH。输出文件被清空/覆盖--output_file在已存在时会被直接覆盖flag 定义中明确标注如需保留旧数据请换一个输出路径。子目录没被处理默认--recursiveFalse只扫描根目录一层需要递归时务必加上--recursive。想看到更细的处理日志用--logDEBUG查看每个文件的转换过程只想看错误时可用--logWARN或--logERROR。某文件始终被跳过多数情况下是该文件格式损坏或后缀无法识别--logDEBUG下会打印具体的解析异常原因。转换结果如何核验可参考测试 convert_dir_to_note_sequences_test.py 的做法用tf_record_iterator逐条读取并反序列化为music_pb2.NoteSequence检查内容。小结convert_dir_to_note_sequences是 Magenta 数据准备链路上的第一个标准化入口它把散落在目录中的 MIDI / MusicXML / ABC 文件统一为携带id、collection_name、filename元数据的 NoteSequence并以 TFRecord 形式落盘为后续所有模型的流水线加工提供统一输入。掌握它的参数行为、异常处理与输出结构你就掌握了为 Magenta 任意模型构建自有数据集的起点。赞分享人工智能深度学习音频媒体生成计算机视觉【免费下载链接】magentaMagenta: Music and Art Generation with Machine Intelligence项目地址https://gitcode.com/gh_mirrors/ma/magenta点击查看免费下载相关推荐rico_semantics 实战指南将 RICO 移动界面语义标注转换为 TFRecord 数据集rico_semantics 实战指南将 RICO 移动界面语义标注转换为 TFRecord 数据集 本文围绕 google research 仓库中的 ri人工智能深度学习NLP计算机视觉强化学习EfficientDet 数据集预处理实战将 COCO 与 Pascal VOC 原始数据转换为 TFRecordEfficientDet 数据集预处理实战将 COCO 与 Pascal VOC 原始数据转换为 TFRecord 本文围绕 TensorFlow examp示例工程Haystack UnstructuredFileConverter 完整指南用 Unstructured API 将异构文件批量转换为 DocumentHaystack UnstructuredFileConverter 完整指南用 Unstructured API 将异构文件批量转换为 Document 本人工智能大模型RAGAI AgentNLP上一篇终极指南Suwayomi-Server 漫画阅读服务器的完整使用教程下一篇终极指南免费让旧款Mac焕发新生安装最新macOS系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑