「どの音源分離モデルが一番いい?」——YouTubeやブログの聴き比べ記事だけでは、数値で比較できません。
StemSplitチームは、オープンソースの音源分離モデルを MUSDB18-HQ(50曲) で同じ条件に揃えて評価した結果を、Hugging Face Datasets として公開しました。
データセット: StemSplitio/stem-separation-benchmark-2026(CC-BY-4.0)
この記事では、データセットの中身・SDRの読み方・Pythonでの集計方法・StemSplitの品質ティアとの対応をまとめます。
このベンチマークで何がわかる?
結論: 4種類のDemucs系モデル(htdemucs / htdemucs_ft / htdemucs_6s / mdx_extra_q)について、曲ごと・ステムごとの SDR(分離品質) と RTF(処理速度) が800行の表として揃っています。自分の曲を入れる前に「ボーカル重視ならどれか」を数値で選べます。
| 項目 | 内容 |
|---|---|
| 評価曲 | MUSDB18-HQ テスト分割 50曲 |
| モデル数 | 4(v1) |
| 行数 | 800(50曲 × 4ステム × 4モデル) |
| 指標 | SDR / ISR / SIR / SAR(BSS Eval v4) |
| 音声ファイル | 含まない(MUSDB18の再配布不可のため) |
| ライセンス | CC-BY-4.0(メトリクス表のみ) |
音声そのものは Zenodo から各自ダウンロードする必要があります。ベンチマークは 分離結果のスコア表 です。
SDRとは?どう読めばいい?
結論: SDR(Signal-to-Distortion Ratio)は「分離したステムがどれだけ元の音に近いか」をdBで表す指標です。高いほど良い です。歌ってみたのオフボーカル用途では、ボーカル行の sdr_median を見るのが最も実用的です。
おおよその目安:
| SDR(dB) | 体感 |
|---|---|
| 0未満 | 分離失敗に近い |
| 0〜5 | ブリードが目立つ |
| 5〜10 | 趣味用途では使える |
| 10〜15 | 制作・リミックス向き |
| 15以上 | かなりクリーン |
関連指標(データセットの列名):
- ISR — 空間情報の歪み
- SIR — 他ステムからの漏れ(干渉)
- SAR — モデルが生んだアーティファクト
論文や SiSEC / SDX と同じ museval 実装・1秒窓で計算しているため、他文献の数値と横並びできます。背景は 音源分離の基礎解説 も参照してください。
リーダーボード(v1・2026年5月時点)
結論: ボーカル中央値では htdemucs_ft が最も高く、ドラム・ベースでは mdx_extra_q が有利です。htdemucs は速度重視のベースラインとしてバランスが良いです。
以下はデータセット metrics_only から 全50曲の sdr_median をモデル×ステムごとに再集計 した値です(Hugging Face上のDataset Viewerと一致します)。
| 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 |
9.78 | 10.01 | 6.42 | 8.53 |
htdemucs_6s |
9.11 | 9.54 | 0.22 | 8.66 |
htdemucs_6s の other 行(0.22 dB)は、6ステムモデルがピアノ・ギターを other から切り出している ため、MUSDB18の参照 other と定義がずれて 過小評価 されます。ピアノ・ギター別ステムが必要な用途では、other 行ではなく vocals / drums / bass を見てください。v1.1では piano + guitar + other を合算して再評価する予定です(データセットカード 参照)。
Spleeter など旧世代モデルとの比較は、別記事 Spleeter vs HTDemucs:Pythonで徹底比較 で扱っています。
Pythonでデータセットを読む
結論: datasets と pandas があれば、数行でリーダーボードを再現できます。
pip install datasets pandas
from datasets import load_dataset
import pandas as pd
ds = load_dataset(
"StemSplitio/stem-separation-benchmark-2026",
"metrics_only",
split="results",
)
df = ds.to_pandas()
# リーダーボード(モデル × ステム の SDR 中央値)
leaderboard = (
df.groupby(["model_id", "stem"])["sdr_median"]
.median()
.unstack()
.round(2)
)
print(leaderboard)
ボーカルだけ・特定モデルだけ抽出
vocals_ft = df[
(df["model_id"] == "htdemucs_ft") & (df["stem"] == "vocals")
]
print(f"ボーカル SDR 中央値: {vocals_ft['sdr_median'].median():.2f} dB")
print(f"RTF 中央値: {vocals_ft['rtf'].median():.3f}")
RTF(Real-Time Factor)は wall_time_s / duration_s です。0.07 なら実時間の約7%(約14倍速)で処理できた、という意味です。Apple M4 Pro + PyTorch MPS 上で計測されたホスト情報は各行の host_chip などに記録されています。
曲ごとのワースト曲を探す
worst_vocals = (
df[df["stem"] == "vocals"]
.sort_values("sdr_median")
.head(10)[["model_id", "track_id", "sdr_median", "rtf"]]
)
print(worst_vocals.to_string(index=False))
「自分のジャンルに近い曲で落ちるモデルはないか」を調べるときに便利です。
スキーマ早見表
| 列 | 意味 |
|---|---|
model_id |
モデル識別子 |
track_id |
MUSDB18-HQ テスト曲フォルダ名 |
stem |
vocals / drums / bass / other
|
sdr_median |
SDR 中央値(dB) |
sdr_mean |
SDR 平均(dB) |
isr_median / sir_median / sar_median
|
副次指標 |
duration_s |
曲長(秒) |
wall_time_s |
推論の実時間(秒) |
rtf |
実時間比 |
peak_rss_mb |
ピークメモリ |
host_chip |
計測マシン(例: Apple M4 Pro) |
StemSplitの品質ティアとの対応
結論: StemSplit のAPIは、このベンチマークと 同じモデルウェイト を使っています。別行 stemsplit_api を用意していないのは、数値が重複するためです。
| StemSplit ティア | ベンチマークの行 | 向いている用途 |
|---|---|---|
| FAST | htdemucs |
プレビュー・大量バッチ |
| BALANCED(既定) | htdemucs_ft |
ボーカル抽出・歌ってみた |
| BEST(6ステム) | htdemucs_6s |
ピアノ・ギターを別ファイルに |
GPUや Demucs の環境構築を省略したい場合は、同じモデルをHTTPで呼べます。
import requests
import time
API_KEY = "your_api_key"
with open("song.wav", "rb") as f:
job = requests.post(
"https://stemsplit.io/api/v1/jobs",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": f},
data={"stems": "4"},
).json()
job_id = job["id"]
while True:
status = requests.get(
f"https://stemsplit.io/api/v1/jobs/{job_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
).json()["status"]
if status == "completed":
break
time.sleep(3)
result = requests.get(
f"https://stemsplit.io/api/v1/jobs/{job_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
).json()
for stem, url in result["stems"].items():
requests.get(url).content # → {stem}.wav として保存
ボーカルだけ欲しい場合は ボーカルリムーバー も利用できます。ローカルで Demucs を動かす手順は Demucsローカルセットアップ を参照してください。
他人の楽曲を無断で分離・アップロードする行為は著作権・各プラットフォームの利用規約に抵触する可能性があります。自分が権利を持つ音源、または利用が許諾された素材に限定してください。
ベンチマークを自分で再現する
結論: リポジトリ scripts/hf-benchmark の手順で、MUSDB18-HQのダウンロード → 全モデル推論 → BSS Eval → HFアップロードまで再現できます(Apple Silicon + MPS、CUDA不要)。
git clone https://github.com/StemSplitio/musicai # 公開先に合わせてURLを確認
cd musicai/scripts/hf-benchmark
uv venv --python 3.11 && source .venv/bin/activate
uv pip install -e .
python -m src.download_musdb # Zenodo から約22 GB
python -m src.run_all --continue-on-error
python -m src.eval_metrics
python -m src.build_dataset
python -m src.push_to_hub --create
M4 Pro(24 GB)での参考所要時間は、分離〜2.5時間 + 評価〜2.5時間程度です。
引用(論文・ブログ向け)
@misc{stemsplit_benchmark_2026,
title = {StemSplit Stem-Separation Benchmark 2026},
author = {StemSplit},
year = {2026},
url = {https://huggingface.co/datasets/StemSplitio/stem-separation-benchmark-2026}
}
まとめ
- stem-separation-benchmark-2026 に、MUSDB18-HQ 50曲・4モデル・800行の再現可能なスコア表がある
-
ボーカル重視なら
htdemucs_ft、ドラム/ベースならmdx_extra_qがリーダーボード上で有利 -
datasets+ 数行の pandas で自分用の比較表を作れる - StemSplit API は同じモデルなので、ベンチマーク行をそのまま品質の目安にできる
フィードバックやモデル追加の要望は、Hugging Face の Community タブ か Qiita のコメントで歓迎します。