Datasets:
The dataset viewer is not available for this dataset.
Error code: JWTInvalidSignature
Exception: InvalidSignatureError
Message: Signature verification failed
Traceback: Traceback (most recent call last):
File "/src/libs/libapi/src/libapi/jwt_token.py", line 286, in validate_jwt
decoded = jwt.decode(
jwt=token,
...<2 lines>...
options=options,
)
File "/usr/local/lib/python3.14/site-packages/jwt/api_jwt.py", line 368, in decode
decoded = self.decode_complete(
jwt,
...<8 lines>...
leeway=leeway,
)
File "/usr/local/lib/python3.14/site-packages/jwt/api_jwt.py", line 265, in decode_complete
decoded = self._jws.decode_complete(
jwt,
...<3 lines>...
detached_payload=detached_payload,
)
File "/usr/local/lib/python3.14/site-packages/jwt/api_jws.py", line 270, in decode_complete
self._verify_signature(
~~~~~~~~~~~~~~~~~~~~~~^
signing_input,
^^^^^^^^^^^^^^
...<4 lines>...
options=merged_options,
^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.14/site-packages/jwt/api_jws.py", line 417, in _verify_signature
raise InvalidSignatureError("Signature verification failed")
jwt.exceptions.InvalidSignatureError: Signature verification failedNeed help to make the dataset viewer work? Make sure to review how to configure the dataset viewer, and open a discussion for direct support.
StemSplit Stem-Separation Benchmark 2026
A reproducible head-to-head comparison of every popular open-source music source-separation model against the StemSplit production API, evaluated on the standard MUSDB18-HQ test split using BSS Eval v4 and a small set of CC-BY tracks for qualitative listening.
Built and maintained by the StemSplit team. Source code:
scripts/hf-benchmarkon GitHub.
Leaderboard (median SDR per stem)
| model_id | bass | drums | other | vocals |
|---|---|---|---|---|
| htdemucs_ft | 10.38 | 10.11 | 6.34 | 9.19 |
| mdx_extra_q | 11.42 | 11.49 | 7.67 | 9.04 |
| htdemucs_6s | 9.11 | 9.54 | 5.74 | 8.66 |
| htdemucs | 9.78 | 10.01 | 6.42 | 8.53 |
| mdx_net_inst_hq3 | — | — | — | 5.81 |
Higher is better. SDR is computed with the museval reference implementation
(BSS Eval v4) on 1-second windows, exactly the protocol used by SiSEC and the
SDX challenges, so these numbers are directly comparable to results reported
in the literature.
Configurations
metrics_only (the leaderboard)
A Parquet table — one row per (model, track, stem) — for the full 50-track
MUSDB18-HQ test split. No audio is shipped here; MUSDB18 is a research-only
corpus and we are not allowed to redistribute it.
Schema:
| column | type | meaning |
|---|---|---|
model_id |
string | matches configs/models.yaml |
track_id |
string | folder name in musdb18hq/test/ |
stem |
string | one of vocals, drums, bass, other |
sdr_median |
float | median Signal-to-Distortion Ratio (dB) |
sdr_mean |
float | mean SDR (dB) |
isr_median |
float | median Image-to-Spatial Ratio (dB) |
sir_median |
float | median Signal-to-Interferences Ratio (dB) |
sar_median |
float | median Signal-to-Artifacts Ratio (dB) |
n_frames |
int | number of evaluation windows |
sample_rate |
int | typically 44100 |
duration_s |
float | input track length in seconds |
wall_time_s |
float | inference wall time |
rtf |
float | real-time factor (wall_time / duration) |
peak_rss_mb |
int | peak resident memory of the runner process |
peak_mps_mem_mb |
int | peak Metal allocation (Apple Silicon only) |
host_chip |
string | e.g. Apple M4 Pro |
host_unified_memory_gb |
string | unified memory size on the test machine |
commit_sha |
string | repo SHA the run was produced from |
from datasets import load_dataset
ds = load_dataset("StemSplitio/stem-separation-benchmark-2026", "metrics_only")
df = ds["results"].to_pandas()
df.groupby(["model_id", "stem"])["sdr_median"].median().unstack()
audio_samples (planned for v1.2)
A future config will ship a small set of CC-BY-licensed clips with reference and predicted stems, so you can A/B them in the dataset viewer. Sourcing genuinely commercial-friendly 4-stem multitracks in 2026 is non-trivial; see the v1.2 sourcing notes for the plan.
Models
v1.1 (this release)
All five models below produced complete results on the full 50-track MUSDB18-HQ test split.
| id | family | notes |
|---|---|---|
htdemucs |
Hybrid Transformer Demucs | Facebook AI's default 4-stem model |
htdemucs_ft |
Hybrid Transformer Demucs | Fine-tuned variant, best vocal/instrumental separation in the Demucs family |
htdemucs_6s |
Hybrid Transformer Demucs | 6-stem model (adds piano + guitar). Its other-row SDR is now computed against piano + guitar + other summed back together — see the Changelog for details. |
mdx_extra_q |
Demucs MDX | MDX challenge winner, quantised, 4-model ensemble — best bass and drums of the lineup |
mdx_net_inst_hq3 |
MDX-Net | Vocal isolator running through audio-separator with the CoreML ONNX provider on Apple Silicon. Only the vocals row is reported (it does not produce drums/bass/other). |
Planned for v1.2
| id | family | why deferred |
|---|---|---|
bs_roformer |
Band-Split Roformer | Current SOTA but slow on Apple MPS due to operator fallbacks (~11 hr for the full test set). Will add once we run on CUDA. |
mel_band_roformer |
Mel-Band Roformer | Same reason. |
spleeter_4stems |
Spleeter | Legacy baseline; TensorFlow install is brittle on Apple Silicon. |
See configs/models.yaml on GitHub for exact versions
and command lines.
Changelog
v1.1 (current)
- Added
mdx_net_inst_hq3(vocals-only MDX-Net viaaudio-separatorwith the CoreML ONNX execution provider). - Fixed
htdemucs_6sother-stem evaluation. The 6-stem model splits piano and guitar out ofother; the v1 eval pass compared its residualotheroutput directly to MUSDB'sotherand got a misleading 0.22 dB. v1.1 sums the model'spiano + guitar + otherpredictions back together before SDR, sohtdemucs_6sis now directly comparable to its 4-stem siblings. - New
prediction_componentscolumn on every row records the WAV files that were summed to form each stem (e.g.vocalsorother+piano+guitar), so the aggregation is fully auditable.
v1
- Initial release: 4 Demucs-family models × 50 MUSDB18-HQ tracks = 800 rows.
- Known issues (both fixed in v1.1): missing
mdx_net_inst_hq3,htdemucs_6sother-stem evaluation artefact.
What StemSplit uses internally
The StemSplit hosted API runs HT-Demucs under the hood — the same models you can benchmark above. Pick a quality tier and look up its row in the leaderboard:
| StemSplit tier | Model row in this benchmark | When to choose it |
|---|---|---|
FAST |
htdemucs |
Speed-priority previews and bulk processing |
BALANCED (default) |
htdemucs_ft |
Best vocal separation per second of compute |
BEST (6-stem) |
htdemucs_6s |
When you need piano + guitar separately |
In other words: this dataset is also a benchmark of StemSplit's own
quality. We didn't add a separate stemsplit_api row because it would
just duplicate those numbers.
Use the StemSplit API
If you'd rather not stand up Demucs, ffmpeg, torchcodec, and a GPU yourself, the StemSplit API ships the same models with a single HTTP call. Pricing, quotas, and the full feature set are documented in our developer portal:
| Resource | URL |
|---|---|
| 🏠 Developer landing | stemsplit.io/developers |
| 📘 Getting-started docs (auth, upload, polling) | stemsplit.io/developers/docs |
| 📑 API reference (every endpoint, every field) | stemsplit.io/developers/reference |
| 🧩 Integration guides (Zapier, n8n, Make, Pipedream, Discord, Audacity, DJ workflows, ...) | stemsplit.io/developers/guides |
Minimal example — submit a job, poll, download stems:
# 1. Submit
JOB=$(curl -sS -X POST https://stemsplit.io/api/v1/jobs \
-H "Authorization: Bearer $STEMSPLIT_API_KEY" \
-F "[email protected]" \
-F "stems=4")
JOB_ID=$(echo "$JOB" | jq -r .id)
# 2. Poll until completed
while [ "$(curl -sS https://stemsplit.io/api/v1/jobs/$JOB_ID \
-H "Authorization: Bearer $STEMSPLIT_API_KEY" | jq -r .status)" != "completed" ]; do
sleep 3
done
# 3. Download every stem
curl -sS https://stemsplit.io/api/v1/jobs/$JOB_ID \
-H "Authorization: Bearer $STEMSPLIT_API_KEY" \
| jq -r '.stems | to_entries[] | "\(.key) \(.value)"' \
| while read stem url; do curl -sSL "$url" -o "$stem.wav"; done
→ Get an API key at stemsplit.io/developers.
Reproducing the results
Everything runs locally on a Mac with Apple Silicon — no CUDA required.
git clone https://github.com/yourusername/musicai
cd musicai/scripts/hf-benchmark
uv venv --python 3.11 && source .venv/bin/activate
uv pip install -e .
# 1. Get the data (~22 GB extracted from a 21 GB Zenodo zip)
python -m src.download_musdb
# 2. Run every enabled model on every track
python -m src.run_all --continue-on-error
# 3. Score with BSS Eval v4
python -m src.eval_metrics
# 4. Assemble the HF dataset (and optionally push)
python -m src.build_dataset
python -m src.push_to_hub --create
Reference wall times measured on an Apple M4 Pro (24 GB unified memory), PyTorch 2.11 with the MPS backend, for the v1.1 lineup. Demucs models use MPS; MDX-Net runs through ONNX Runtime's CoreML execution provider.
| Stage | Wall time |
|---|---|
| Download MUSDB18-HQ from Zenodo | 32 min |
| Separate (5 models × 50 tracks) | ~2 h 30 min |
| Eval (museval BSS Eval v4) | ~2 h 20 min |
| Build dataset | < 1 s |
| Total | ~5 h 20 min |
Why we built this
We run StemSplit — a hosted stem-separation service — and we needed an honest, public, reproducible way to compare ourselves to the state of the art. So we open-sourced it.
Want to ship a separation product without standing up GPU infrastructure? The same models are one HTTP call away — see the Use the StemSplit API section above, or jump straight to the developer docs and API reference.
Licensing
- This dataset (the metrics, the dataset card, and the CC-BY audio samples) is released under CC-BY-4.0 — please cite us if you use it.
- The MUSDB18-HQ audio referenced by
metrics_only.track_idis not redistributed here. Download it from Zenodo under its own terms. - Each separation model retains its own license; see the table above.
Citation
@misc{stemsplit_benchmark_2026,
title = {StemSplit Stem-Separation Benchmark 2026},
author = {StemSplit},
year = {2026},
url = {https://huggingface.co/datasets/StemSplitio/stem-separation-benchmark-2026}
}
- Downloads last month
- 16