Nodes/arkennemasis Nodes/arkennemasis Word Timings (real caption sync, from the audio)
ComfyUI Node

arkennemasis Word Timings (real caption sync, from the audio)

Captions that light up the word actually being spoken

By Hishamahmer·Created about a month ago·Updated a day ago· 6
arkennemasis Word Timings (real caption sync, from the audio)
  • narration
  • word_timings
  • transcript
  • word_count
  • report
model
language
enabledtrue

If you've ever watched a video where the karaoke-style subtitle is hilariously out of sync - the highlight bar sweeping across words the narrator finished a second ago - you've seen the problem ArkWordTimings solves. The pack's moving caption styles (karaoke, highlight, underline, word-by-word) need to know when each word is spoken. A video model gives you no word timestamps, so normally they're estimated from the script and the clip's duration, weighted by word length and punctuation. That estimate tracks speech closely - right up until the model ad-libs, pauses, or speeds up, and then it drifts.

This node replaces the guess with the truth: it transcribes the finished narration with Whisper and returns real word timings, measured from the actual audio. Wire it into ArkVideoAssemble's word_timings and the moving captions mark the real word.

How it works

The narration input is the finished voice track - the same audio that goes into the video, so the timings line up with what's heard. The node runs it through Whisper and extracts per-word timestamps.

The choices that matter:

  • model - openai/whisper-large-v3 is the default, and the tooltip is blunt about why: it's the accurate one, and the smaller models' timestamps are looser, "which defeats the point of this node." The large model is a heavy load, but you're not running it for fun - you're running it for sync.
  • language - auto, or one of 11 named languages. Naming it is slightly more reliable than letting Whisper detect on a short clip, and it matters more for speech that's less well-represented.
  • enabled - the on/off switch, and it's there for a real reason: Whisper is roughly a 3 GB model load. If you don't care about drift, turn it off and VideoAssemble falls back to the estimate. That's a legitimate choice for a quick local render, not a failure mode.

There's a thoughtful failure behavior worth knowing: if transcription fails, the node falls back loudly to the estimate rather than killing the run. The source comment frames it as the right trade - captions that drift are a blemish; a failed run is a lost video.

Outputs: word_timings (wire into VideoAssemble), transcript (handy for a sanity check of what Whisper heard), word_count, and report.

Installing

cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install replicate httpx

Restart ComfyUI. The Whisper model is downloaded and cached on first use - the tooltip notes the large-v3 model is already cached in this environment, so on a fresh install expect a one-time ~3 GB download.

Troubleshooting

  • Captions still drift: check enabled is actually on. The estimate is good enough that it's easy to miss you're running it. And make sure the narration audio is the same track that's in the video - timings measured from a different render won't line up.
  • Slow first run: it's the model download, not a hang. Give it the 3 GB.
  • Report says "failed - falling back": the video still renders, captions just may drift. It's a graceful degradation by design, not something to panic-fix mid-run.
Categoryarkennemasis/Video

Inputs (4)

NameTypeDefaultDescription
narrationAUDIOThe finished voice track — the same audio that goes into the video, so the timings line up with what is heard.
modelCOMBOlarge-v3 is the accurate one and is already cached here. The smaller models are faster and their timestamps are looser, which defeats the point of this node.
languageCOMBONaming the language is slightly more reliable than letting Whisper detect it on a short clip.
enabledoptBOOLEANtrueOff returns nothing and ArkVideoAssemble falls back to the estimate. Whisper is a ~3 GB model load, so this is the switch for when you do not care about drift.

Outputs (4)

NameTypeDescription
word_timingsSTRING
transcriptSTRING
word_countINT
reportSTRING