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