Music source separation with MLX acceleration.
Project description
demucs-mlx
Split any song into its individual stems — vocals, drums, bass, and other instruments — directly on your Mac.
demucs-mlx is a fast, native Apple Silicon port of Meta's Demucs music source separation model, built on MLX. No PyTorch required.
Features
- ~73x realtime on Apple Silicon — 2.6x faster than Demucs with PyTorch MPS
- Bit-exact parity with upstream Demucs stems (within floating-point tolerance)
- Custom fused Metal kernels (GroupNorm+GELU, GroupNorm+GLU, OLA)
- Metal-free fallbacks for non-Apple platforms (Linux)
- No PyTorch required at inference time
- Automatic resampling — input files at any sample rate are resampled to the model rate
- Audio I/O via mlx-audio-io
- STFT/iSTFT via mlx-spectro
Requirements
- Python >= 3.10
- macOS with Apple Silicon (recommended) or Linux with MLX
Install
pip install demucs-mlx
On first run, demucs-mlx will automatically download and convert the PyTorch weights to MLX format. This requires the convert extra:
pip install 'demucs-mlx[convert]'
Once weights are cached in ~/.cache/demucs-mlx, the convert extra is no longer needed.
CLI usage
demucs-mlx /path/to/audio.wav
Options:
-n, --name Model name (default: htdemucs)
-o, --out Output directory (default: separated)
--shifts Number of random shifts (default: 1)
--seed Optional RNG seed for reproducible shifts (default: none)
--overlap Overlap ratio (default: 0.25)
-b, --batch-size Batch size (default: 8)
--write-workers Concurrent writer threads (default: 1)
--list-models List available models
-v, --verbose Verbose logging
Python usage
from demucs_mlx import Separator
separator = Separator()
origin, stems = separator.separate_audio_file("song.wav")
# stems is a dict: {"drums": array, "bass": array, "other": array, "vocals": array}
for name, audio in stems.items():
print(f"{name}: {audio.shape}")
To keep outputs as MLX arrays (avoids GPU-to-CPU copy):
origin, stems = separator.separate_audio_file("song.wav", return_mx=True)
For reproducible shift sampling (while keeping shifts=1 behavior), pass a seed:
separator = Separator(model="htdemucs", shifts=1, seed=0)
origin, stems = separator.separate_audio_file("song.wav")
What changed in 1.4.3
resample_mx()now uses directmac.resample()instead of writing/reading a temp file — eliminates an unnecessary MLX→numpy→disk→MLX round-trip.- Bumped minimum
mlx-audio-ioto>=1.3.9(auto-selects best resampling quality).
What changed in 1.4.2
- Audio loading now stays as native MLX arrays end-to-end (no numpy round-trip).
- Automatic resampling via
mlx-audio-io— input files no longer need to match the model sample rate. - Uses
soxr_vhqresampling quality when available, with automatic fallback. - Bumped minimum dependencies:
mlx>=0.31.0,mlx-audio-io>=1.3.8,mlx-spectro>=0.2.4.
What changed in 1.4.0
- Fixed shifted-inference
TensorChunkpropagation so chunk length/offset is handled correctly in all paths. - Added optional deterministic RNG control (
seed) for Python API and CLI. - Default behavior is unchanged:
shifts=1remains stochastic unlessseedis provided.
Performance
Benchmarked on a 3:15 stereo track (44.1 kHz, 16-bit) using htdemucs with default settings:
| Package | Backend | Time | Speedup |
|---|---|---|---|
demucs 4.0.1 |
PyTorch (CPU) | 52.3s | 0.1x |
demucs 4.0.1 |
PyTorch (MPS) | 6.9s | 1x |
demucs-mlx 1.1.0 |
MLX + Metal | 2.7s | 2.6x |
Apple M4 Max, 128 GB. All runs use htdemucs with default settings and a single warm-up pass before timing.
Models
| Model | Sources | Description |
|---|---|---|
htdemucs |
4 | Hybrid Transformer Demucs (default) |
htdemucs_ft |
4 | Fine-tuned HTDemucs |
htdemucs_6s |
6 | 6-source (adds piano, guitar) |
hdemucs_mmi |
4 | Hybrid Demucs MMI |
mdx |
4 | Music Demixing model |
mdx_extra |
4 | MDX with extra training |
MLX model cache
Pre-converted MLX weights are cached under ~/.cache/demucs-mlx. Delete to force re-conversion.
Documentation
- API reference:
docs/api.md - Development workflow:
docs/development.md - Platform notes:
docs/platform.md
License
MIT. Based on Demucs by Meta Research. See LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file demucs_mlx-1.4.3.tar.gz.
File metadata
- Download URL: demucs_mlx-1.4.3.tar.gz
- Upload date:
- Size: 59.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6519f85dd7e53505c4c25cecc4947dd30856b9ab892d9a14b670f1069528f896
|
|
| MD5 |
fe5d501e8e17ca70a616b588b125fad6
|
|
| BLAKE2b-256 |
b2935bfc509bf14475e10f8d8eb4d7a513a02d09f4d21edcb068a6ec3f3653ae
|
Provenance
The following attestation bundles were made for demucs_mlx-1.4.3.tar.gz:
Publisher:
release-pypi.yml on ssmall256/demucs-mlx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
demucs_mlx-1.4.3.tar.gz -
Subject digest:
6519f85dd7e53505c4c25cecc4947dd30856b9ab892d9a14b670f1069528f896 - Sigstore transparency entry: 1051581957
- Sigstore integration time:
-
Permalink:
ssmall256/demucs-mlx@a8ef2031af45ed32f333e503fa56a3d0b25a6f4a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ssmall256
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@a8ef2031af45ed32f333e503fa56a3d0b25a6f4a -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file demucs_mlx-1.4.3-py3-none-any.whl.
File metadata
- Download URL: demucs_mlx-1.4.3-py3-none-any.whl
- Upload date:
- Size: 63.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f85c09feef7b835f6188b5408f908a711ebcd24a6384be87ef471b8493d072c
|
|
| MD5 |
884d92d130e688492c5da088005b9bde
|
|
| BLAKE2b-256 |
2de06cf4ed82d00f1ff320585ff31575911c707493a323f199067d07775c8c52
|
Provenance
The following attestation bundles were made for demucs_mlx-1.4.3-py3-none-any.whl:
Publisher:
release-pypi.yml on ssmall256/demucs-mlx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
demucs_mlx-1.4.3-py3-none-any.whl -
Subject digest:
5f85c09feef7b835f6188b5408f908a711ebcd24a6384be87ef471b8493d072c - Sigstore transparency entry: 1051581968
- Sigstore integration time:
-
Permalink:
ssmall256/demucs-mlx@a8ef2031af45ed32f333e503fa56a3d0b25a6f4a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ssmall256
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@a8ef2031af45ed32f333e503fa56a3d0b25a6f4a -
Trigger Event:
workflow_dispatch
-
Statement type: