Nodes/SDXL Auto Prompter/APNext H3 Lyrics Transcribe (timed lyrics from the song)
ComfyUI Node

APNext H3 Lyrics Transcribe (timed lyrics from the song)

Timed lyrics without typing a single line

By dagthomas·Created 3 years ago·Updated about 23 hours ago· 290
APNext H3 Lyrics Transcribe (timed lyrics from the song)
  • audio
  • lyrics
  • count
  • info

The dagthomas music-video pipeline can cut your video before a lyric line and tell the writer to stage the exact words - but only if somebody gets the lyrics out of the song first, with timestamps. That somebody is H3LyricsTranscribe. It runs Whisper on the song and hands you timed [m:ss] line rows that feed the Cut Plan and the writer, so "cut before the chorus lands" is something the workflow actually understands instead of a vibe.

How it works

It's Whisper's large-v3-turbo model, driven directly through the transformers library that ComfyUI already ships. The first run downloads the model from Hugging Face - roughly 1.6 GB - into the HF cache, so budget that once. After that, two details are worth knowing:

  • It's cached per waveform: re-queuing the same song is free, because the transcription is keyed to a fingerprint of the audio, not re-run.
  • The model is released after every run, so it's not squatting on your VRAM while the render happens.

It deliberately bypasses the automatic-speech-recognition pipeline because that pipeline pulls in torchcodec when it's installed, which dies on the portable Windows build looking for shared FFmpeg DLLs. The direct processor + generate route avoids that whole class of crash.

The input that matters

There's exactly one input - audio - and no optional knobs at all. The whole node is: drop the song in, get lyrics out.

The tooltip makes the one real choice for you: feed it the vocal stem (AudioSeparation's vocals), not the full mix. Whisper transcribes a separated vocal track noticeably cleaner than a compressed master with drums and bass underneath. If your workflow already splits stems, this is where the vocal stem earns its keep.

Outputs

  • lyrics - timed lyrics, one [m:ss] line per row. This is the wire that matters: it goes into both the Cut Plan's lyrics_in (with segment_mode = Lyric lines, cuts land right before the lines) and the Music Video Writer's lyrics_in, so the whole chain follows the same words. The text boxes on those nodes stay editable next to the socket - whatever you type wins - so a misheard line is fixed by hand without unplugging anything.
  • count - how many lines were heard.
  • info - what happened (model, timing, any issues).

Why this node and not the writer's built-in transcription

The Music Video Writer can transcribe on its own - but it does it last, after the scenes are being written. This node exists so the words are known before the cuts are placed, which is the whole point: you can't cut on a lyric line you haven't discovered yet. Put it early in the graph and the entire downstream chain is lyric-aware.

Installing

It's part of the dagthomas pack. ComfyUI Manager → search "comfyui_dagthomas" → Install, then restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt

No extra pip package - Whisper rides on the transformers that ship with ComfyUI. The only real cost is that first-run 1.6 GB model download and a few seconds of transcription per song. There's also a known Whisper quirk to keep in mind: it invents subtitle-credit hallucinations during instrumental stretches ("subtitles by…", "thanks for watching"). The node strips the common ones automatically, but if you see weird credits in the output, that's Whisper being Whisper, not your audio being wrong.

Categorycomfyui_dagthomas/H3

Inputs (1)

NameTypeDefaultDescription
audioAUDIOThe song - or better, its vocal stem (AudioSeparation's vocals): Whisper transcribes a stem noticeably cleaner than the full mix.

Outputs (3)

NameTypeDescription
lyricsSTRINGTimed lyrics, one `[m:ss] line` per row - wire into the Cut Plan's and the writer's `lyrics_in` socket.
countINTHow many lines were heard.
infoSTRINGWhat happened.