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 の
DatasetMIDIとDataCollatorを構築し、モデル訓練用のDataLoaderを作成します。
主な特徴
- REMI、REMI+、MIDI‑Like、TSD、Structured、CPWord、Octuple、MuMIDI、MMM、PerTok などの複数のトークン化を実装。
- BPE、Unigram、WordPiece を用いたトークナイザーの訓練をサポート。
- データ拡張メソッドを含む。
- Hugging Face Hub 統合(
push_to_hub、from_pretrained)。 - PyTorch、TensorFlow、NumPy テンソルと互換。
DatasetMIDI、DataCollator、split_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
- プロジェクト
- プロジェクト