← Gallery Fingerprint vocal matching (supervised)

Fingerprint vocal matching — supervised, stem-guided, on a known synthetic mix

scripts/xa-vocal-separation.js

Hear a "vocal" get lifted out of a mix: the library learns EQ curves from the vocal's spectral fingerprint, applies them to the mixture, and you can play the vocal, the backing, the mix, and the reconstruction below. Because both parts are synthesized — the vocal is a 440 Hz carrier with 5 Hz vibrato ±30 cents and 2 harmonic partials, the backing a 110 Hz bass plus a 4 Hz click train, mixture = sum — everything is measured against the known parts. Pipeline: processAudioToFingerprints on vocal and mixture → optimizeEqCurves (100 iters) → reconstructVocal on the mixture STFT. Honest framing: this pipeline is supervised — it is handed the true vocal (its fingerprints are the optimization target) and is scored against the very parts it was given. That demonstrates stem-guided spectral matching, not blind separation; the unsupervised baseline is REPET-SIM (decompose.nn_filter + decompose.softmask) and HPSS (decompose.hpss), compared head-to-head in the real-stems demos. Honest note: the optimizer is plain full-batch gradient descent with NO input normalization — stability requires lr < 1/max(|STFT|)². At the natural signal levels here that means lr = 1e-5 (verified headless in Node: lr 0.01 slams the EQ against its clip bounds and the loss oscillates 294↔594 instead of descending).

suppression scoreboard

mixture |STFT| (0–2.6 kHz)

reconstruction |STFT| (0–2.6 kHz) — bass line + clicks should fade, vibrato partials stay

optimizer loss (external evaluation at checkpoints k = 0,10,…,100)