Phân tách nguồn

Open-Unmix HQ chia một bản nhạc stereo thành bốn stem độc lập — vocals, drums, bassother. Bốn mô hình BiLSTM độc lập (mỗi mô hình cho một stem) tạo ra các mặt nạ biên độ trên STFT của bản phối; một bộ lọc hậu xử lý Wiener tùy chọn sẽ hòa hợp chúng. Mô hình chạy trên Apple Silicon qua MLX.

Tóm tắt

Kiến trúc

Bốn stem độc lập, mỗi cái là một bản sao của cùng một mạng:

Giai đoạnHình dạng / thao tác
STFTFFT 4096 điểm, hop 1024, cửa sổ Hann tuần hoàn, reflect-pad. 2049 bin tần số mỗi khung.
Chuẩn hóa đầu vàoCắt còn 1487 bin (≈16 kHz), áp dụng trung bình và hệ số chia tỉ lệ trên từng bin đã học khi huấn luyện.
EncoderLinear 2974 → 512 + BatchNorm + tanh. Đầu vào là 2 kênh × 1487 bin.
BiLSTM3 lớp, 256 hidden mỗi chiều (512 hiệu dụng). Bắt ngữ cảnh thời gian qua các khung.
DecoderSkip-concat đầu ra encoder và LSTM (1024) → Linear 1024 → 512 + BN + ReLU → Linear 512 → 4098.
Khử chuẩn hóa đầu ra + mặt nạNhân theo phần tử với biên độ bản phối; pha lấy từ bản phối; iSTFT overlap-add.
Wiener (tùy chọn)Mặt nạ tỉ lệ công suất trên cả 4 ước lượng stem. Tinh chỉnh pha để các stem cộng lại thành bản phối.

Mô hình

Thành phầnGiá trị
Tham số / stem8.9M
Tổng tham số (4 stem)~35.6M
Tần số lấy mẫu44.1 kHz stereo
Độ trễ chunkOffline (STFT toàn bản)
Trọng sốaufklarer/OpenUnmix-HQ-MLX (safetensors, ~136 MB)
Gốcsigsep/open-unmix-pytorch (Stöter và cộng sự, JOSS 2019)

Bắt đầu nhanh — 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")
)

Truyền wiener: true (mặc định) để có chất lượng tốt nhất. Truyền targets: [.vocals] để chỉ trích xuất một tập con các stem và bỏ qua các mô hình còn lại.

CLI

speech separate song.wav                              # all 4 stems into song_stems/
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

Khi nào nên dùng

Open-Unmix phù hợp khi…

…bạn cần một bước phân tách nguồn nhẹ, offline ngay trong ứng dụng hoặc pipeline trên Apple Silicon. 8.9M tham số mỗi stem giữ kích thước tải xuống và bộ nhớ ở mức khiêm tốn. Mặt nạ biên độ kết hợp với Wiener cho ra stem chất lượng tốt trên hầu hết nội dung pop/rock. Để cô lập giọng hát ở mức tốt nhất trên tài liệu phòng thu, bạn sẽ chuyển sang mô hình lớn hơn loại Demucs/MDX-Net; gói này nhắm tới điểm cân bằng thực dụng để mang sản phẩm vào ứng dụng.