Remotion · Troubleshooting

How to Add Captions to a Remotion Video (Word-Level, Not Chunked)

There are two fundamentally different ways to build captions in Remotion, and only one of them produces true word-by-word timing.

The two approaches

The simple approach renders a static block of text per Sequence, timed to roughly when a sentence or phrase starts — easy to build, but the reveal timing is only as accurate as your estimate of when that phrase begins, and it doesn't support true word-by-word animation.

The accurate approach uses a transcript with real per-word timestamps — commonly produced by Whisper with word-level timing enabled — and renders each word's visibility as a function of the current frame compared to that word's actual start and end time.

The core pattern

const { fps } = useVideoConfig(); const frame = useCurrentFrame(); const currentTimeMs = (frame / fps) * 1000; const activeWord = words.find( (w) => currentTimeMs >= w.startMs && currentTimeMs < w.endMs );

This checks, on every rendered frame, which word (if any) from your transcript is the one being spoken at that exact moment — the visual reveal is then driven directly by that lookup, not by an estimated duration.

Where the word-level timestamps come from

You need a transcription step that outputs per-word timing, not just per-sentence. Whisper supports this with word-level timestamps enabled; the output format typically gives you a list of words each with a start and end time in seconds, which you convert to milliseconds or frames before using them in the lookup above.

Why the distinction matters more than it seems

The visual difference between chunked and true word-level captions is subtle in a still frame but obvious in motion — a word-level caption changes exactly on the syllable, while an estimated one drifts by a fraction of a second in a way viewers notice without being able to say why.

Skip the debugging

The NULLFRAME kit uses exactly this word-level lookup pattern, wired to real transcription output — built once, so you don't rebuild the timing logic per video.

Get the kit

Common questions

Do I need Whisper specifically, or does any transcription tool work?+
Any tool that outputs word-level (not just sentence-level) timestamps works — Whisper is simply the most common and accessible one that supports this mode.
How do I highlight the current word differently from the rest?+
Compare each word's index or timing against the active word found in the lookup, and conditionally apply a different style — color, scale, weight — to that one word.
Does this approach work for languages other than English?+
Yes, as long as your transcription tool supports word-level timestamps for that language — Whisper supports many languages with this feature.