فصل المصادر
يقسّم Open-Unmix HQ مقطعًا موسيقيًا ستيريو إلى أربع طبقات مستقلّة — vocals وdrums وbass وother. تنتج أربعة نماذج BiLSTM مستقلّة (واحد لكل طبقة) أقنعة بمقدار فوق STFT الخلطة؛ ويعمل مرشّح Wiener اللاحق الاختياري على التوفيق بينها. يعمل النموذج على Apple Silicon عبر MLX.
يتوفّر محرّكان: Open-Unmix HQ (خفيف، وهو الافتراضي) وHTDemucs (Demucs v4) — نموذج Hybrid Transformer أعلى جودة يُختار عبر --engine htdemucs. يعمل كلاهما على Apple Silicon عبر MLX ويُخرجان الطبقات الأربع نفسها بمعدّل 44.1 kHz.
ما هو
- 4 طبقات لكل مقطع — vocals وdrums وbass وother. كل ملف طبقة بقناتين بمعدّل 44.1 كيلوهرتز.
- نموذج إخفاء بمقدار — يتنبأ كل نموذج طبقة بقناع غير سالب يُطبّق على طيف الخلطة، ويُؤخذ الطور من الخلطة.
- مرشّح Wiener اللاحق (اختياري) — تنقيح بقناع ناعم عبر الطبقات الأربع كي تتجمّع بترابط لتعطي الخلطة. يضيف نحو 0.5 ديسيبل من SDR.
- بصمة صغيرة — 8.9 مليون معامِل لكل طبقة، ~136 ميغابايت إجمالًا للطبقات الأربع.
- Apache-2.0 — الأوزان الأصلية تحت رخصة MIT، وتحويلنا إلى CoreML/MLX تحت Apache-2.0.
المعمارية
أربع طبقات مستقلّة، كلٌّ منها نسخة من الشبكة نفسها:
| المرحلة | الشكل / العملية |
|---|---|
| STFT | FFT بـ 4096 نقطة، قفزة 1024، نافذة Hann دورية مع reflect-pad. 2049 حزمة تردّد لكل إطار. |
| تطبيع الدخل | قصّ إلى 1487 حزمة (≈16 كيلوهرتز)، وتطبيق متوسّط ومقياس مكتسبَين لكل حزمة من التدريب. |
| المُرمِّز | Linear 2974 → 512 + BatchNorm + tanh. الدخل قناتان × 1487 حزمة. |
| BiLSTM | 3 طبقات، 256 وحدة مخفية لكل اتجاه (512 فعليًا). يلتقط السياق الزمني عبر الإطارات. |
| المُفكِّك | دمج تخطّي (Skip-concat) لمخرجات المُرمِّز وLSTM (1024) → Linear 1024 → 512 + BN + ReLU → Linear 512 → 4098. |
| إلغاء تطبيع المخرج + قناع | ضرب عنصري بمقدار الخلطة، طور من الخلطة، ثم iSTFT بتراكب وإضافة. |
| Wiener (اختياري) | أقنعة نسبة قدرة عبر تقديرات الطبقات الأربع. يحسّن الطور حتى تتجمّع الطبقات لتعطي الخلطة. |
النموذج
| المكوّن | القيمة |
|---|---|
| المعامِلات لكل طبقة | 8.9 مليون |
| إجمالي المعامِلات (4 طبقات) | ~35.6 مليون |
| معدّل العيّنات | 44.1 كيلوهرتز ستيريو |
| زمن استجابة القطعة | دون اتصال (STFT للمقطع كاملًا) |
| الأوزان | aufklarer/OpenUnmix-HQ-MLX (safetensors، ~136 ميغابايت) |
| المصدر الأصلي | sigsep/open-unmix-pytorch (Stöter et al., JOSS 2019) |
HTDemucs (Demucs v4)
For higher separation quality — especially on bass and drums — the package also ships HTDemucs, Meta's Hybrid Transformer Demucs. It merges a spectrogram branch and a waveform branch through a cross-domain transformer; the shipped htdemucs_ft variant is a bag of four fine-tuned sub-models, one per stem. Weights download from HuggingFace on first use. On a directional MUSDB-sample benchmark (museval / BSSEval v4) it averages +3.01 dB SDR over UMX-HQ, with the biggest gains on bass (+5.75 dB).
| Component | Value |
|---|---|
| Parameters | 168M (4 × 42M fine-tuned sub-models) |
| Sample rate | 44.1 kHz stereo |
| Windowing | 7.8 s segments, 25% overlap, triangular cross-fade |
| Weights | aufklarer/HTDemucs-FT-MLX (fp16, ~320 MB) |
| Upstream | facebookresearch/demucs (Rouard et al., ICASSP 2023) |
بداية سريعة — Swift
import SourceSeparation
import AudioCommon
let separator = try await SourceSeparator.fromPretrained()
let stereo = try AudioFileLoader.loadStereo(
url: URL(fileURLWithPath: "song.wav"),
targetSampleRate: 44100
)
let stems = separator.separate(audio: stereo, sampleRate: 44100)
// stems[.vocals], stems[.drums], stems[.bass], stems[.other]
// Each is [[Float]] — left channel, right channel.
try WAVWriter.writeStereo(
left: stems[.vocals]![0],
right: stems[.vocals]![1],
sampleRate: 44100,
to: URL(fileURLWithPath: "vocals.wav")
)
مرّر wiener: true (الافتراضي) للحصول على أفضل جودة. مرّر targets: [.vocals] لاستخراج مجموعة فرعية من الطبقات فقط وتخطّي بقيّة النماذج.
CLI
speech separate song.wav # all 4 stems into song_stems/ (Open-Unmix)
speech separate song.wav --engine htdemucs # Demucs v4 — higher quality
speech separate song.wav --engine htdemucs --htdemucs-precision int8 # smaller int8 bundle
speech separate song.wav --stems vocals # vocals only
speech separate song.wav --stems vocals,drums # subset
speech separate song.wav --output-dir /tmp/stems/ # custom output dir
speech separate song.wav --verbose # show timing
متى تستخدمه
…تحتاج إلى تمريرة فصل مصادر خفيفة دون اتصال داخل تطبيق أو خط أنابيب على Apple Silicon. تُبقي 8.9 مليون معامِل لكل طبقة حجم التنزيل والذاكرة معتدلَين. يعطي الإخفاء بمقدار مع Wiener طبقات جيّدة في معظم محتوى البوب والروك. ولعزل صوتي بأحدث المستويات على المحتوى الاستوديوي، انتقل إلى محرّك HTDemucs (Demucs v4) المُضمَّن عبر --engine htdemucs؛ ويبقى Open-Unmix الطرف الخفيف القابل للشحن داخل تطبيقك من هذه المقايضة.