0

Tách stem và gỡ vocal bằng AI: từ phổ STFT, masking đến U-Net (Spleeter) và Hybrid Demucs

Nếu bạn từng muốn tách vocal khỏi phần hòa âm, hoặc lấy riêng trống và bass từ một bản mix, bạn đang đứng trước bài toán music source separation — trong sản xuất nhạc thường gọi là stem splitting hoặc vocal removal. Bài viết đi từ phổ STFT và mặt nạ (mask) tới hai họ mô hình mã nguồn mở đã định hình lĩnh vực này: Spleeter (Deezer, 2019) và Demucs / Hybrid Demucs (Meta / Facebook Research), kèm ví dụ CLI demucs và vài lưu ý về sample rate, GPU cùng artifact.

Một mix, nhiều nguồn

Một bản mix số viết được x(t) = Σ_s y_s(t), với y_s là từng nguồn (vocal, drums, bass, other, …). Mục tiêu là ước lượng ŷ_s chỉ từ x. Đây là bài toán underdetermined: số nguồn nhiều hơn số kênh quan sát (thường chỉ stereo). Mô hình học máy bù đắp bằng cách học cấu trúc phổ–thời gian của từng loại nguồn, chủ yếu trên tập chuẩn MUSDB / MUSDB HQ (Rafii et al.) với bốn stem vocals, drums, bass và other.

Từ dạng sóng đến spectrogram STFT

Nhiều hệ tách nguồn không làm việc trực tiếp trên waveform, mà trên Short-Time Fourier Transform (STFT). Tín hiệu được cắt thành khung ngắn, nhân cửa sổ (thường là Hann), rồi FFT. Hai tham số quan trọng là độ dài khung N (ví dụ 2048 hoặc 4096 mẫu) và hop size H (thường N/4). Kết quả là ma trận phức X(f, t).

Từ đây ta có độ lớn |X(f, t)| — “hình ảnh” năng lượng theo tần số–thời gian, rất hợp với CNN — và pha ∠X(f, t), cần để tái tạo sóng bằng iSTFT (overlap-add). Spleeter làm việc trên phổ độ lớn. Nhiều hệ masking chỉ ước lượng độ lớn của từng nguồn, rồi mượn pha của bản mix. Đây là một nguồn artifact quan trọng: pha mix là pha hỗn hợp, nên transients (hit trống, phụ âm) dễ bị smearing hoặc có tiếng kim loại.

Masking trên mặt phổ

Ý tưởng masking: ước lượng mặt nạ M_s(f, t) cho nguồn s, tính Ŷ_s(f, t) = M_s(f, t) ⊙ X(f, t), rồi iSTFT ra waveform. Hai mốc kinh điển là Ideal Binary Mask (IBM) (1 nếu nguồn s trội tại bin đó, ngược lại 0) và Ideal Ratio Mask (IRM) (tỉ lệ mềm, ví dụ |Y_s| / Σ_k |Y_k|), giữ phần chồng phổ tốt hơn mask nhị phân.

Mạng học sâu không có mask lý tưởng lúc inference, nên nó học soft mask (thường qua sigmoid, giá trị trong [0, 1]). Soft mask giảm “lỗ thủng” trên phổ, nhưng ước lượng sai sẽ để lọt nguồn khác (bleeding) hoặc tạo musical noise — những vệt phổ rời rạc, nghe sắc và không tự nhiên.

U-Net và Spleeter (Deezer, 2019)

Kiến trúc then chốt cho hướng spectrogram là U-Net: encoder giảm dần độ phân giải thời gian–tần số, decoder khôi phục độ phân giải, với skip connection đưa chi tiết tinh từ encoder sang decoder. U-Net vốn từ phân đoạn ảnh y khoa (Ronneberger et al., 2015); Jansson et al. (ISMIR 2017) đưa nó sang tách vocal.

