arkennemasis Word Timings (real caption sync, from the audio)
Captions that light up the word actually being spoken
- narration
- word_timings
- transcript
- word_count
- report
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-v3is 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
enabledis actually on. The estimate is good enough that it's easy to miss you're running it. And make sure thenarrationaudio 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.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| narration | AUDIO | The finished voice track — the same audio that goes into the video, so the timings line up with what is heard. | |
| model | COMBO | large-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. | |
| language | COMBO | Naming the language is slightly more reliable than letting Whisper detect it on a short clip. | |
| enabledopt | BOOLEAN | true | Off 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)
| Name | Type | Description |
|---|---|---|
| word_timings | STRING | — |
| transcript | STRING | — |
| word_count | INT | — |
| report | STRING | — |