MuScriptor is an open-weight model for general-purpose, multi-instrument automatic music transcription (AMT): it converts a music recording (any genre, multiple simultaneous instruments) into a stream of notes played. This repository hosts the large variant (≈1.3B parameters) — the flagship, best-quality checkpoint.
1from pathlib import Path
2from muscriptor import TranscriptionModel
34# "large" resolves to hf://MuScriptor/muscriptor-large and downloads on first use.5model = TranscriptionModel.load_model("large")67# Get a MIDI file directly:8Path("out.mid").write_bytes(model.transcribe_to_midi("audio.wav"))910# Or stream note events as they are transcribed:11for event in model.transcribe("audio.wav"):12print(event)# NoteStartEvent / NoteEndEvent / ProgressEvent
load_model accepts a size keyword ("small"/"medium"/"large"), a local .safetensors path, or an hf:// / https:// URL. Weights loaded by size keyword (or any hf:// URL) are cached in the standard Hugging Face cache (~/.cache/huggingface/hub, configurable via HF_HOME); weights fetched from a plain http(s):// URL are cached under ~/.cache/muscriptor/. Input audio can be WAV or any format libsndfile reads (mp3, flac, ogg, m4a, …); it is resampled to 16 kHz mono internally.
CLI
muscriptor transcribe --model large audio.wav -o out.mid
Model description
MuScriptor performs transcription by autoregressively predicting a MIDI-like token sequence given the mel-spectrogram of a short audio segment, following the sequence-to-sequence AMT paradigm (cf. MT3). It deliberately avoids complex architectural tweaks in favor of a simple, decoder-only Transformer.
Input: raw waveform (16 kHz, mono) of a 5-second segment → mel-spectrogram (STFT n_fft=2048, hop 160 → 100 Hz frame rate, 512 mel bins). The spectrogram is projected to the model dimension and used as a prefix condition.
Output tokenization: MT3-like note events; the 128 MIDI programs are mapped to 36 instrument subgroups using the MT3_FULL_PLUS taxonomy. Decoding is greedy (argmax) by default, with optional classifier-free guidance (CFG).
Inference: audio is processed in 5-second chunks; note events are emitted in temporal order. Optional instrument conditioning stabilizes predictions across chunk boundaries and lets you restrict/customize the transcription (see below).
Note on the representation: the tokenizer recovers onset/offset timing, pitch, and instrument, but not velocity. It also cannot represent two notes of the same pitch and instrument sounding at the same time. Drums are onset-only.
All variants share the same input pipeline, tokenizer, and training recipe; they differ only in latent dimension, attention heads, and depth.
Intended uses & limitations
Intended uses
General-purpose transcription of real, multi-instrument music across genres (classical → heavy metal) into MIDI.
A building block for music information retrieval (chord/key recognition), musicological analysis, generative-modeling data pipelines, and tools for musicians.
Out of scope / use with care
Not a substitute for a hand-annotated score; expect errors, especially on dense mixes, unusual timbres, and heavily processed audio.
Velocity/dynamics are not produced (see note above).
Onset/offset precision is lower for some styles (e.g. choral music), and exact offsets are inherently harder than onsets.
Limitations & biases
Training data skews toward pop and Western classical music, and the instrument distribution is long-tailed (piano/guitar/bass/drums are most frequent). Rare instruments and underrepresented genres may be transcribed less reliably.
The fixed MT3_FULL_PLUS 36-group instrument taxonomy limits instrument granularity.
Simultaneous same-pitch/same-instrument notes cannot be represented by the tokenizer.
Instrument conditioning
The model can be told which instrument groups are present in the track. Supplying the correct set improves quantitative scores and produces more coherent instrument assignments across segments.
python
1from muscriptor.tokenizer.mt3 import MT3_FULL_PLUS_GROUP_NAMES
23# `instrument_group` is a space-separated string of MT3_FULL_PLUS group IDs.4# Convert readable group names to IDs:5names =["acoustic_piano","acoustic_guitar","acoustic_bass"]6instrument_group =" ".join(str(MT3_FULL_PLUS_GROUP_NAMES[n])for n in names)# -> "0 4 7"78# Only expect piano, acoustic guitar and bass in this track:9model.transcribe_to_midi("audio.wav", instrument_group=instrument_group)
bash
1muscriptor transcribe --model large --instruments "acoustic_piano,acoustic_guitar,acoustic_bass" audio.wav -o out.mid
2muscriptor list-instruments # show all available group names
Evaluation
Metrics are instrument-agnostic F1 scores computed with mir_eval.
Headline results on D_Test
D_Test is the authors' held-out test set of 372 multi-instrument tracks. Results below are for this 1.3B model with the full training pipeline (D_Synth + D_Real + D_RL), CFG = 2:
Model
Onset F1
Frame F1
Offset F1
Drums F1
Multi F1
YourMT3+ (baseline)
32.5
45.5
17.8
41.4
21.9
MuScriptor 1.3B
60.4
72.4
48.6
49.6
47.8
Model-size comparison
F1 ↑ on D_Test from the paper's scaling study (models trained on D_Real only, CFG = 2). Note these ablation numbers omit synthetic pre-training and RL, so they are lower than the full-pipeline results above:
Variant
Params
Onset
Frame
Offset
Drums
Multi
muscriptor-small
100M
51.2
67.2
38.7
41.5
38.2
muscriptor-medium
300M
52.4
68.0
40.3
42.0
39.7
muscriptor-large
1.3B
53.2
68.7
41.0
42.5
40.5
Citation
bibtex
1@inproceedings{muscriptor2026,
2 title = {MuScriptor: An Open Model for Multi-Instrument Music Transcription},
3 author = {Rouard, Simon and Krause, Michael and Roebel, Axel and
4 Simon-Gabriel, Carl-Johann and D{\'e}fossez, Alexandre},
5 year = {2026},
6 note = {Kyutai, Mirelo AI, IRCAM}
7}
License
Code released under the MIT License. Weights released under CC-BY-NC.