Spleeter (Hennequin, Khlif, Voituret, Moussallam — Deezer, ISMIR 2019 late-breaking, sau đó trên JOSS) đóng gói hướng này thành công cụ dùng được ngay: mỗi stem một U-Net 12 lớp (6 encoder + 6 decoder); đầu vào là spectrogram độ lớn của mix, đầu ra là soft mask; hàm mất mát là L1 giữa spectrogram mix đã nhân mask và spectrogram đích. Có mô hình 2 stem (vocals / accompaniment), 4 stem và 5 stem (thêm piano). Ưu điểm mà nhóm tác giả nhấn mạnh là tốc độ trên GPU (nhanh hơn realtime rất nhiều), phù hợp làm tiền xử lý MIR. Nhược điểm gắn với spectrogram-masking: pha lấy từ mix, và chất lượng không phải lúc nào cũng theo kịp các mô hình waveform/hybrid đời sau khi so trên cùng giao thức đánh giá.

Demucs và Hybrid Demucs

Demucs ban đầu (Défossez et al., Facebook Research) đi hướng ngược lại: U-Net trên waveform, chịu ảnh hưởng Wave-U-Net. Mô hình học trực tiếp trên dạng sóng, không gắn pha mix, nên thường xử lý transients tự nhiên hơn. Phổ rõ về cao độ và hòa âm; waveform mạnh về xung và pha.

Hybrid Demucs (Défossez, Hybrid Spectrogram and Waveform Source Separation, 2021) gộp hai nhánh song song: nhánh tần số giảm dần số bin, nhánh thời gian giảm dần số mẫu. Khi hai biểu diễn cùng shape, chúng được cộng rồi đi qua lớp dùng chung; decoder làm điều ngược lại. Loss luôn tính trên waveform (lan truyền ngược qua iSTFT), nên huấn luyện là end-to-end — mô hình tự quyết định miền nào phù hợp cho từng nguồn. Hybrid Demucs thắng Music Demixing Challenge 2021 khi chỉ huấn luyện trên MusDB.

Bản v4, Hybrid Transformer Demucs (HT Demucs) (Rouard, Massa, Défossez, ICASSP 2023), thay các lớp trong cùng bằng Transformer Encoder xuyên miền: self-attention trong từng miền và cross-attention giữa phổ và sóng. Trong CLI hiện tại, htdemucs là mô hình mặc định. Repo gốc facebookresearch/demucs đã ngừng bảo trì sau khi tác giả rời Meta; fork đang được theo dõi là adefossez/demucs. Cài qua PyPI vẫn dùng gói demucs.

Đánh giá bằng SDR

Metric phổ biến nhất là SDR (Signal-to-Distortion Ratio), thường đo trên MUSDB HQ bằng BSS Eval / museval. SDR so sánh nguồn ước lượng với nguồn chuẩn sau khi tách các thành phần méo, rồi lấy tỉ lệ theo thang dB: càng cao thì càng gần nguồn gốc. Ngoài ra còn SIR (lọt nguồn khác) và SAR (artifact). Một con số SDR chỉ có nghĩa khi đi kèm cùng tập test và cùng giao thức; bài này không trích sẵn bảng xếp hạng. SDR cũng không luôn khớp tai người — chính bài Hybrid Demucs còn bổ sung MOS về chất lượng tự nhiên và mức nhiễm nguồn khác. Khi làm sản phẩm, hãy nghe lại stem: vocal có SDR “đẹp” vẫn có thể hơi méo pha.

Thực hành với Demucs CLI

Yêu cầu Python 3.8 trở lên với bản PyPI cổ điển (fork mới hơn có thể đòi 3.10):

python3 -m pip install -U demucs
python3 -m demucs bai-hat.mp3                          # 4 stem
python3 -m demucs --two-stems=vocals bai-hat.mp3       # vocal + phần còn lại
python3 -m demucs --mp3 --mp3-bitrate 320 bai-hat.mp3
python3 -m demucs -n htdemucs_ft bai-hat.mp3

Kết quả nằm trong separated/<tên-model>/<tên-bài>/ (vocals.wav, drums.wav, bass.wav, other.wav; hoặc vocals.wav và no_vocals.wav). Đầu ra mặc định là WAV stereo 44.1 kHz, int16. Demucs tự resample nếu file gốc khác sample rate.

import demucs.separate

# Tương đương: python3 -m demucs --two-stems vocals --mp3 bai-hat.mp3
demucs.separate.main(["--two-stems", "vocals", "--mp3", "bai-hat.mp3"])

