Natooz/MidiTok

MIDI / symbolic music tokenizers for Deep Learning models 🎶

MidiTok – 为 AI 模型准备音乐标记化

是什么 – MidiTok 是一个 Python 库,可将符号化音乐文件(MIDI 和 abc)转换为离散标记序列,并能将这些标记序列还原为音乐。这些标记流可直接输入机器学习模型(如 Transformer)用于音乐生成、转录或音乐信息检索(MIR)等任务。

为何重要 – 现代生成模型处理的是类似文本的标记流。MidiTok 提供了一种统一且文档齐全的方式,将音乐表示为标记,使研究人员和开发者无需编写自己的底层解析器,即可探索多种音乐 AI 方法。

主要特性

  • 支持大多数已发表的音乐标记化方案(REMI、REMI+、MIDI-Like、TSD、BEAT、Structured、CPWord、Octuple、MuMIDI、MMM、PerTok 等)。
  • 所有标记器共享统一的配置 API(TokenizerConfig)。
  • 可通过 fast 🤗 tokenizers 库使用 BPE、Unigram 或 WordPiece 学习词汇表。
  • 基于 Symusic 实现稳健的 MIDI/abc I/O,并与 Hugging Face Hub 集成,支持标记器和模型共享。
  • 提供与 PyTorch 兼容的数据集、批处理器和工具,用于将长文件切分为训练就绪的序列。
  • 包含数据增强辅助工具,并计划未来扩展(支持 MusicXML、鼓专用选项、控制变化处理、Rust/C++ 速度优化)。

安装

pip install miditok

该包需要 Python ≥ 3.9,并自动安装 symusic 和 huggingface-tokenizers。

快速开始

from miditok import REMI, TokenizerConfig
from symusic import Score

# 配置一个多轨标记器
cfg = TokenizerConfig(num_velocities=16, use_chords=True, use_programs=True)
tokenizer = REMI(cfg)

# 加载 MIDI 文件,标记化并还原
midi = Score("my_song.mid")
toks = tokenizer(midi)               # 也支持文件路径或原始标记列表
recovered = tokenizer(toks)          # 返回一个 Symusic Score 对象

训练模型 – 端到端示例

from pathlib import Path
from miditok import REMI, TokenizerConfig
from miditok.pytorch_data import DatasetMIDI, DataCollator
from miditok.utils import split_files_for_training
from torch.utils.data import DataLoader

cfg = TokenizerConfig(num_velocities=16, use_chords=True, use_programs=True)
tokenizer = REMI(cfg)

# 1️⃣ 从 MIDI 文件语料库中学习词汇表
files = list(Path("/data/midis").rglob("*.mid"))
tokenizer.train(vocab_size=30_000, files_paths=files)

tokenizer.save(Path("tokenizer.json"))
# 可选:推送到 Hugging Face Hub
# tokenizer.push_to_hub("username/miditok-remi")

# 2️⃣ 将长文件拆分为固定长度的块以用于训练
chunks_dir = Path("chunks")
split_files_for_training(files, tokenizer, chunks_dir, max_seq_len=1024)

# 3️⃣ 构建 PyTorch 数据集 / 数据加载器
train_set = DatasetMIDI(
    files_paths=list(chunks_dir.rglob("*.mid")),
    tokenizer=tokenizer,
    max_seq_len=1024,
    bos_token_id=tokenizer["BOS_None"],
    eos_token_id=tokenizer["EOS_None"],
)
collator = DataCollator(tokenizer.pad_token_id, copy_inputs_as_labels=True)
loader = DataLoader(train_set, batch_size=64, collate_fn=collator)

# 4️⃣ 迭代 – 可接入任意 Transformer 风格模型
for batch in loader:
    # 替换为你的模型的前向传播
    print("batch ready for training")

README 还链接了一个 Colab 笔记本,演示如何使用 Hugging Face Mistral 风格的 Transformer 与 MidiTok 生成音乐。

文档与社区 – 完整的 API 文档托管在 https://miditok.readthedocs.io,项目已发布在 PyPI,GitHub 上进行 CI 测试,欢迎通过标准 GitHub 工作流贡献代码。

引用 – 若在研究中使用该库,请引用 ISMIR 2021 演示论文(以及 README 中链接的 arXiv 预印本)。

相关

  • 项目
  • Dispatch
  • 项目
  • 项目
  • Dispatch