ComfyUI Node

Check Vocals

'Instrumental' Is a Request, Not a Promise — Measure the Takes Instead

By jplenio·Created a day ago·Updated about 13 hours ago· 2
Check Vocals
  • audio
  • audio_encoder
  • brief
  • audio
  • passed
  • report
  • takes
◄tolerance_seconds0.0►

What it is

Ask a music model for an instrumental and it will usually give you one. Usually. What it may also give you is a hum, a vowel-ish pad, or a choir that wandered in from the style prompt. Check Vocals exists for exactly that gap, and the pack's documentation is refreshingly honest about it: instrumental conditioning is guaranteed, instrumental audio is measured.

So this node measures. Give it one take or a list of takes, and it re-transcribes them with SheetSage2, counts the notes landing in the vocal track, and passes on the best one - the first take with no vocal notes, or the least vocal one if none is clean. It also flags takes that end while the music is still playing, which catches the other common YuE2 failure mode: running to the length ceiling and stopping mid-phrase.

How it works

The mechanism is a second opinion from a transcription model. SheetSage2 separates what it hears into voices; notes in its vocal track are, functionally, evidence of singing. The node reads those, converts them into a vocal reading for the take, and judges.

tolerance_seconds is the knob, and its default of 0 is meaningful: any vocal note fails the take. That default was calibrated against the author's own listening across 25 takes - it flagged 6 of the 8 takes that had an audible voice and, importantly, flagged no clean take. Loosen it if an instrument with a voice-like timbre keeps tripping the check; keep it at zero if you'd rather reject a good take than ship a hum.

Long takes are read in pieces (one native SheetSage2 window at a time) rather than all at once, which is what keeps memory sane. The encoder input must be SheetSage2 - anything else is refused with a message naming the file you need.

Two behaviours worth wiring deliberately. If brief is connected and says the song is sung, the node skips the whole check and passes the first take straight through, reporting sung song: no vocal check. And the input is a list input: it consumes the accumulated takes from a loop (YuE2 Takes renders seeds take seed, take seed + 1, and so on).

Inputs and outputs

Required: audio (one take, or the list from a loop), audio_encoder (SheetSage2 - the cover path's loader can be reused), and tolerance_seconds (0–60, step 0.5). Optional: brief.

Outputs: audio (the best take - that's what goes to mastering), passed (true when the best take has no vocal notes), report (per-take measurements, the verdict, and its limits) and takes (a list output, best first, which you wire into Preview Audio if you want to listen to all of them yourself).

passed is the one to branch on. Route it into a switch, or just watch it: a false here with a takes list is your cue to go listen.

Install

# ComfyUI Manager → search "Plenio Music Production System" → Install → restart
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/Plenio-Music-Production-System

Requires ComfyUI 0.37.0+ and the SheetSage2 encoder file, which is also what the cover path needs:

ComfyUI/models/audio_encoders/sheetsage2_bf16.safetensors   (1.4 GB, CC BY-NC 4.0 - non-commercial)

No Python packages are installed by the pack.

Common issues

  • "Check Vocals needs the SheetSage2 audio encoder." The file is missing or the encoder isn't SheetSage2. Load sheetsage2_bf16.safetensors with Audio Encoder Loader and connect it.
  • A clean take failed. A breathy instrument or an unusually voice-like synth can be read as a vocal. Raise tolerance_seconds a little, and listen before you trust the verdict - the node says "a measurement, not a guarantee" and means it.
  • A take with a quiet hum passed. Also documented: humming below the transcription's threshold slips through. There's no vocal removal hiding behind this node; it measures, it doesn't repair.
  • The check cost more than the render. N takes means N renders and N transcriptions. Nothing is retried automatically, so decide how many takes you're willing to pay for before you set the loop count.
CategoryPlenio/Audio analysis

Inputs (4)

NameTypeDefaultDescription
audioAUDIOOne take, or the list of takes from a loop (End Loop, accumulate).
audio_encoderAUDIO_ENCODERSheetSage2 (the cover path's loader can be reused).
tolerance_secondsFLOAT0.00–60Seconds of vocal-like notes still accepted. 0 = any vocal note fails (calibrated against the owner's listening, Phase 4A).
briefoptPLENIO_BRIEFSung songs are not checked.

Outputs (4)

NameTypeDescription
audioAUDIOThe best take.
passedBOOLEANTrue when the best take has no vocal notes.
reportPLENIO_REPORTPer-take measurements, the verdict and its limits.
takesAUDIOAll takes, the best first (connect a Preview Audio to listen to every take).