--two-stems không nhanh hơn và không tốn ít bộ nhớ hơn: mô hình vẫn tách đủ các stem, rồi cộng phần còn lại. htdemucs_ft có thể hơi tốt hơn htdemucs, nhưng chậm khoảng bốn lần.

Sample rate, GPU/CPU và artifact

Demucs làm việc và xuất ở 44.1 kHz. Nên đưa WAV/FLAC hoặc MP3 bitrate cao; MP3 nén mạnh đã mất dải cao, mô hình không phục hồi được thông tin đã mất. Nếu còn xử lý trong DAW, dùng --float32 hoặc --int24. Demucs mặc định rescale từng stem để tránh clipping (artifact đôi khi làm đỉnh vượt 0 dBFS); rescale có thể lệch loudness tương đối giữa các stem — muốn giữ quan hệ âm lượng và chấp nhận clip cứng, dùng --clip-mode clamp.

README khuyến nghị khoảng 7 GB VRAM với tham số mặc định, tối thiểu khoảng 3 GB. Hết VRAM thì giảm độ dài đoạn bằng --segment (giây). Với Hybrid Transformer, segment tối đa là 7.8 giây; quá ngắn có thể giảm chất lượng vì mô hình thấy ít ngữ cảnh. Không đủ GPU thì thêm -d cpu; tài liệu ước lượng thời gian CPU khoảng 1.5 lần độ dài bài. --shifts (chạy nhiều lần, mỗi lần dịch ngẫu nhiên rồi trung bình) ổn định hơn nhưng chậm tỉ lệ thuận, chỉ nên bật khi có GPU.

Artifact thường gặp: bleeding (hi-hat dính vocal, vocal dính other), musical noise, mất đuôi reverb. Piano/guitar thường “lọt” sang other ở mô hình 4 nguồn; htdemucs_6s thêm guitar và piano, nhưng README lưu ý nguồn piano vẫn còn nhiều artifact. Hãy nghe cầu nối, beat drop và vocal nhỏ, đừng chỉ đánh giá đoạn verse sạch. Chỉ tách những bản ghi bạn có quyền sử dụng.

Công cụ online nếu không muốn tự cài

Tự chạy Demucs cho phép chọn model, chỉnh --segment / --shifts và xuất WAV float32, nhưng phải cài PyTorch và tải trọng số. Nếu chỉ cần tách nhanh một bài trên máy không có GPU, có thể dùng công cụ online. Ví dụ AI Stem Splitter của Creatune tách một bài thành vocals, drums, bass và other trực tuyến; cùng hướng đó, AI Vocal Remover tập trung vào việc tách vocal khỏi accompaniment. Để so sánh khách quan hoặc làm pipeline lặp lại, môi trường local với demucs vẫn dễ kiểm soát hơn.

Tóm lại

Source separation hiện đại là chuỗi quyết định: biểu diễn (phổ hay sóng), cách tái tạo (mask + pha mix, hay end-to-end trên waveform), và cách đo (SDR kèm nghe kiểm). Spleeter cho thấy U-Net trên spectrogram có thể đủ nhanh để thành công cụ MIR. Hybrid Demucs, rồi HT Demucs, cho thấy việc dùng đồng thời hai miền là hướng đi tự nhiên khi mỗi miền bắt một phần khác nhau của âm nhạc. Nếu mới bắt đầu, hãy tách một bài bạn thuộc lòng bằng python3 -m demucs rồi nghe từng stem — cách đó hiểu bài toán nhanh hơn mọi bảng số.

Tài liệu tham khảo: Jansson et al., ISMIR 2017; Hennequin et al., Spleeter, ISMIR 2019 LBD / JOSS 2020 (deezer/spleeter); Défossez, Hybrid Spectrogram and Waveform Source Separation, 2021 (arXiv:2111.03600); Rouard, Massa, Défossez, Hybrid Transformers for Music Source Separation, ICASSP 2023 (arXiv:2211.08553); Rafii et al., MUSDB HQ. Demucs: facebookresearch/demucs (ngừng bảo trì) và adefossez/demucs.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí