Natooz/MidiTok

MIDI / symbolic music tokenizers for Deep Learning models 🎶

MidiTok

概要 MidiTok は、MIDI と abc 音楽ファイルをトークンシーケンスに変換する Python パッケージです。これらのトークンは、機械学習モデル(例えば Transformer)に入力して、音楽生成、転写、またはその他の MIR タスクに使用できます。

目的 さまざまな音楽トークン化手法のための統一インターフェースを提供し、BPE/Unigram/WordPiece を用いたトークナイザーの訓練を可能にし、データ拡張ユーティリティを提供し、Hugging Face Hub と統合してモデルを共有します。

仕組み

  • Symusic を使用して MIDI と abc ファイルを読み書きします。
  • REMI などのトークナイザーは Score オブジェクトを受け取り、トークン ID のリストを出力します。
  • トークナイザーは MIDI ファイルのコーパス上で訓練できます(tokenizer.train)。これにより BPE、Unigram、または WordPiece を用いて語彙を学習します。
  • 訓練済みトークナイザーはエンコード(tokenizer(midi))とデコード(tokenizer(tokens))を行い、PyTorch、TensorFlow、または NumPy テンソルを返します。
  • ヘルパーユーティリティは長い MIDI ファイルを訓練サイズのチャンクに分割し、PyTorch の DatasetMIDIDataCollator を構築し、モデル訓練用の DataLoader を作成します。

主な特徴

  • REMI、REMI+、MIDI‑Like、TSD、Structured、CPWord、Octuple、MuMIDI、MMM、PerTok などの複数のトークン化を実装。
  • BPE、Unigram、WordPiece を用いたトークナイザーの訓練をサポート。
  • データ拡張メソッドを含む。
  • 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

トークナイザーの訓練:

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

  • Music‑XML サポートはまだ実装されていません。
  • ドラムの duration トークンを削除する no_duration_drums オプションが欠けています。
  • Control Change メッセージは処理されていません。
  • グローバル/トラック イベントのパースは Rust/C++ バインドで高速化できる可能性があります。

関連

  • プロジェクト
  • プロジェクト
  • Dispatch
  • プロジェクト
  • プロジェクト