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
DatasetMIDI與DataCollator,並產生用於模型訓練的DataLoader。
主要特色
- 實作多種 tokenization:REMI、REMI+、MIDI‑Like、TSD、Structured、CPWord、Octuple、MuMIDI、MMM、PerTok。
- 支援使用 BPE、Unigram、WordPiece 訓練 tokenizer。
- 包含資料增強方法。
- 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
訓練 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
- 專案
- 專案