Nodes/comfyui_lyric_align/Lyric Vocal Presence
ComfyUI Node

Lyric Vocal Presence

Whisper swears someone's singing over the instrumental break — measure it instead

By bmad4ever·Created 2 days ago·Updated about 18 hours ago· 0
Lyric Vocal Presence
  • audio
  • reference
  • has_vocal
  • ratio_db
  • info
threshold_db-5.0
floor_db-45

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_db to 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.

Categoryaudio/lyrics

Inputs (4)

NameTypeDefaultDescription
audioAUDIOThe ISOLATED VOCAL stem, from VocalRemovalNode output 0.
referenceoptAUDIOThe instrumental stem (VocalRemovalNode output 1). Connect it - the vocal-to-instrumental ratio separates singing from instrumental far more reliably than any absolute level.
threshold_dboptFLOAT-5.0-60–30vocal 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_dboptFLOAT-45-90–0Absolute RMS fallback, used only when no reference is connected. Weaker: a quiet sung passage and a noisy silent one overlap.

Outputs (3)

NameTypeDescription
has_vocalBOOLEAN
ratio_dbFLOAT
infoSTRING