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