Lyric Vocal Presence
Whisper swears someone's singing over the instrumental break — measure it instead
- audio
- reference
- has_vocal
- ratio_db
- info
Whisper hallucinates. Not sometimes - over instrumental passages it will confidently invent vocals, up to a whole sign-off line over the outro. The author's own test track did exactly that. So "the transcript came back non-empty" is not evidence anyone sang. LyricVocalPresence doesn't transcribe at all: it measures. Feed it the vocal stem and the instrumental stem, and it tells you whether this window actually contains singing.
Inputs
- audio (AUDIO, required): the isolated vocal stem - VocalRemovalNode's output 0.
- reference (AUDIO, optional): the instrumental stem - VocalRemovalNode's output 1. Connect it. This is the whole trick.
- threshold_db (FLOAT, default -5): the vocal-minus-instrumental level, in dB, at or above which the window counts as sung.
- floor_db (FLOAT, default -45): an absolute-RMS fallback used only when no reference is connected.
How it works
RMS loudness of each stem in dB, then the ratio: vocal minus instrumental. The ratio is the entire point, and the author measured it on a real track: sung windows ran -1.0 to +4.3 dB, non-sung windows -20.7 to -8.7 dB - a 7.7 dB gap with the -5.0 default parked right in the middle.
Here's why the ratio, not the level. Absolute loudness does not separate singing from silence. On that same track a quiet sung intro sat at -21.9 dB while a non-sung window sat at -22.9 dB - nearly identical. Compare the vocal stem against the instrumental stem and the difference is unmistakable. floor_db exists as the no-reference fallback, but the pack is honest about it being weaker: a quiet sung passage and a noisy silent one overlap. If you can spare the stem split, always connect the reference.
Outputs
- has_vocal (BOOLEAN): the one you gate on.
- ratio_db (FLOAT): the measured vocal-minus-instrumental level - the showcase workflow literally titles its preview "use THIS, not level".
- info (STRING): the measured dB values and the verdict, useful for calibrating
threshold_dbto your own track.
Where it fits
It's the gatekeeper for the rest of the pack. Use has_vocal to decide whether to slice lyrics, patch a transcript, or generate captions - so your pipeline stops emitting lyrics for passages where nobody sang. The stems come from a vocal remover; the pack's own workflow uses tts_audio_suite's VocalRemovalNode with the MelBandRoformer model, output 0 vocal, output 1 instrumental.
Install and gotchas
Same pack as the rest - ComfyUI Manager search "comfyui_lyric_align", or clone https://github.com/bmad4ever/comfyui_lyric_align into custom_nodes and restart. This node needs only the base install (and the stems, which come from whichever vocal-removal pack you already run). No model download here - it's pure dB math on the two stems.
If it misclassifies on your track, don't touch the level - read the info output, find where your sung and non-sung windows actually sit, and set threshold_db to the midpoint of your gap.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | The ISOLATED VOCAL stem, from VocalRemovalNode output 0. | |
| referenceopt | AUDIO | The instrumental stem (VocalRemovalNode output 1). Connect it - the vocal-to-instrumental ratio separates singing from instrumental far more reliably than any absolute level. | |
| threshold_dbopt | FLOAT | -5.0-60–30 | vocal minus instrumental, in dB, at or above which the window counts as sung. Measured on this project's track: sung windows ran -1.0..+4.3 dB, non-sung -20.7..-8.7 dB. -5.0 is the midpoint of that 7.7 dB gap. |
| floor_dbopt | FLOAT | -45-90–0 | Absolute RMS fallback, used only when no reference is connected. Weaker: a quiet sung passage and a noisy silent one overlap. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| has_vocal | BOOLEAN | — |
| ratio_db | FLOAT | — |
| info | STRING | — |