Natooz/MidiTok

MIDI / symbolic music tokenizers for Deep Learning models 🎶

MidiTok

摘要 MidiTok 是一個 Python 套件,將 MIDI 和 abc 音樂檔案轉換為 token 序列。這些 token 可以輸入機器學習模型(例如 Transformer)用於音樂生成、轉錄或其他 MIR 任務。

目的 提供統一介面以支援各種音樂 tokenization 方法,透過 BPE/Unigram/WordPiece 訓練 tokenizer,提供資料增強工具,並與 Hugging Face Hub 整合以共享模型。

運作方式

  • 使用 Symusic 讀取/寫入 MIDI 和 abc 檔案。
  • tokenizer(如 REMI)接受一個 Score 物件並輸出 token ID 列表。
  • tokenizer 可以在 MIDI 檔案語料庫上訓練(tokenizer.train)以透過 BPE、Unigram 或 WordPiece 學習詞彙表。
  • 訓練好的 tokenizer 可進行編碼(tokenizer(midi))和解碼(tokenizer(tokens)),回傳 PyTorch、TensorFlow 或 NumPy 張量。
  • 輔助工具可將長 MIDI 檔案分割為訓練大小的區塊,建立 PyTorch DatasetMIDIDataCollator,並產生用於模型訓練的 DataLoader

主要特色

  • 實作多種 tokenization:REMI、REMI+、MIDI‑Like、TSD、Structured、CPWord、Octuple、MuMIDI、MMM、PerTok。
  • 支援使用 BPE、Unigram、WordPiece 訓練 tokenizer。
  • 包含資料增強方法。
  • Hugging Face Hub 整合(push_to_hubfrom_pretrained)。
  • 相容於 PyTorch、TensorFlow 與 NumPy 張量。
  • 提供 DatasetMIDIDataCollatorsplit_files_for_training 工具。

使用範例

from miditok import REMI, TokenizerConfig
from symusic import Score

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

midi = Score("path/to/your_midi.mid
tokens = tokenizer(midi)               # → token IDs
converted_back = tokenizer(tokens)     # → Score object

訓練 tokenizer:

from pathlib import Path
files = list(Path("midis\)).glob("**/*.mid
tokenizer.train(vocab_size=30000, files_paths=files)
tokenizer.save(Path("tokenizer.json
tokenizer.push_to_hub("username/model-name", private=True, token="HF_TOKEN

為 PyTorch 準備資料:

from miditok.utils import split_files_for_training
from miditok.pytorch_data import DatasetMIDI, DataCollator
from torch.utils.data import DataLoader

split_files_for_training(files_paths=files, tokenizer=tokenizer,
                         save_dir=Path("chunks\)), max_seq_len=1024)

dataset = DatasetMIDI(
    files_paths=list(Path("chunks\)).glob("**/*.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)
dataloader = DataLoader(dataset, batch_size=64, collate_fn=collator)

for batch in dataloader:
    # train your model on batch
    ...

限制 / TODO

  • 音樂 XML 支援尚未實作。
  • 缺少 no_duration_drums 選項以移除鼓的 duration token。
  • 未處理 Control Change 訊息。
  • 全域/軌事件解析可透過 Rust/C++ 繫結加速。

相關

  • 專案
  • 專案
  • Dispatch
  • 專案
  • 專案