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_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 토큐의 duration 토큰을 제거하는 no_duration_drums 옵션이 누락되었습니다.
  • Control Change 메시지는 처리되지 않습니다.
  • 글로벌/트랙 이벤트 파싱은 Rust/C++ 바인딩으로 속도를 높일 수 있습니다.

관련

  • 프로젝트
  • 프로젝트
  • Dispatch
  • 프로젝트
  • 프로젝트