Skip to main content

MuScriptor logo

MuScriptor

MuScriptor is a multi-instrument music transcription model developed by Kyutai and Mirelo. It turns a recording into MIDI and into sheet music. It's the most accurate open-source transcription model. You can use the model here or self-host it using this repository.

Use it | Paper | HuggingFace

HuggingFace login (required)

To use MuScriptor locally, you first need to log into HuggingFace and accept the CC BY-NC 4.0 license.

  1. Accept the model license on the model page for the small, medium or large model (access is granted automatically).

  2. Authenticate on your machine:

    uvx hf auth login
    

    or set a token (create one at huggingface.co/settings/tokens):

    export HF_TOKEN=hf_...
    

The weights are then automatically downloaded on first use and cached locally.

Try it locally

After Hugging Face authentication, you can use MuScriptor with uvx without having to clone this repo.

Some platforms need an extra uvx flag, on every uvx muscriptor command:

Platform Command
Linux, macOS with Apple Silicon uvx muscriptor serve
Windows (to use the GPU) uvx --torch-backend=cu128 muscriptor serve
macOS with Intel uvx --python 3.12 muscriptor serve

On Windows the default PyTorch backend is cpu, so the GPU needs --torch-backend=cu128. On Intel Macs, PyTorch stopped shipping x86_64 wheels after torch 2.2.2, which supports Python ≤ 3.12, so the Python version has to be pinned (if you install with pip/uv instead, use Python 3.10–3.12).

Web UI

You can host the web UI locally with:

uvx muscriptor serve

This gives you the same UI as hosted on https://muscriptor.kyutai.org/, just with a different look.

The sheet music download needs MuseScore 4 or newer installed separately (see Sheet music below). Without it, everything except that download still works.

Command-line interface (CLI)

uvx muscriptor transcribe path/to/audio_file.wav

See --help for all the options.

Tempo and quantization

The beats, time signature and bar lines are detected from the audio and written into the MIDI. When the tempo isn't steady (no metronome), the MIDI gets a tempo map that follows the performance, so the bar lines stay on the music; --fixed-tempo writes one average tempo instead. When the detection is off, you can correct it, and tidy the notes up for notation software or a DAW grid:

muscriptor transcribe audio.wav --bpm 96 --beats-per-bar 3 --first-downbeat 1.2 \
    --quantize --grid 4 --fill-gaps 0.25 --trim-leading-bars
  • --quantize snaps notes onto the beat grid (--grid 4 = sixteenths, 3 = eighth triplets; by default the one the notes sit on best), --quantize-strength 0.5 only halfway.
  • --fill-gaps holds notes until the next one across rests of up to that many beats, which notation software such as Guitar Pro would otherwise write out.
  • --trim-leading-bars drops the empty bars before the first note.
  • --beat-scale 2 (or 0.5) when the detected tempo is half (or double) what it should be.

The web UI has the same settings: the "Tempo & bars" panel and the MIDI download dialog.

Sheet music

Using the CLI with --format sheets engraves the transcription as readable notation instead of writing a single MIDI file.

muscriptor transcribe audio.wav --format sheets --output score/

The output structure looks like this:

score/
├── score.mid                       the transcription, as quantized MIDI
├── score.musicxml                  the engraved score, as MusicXML
├── full_score.pdf                  every instrument on one system
├── 01_electric_guitar.pdf          one PDF per instrument …
├── 01_electric_guitar_tab.pdf      … and a tablature PDF for fretted ones
├── 02_electric_bass.pdf
├── 02_electric_bass_tab.pdf
└── 03_drum_kit.pdf

This needs MuseScore 4 or newer installed separately. Downloads for every platform are at musescore.org/en/download. Set $MUSCRIPTOR_MUSESCORE if it lives somewhere unusual.

It works best if there is a clear beat, because that allows us to quantize the notes (snap them to a grid) for a cleaner transcription. Without a steady tempo the score follows the performance's tempo changes; rubato recordings will still work noticeably worse.

Using from Python

MuScriptor is also on PyPI, so you can install it with with uv (recommended) or with pip:

uv add muscriptor
pip install muscriptor

Ask your coding agent to show you around the codebase.

Models

Three variants are published under the MuScriptor HuggingFace organization. Everywhere a model is selected (load_model(), the CLI's --model, serve --model) you can pass the bare size keyword and the weights are downloaded and cached automatically. The architecture is a transformer decoder only. Here are the detailed model sizes:

Variant Parameters Layers Dim HuggingFace repo
small 103M 14 768 muscriptor-small
medium (default) 307M 24 1024 muscriptor-medium
large 1.4B 48 1536 muscriptor-large

small is the practical choice on CPU-only machines, medium is the default speed/accuracy trade-off, and large is the most accurate but really wants a GPU. On Apple Silicon the model runs on Metal (MPS) automatically.

Developing

To set up for development, get uv, clone this repo and run:

uv sync

For the web UI, you also need pnpm and Node (can be installed via pnpm). Then run:

cd web
pnpm install
pnpm run build

If you're not editing the frontend, you only need to do this once. If you are, run pnpm dev instead for a hot-reloading dev server. Start the backend alongside it with it using uv run muscriptor serve --port 8222 and then open the frontend on http://localhost:5173/.

Run

After this setup, you can run Muscriptor from your local repository using uv (note - not uvx like before):

uv run muscriptor serve
# or 
uv run muscriptor transcribe path/to/audio_file.wav

Again, see --help for more options.

License

The code in this repository is released under the MIT license.

The model weights, published on HuggingFace, are released under the CC BY-NC 4.0 license (non-commercial use).

The MuseScore General SoundFont downloaded for playback is distributed under its own (MIT) license.

Citation

@misc{rouard2026muscriptoropenmodelmultiinstrument,
      title={MuScriptor: An Open Model for Multi-Instrument Music Transcription}, 
      author={Simon Rouard and Michael Krause and Axel Roebel and Carl-Johann Simon-Gabriel and Alexandre Défossez},
      year={2026},
      eprint={2607.08168},
      archivePrefix={arXiv},
      primaryClass={cs.SD},
      url={https://arxiv.org/abs/2607.08168}, 
}

Metadata

Release files for muscriptor 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for muscriptor 0.4.0
File Size Uploaded Provenance
muscriptor-0.4.0.tar.gz 4.7 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for muscriptor 0.4.0
File Interpreter ABI Platform
muscriptor-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 6.5 MB

Release files / muscriptor-0.4.0.tar.gz

Download URL muscriptor-0.4.0.tar.gz
Size 4.7 MB
Tags Source
SHA-256 checksum
How to use checksums
2d487b246e16d73390c9d9fa63b05ea22237777cbdb7584161fd338a1b4ebb57
BLAKE2b-256 checksum
How to use checksums
d326e639ce007d8b4953784d7e50efc5d12cfd6ca622d720bca6636dca83c6a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / muscriptor-0.4.0-py3-none-any.whl

Download URL muscriptor-0.4.0-py3-none-any.whl
Size 1.9 MB
Tags Python 3
SHA-256 checksum
How to use checksums
a7e941b6e1d85a25f9fc4e00c2a46b43d4d516de0e751d54b42fda438ac2abb9
BLAKE2b-256 checksum
How to use checksums
1ac57480c38f33bc27ee0a00c807db7ad855ef77a457a3a85c48f8854dc0817d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Security for muscriptor 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for muscriptor-0.4.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page