Natooz/MidiTok
MIDI / symbolic music tokenizers for Deep Learning models 🎶
MidiTok – AIモデル用の音楽をトークン化する
何であるか – MidiTokは、シンボリック音楽ファイル(MIDIおよびabc)を離散トークンのシーケンスに変換し、そのトークンを元の音楽に戻すことも可能なPythonライブラリです。これらのトークンストリームは、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:
# あなたのモデルのforwardパスに置き換える
print("batch ready for training")
READMEには、Hugging Face MistralスタイルのTransformerを使ってMidiTokで音楽を生成する方法を示すColabノートブックへのリンクがあります。
ドキュメントとコミュニティ – 完全なAPIドキュメントは https://miditok.readthedocs.io で公開されており、プロジェクトはPyPIに登録済み、GitHubでCIテストが実行されています。GitHubワークフローに従って、貢献を歓迎しています。
引用 – 研究でこのライブラリを使用する場合、ISMIR 2021デモ論文(およびREADMEにリンクされているarXivプレプリント)を引用してください。
関連
- プロジェクト
- Dispatch
- プロジェクト
- プロジェクト
- Dispatch