--- name: display-captions description: Displaying captions in Remotion with TikTok-style pages and word highlighting metadata: tags: captions, subtitles, display, tiktok, highlight --- # Displaying captions in Remotion This guide explains how to display captions in Remotion, assuming you already have captions in the `Caption` format. ## Prerequisites First, the @remotion/captions package needs to be installed. If it is not installed, use the following command: ```bash npx remotion add @remotion/captions # If project uses npm bunx remotion add @remotion/captions # If project uses bun yarn remotion add @remotion/captions # If project uses yarn pnpm exec remotion add @remotion/captions # If project uses pnpm ``` ## Creating pages Use `createTikTokStyleCaptions()` to group captions into pages. The `combineTokensWithinMilliseconds` option controls how many words appear at once: ```tsx import {useMemo} from 'react'; import {createTikTokStyleCaptions} from '@remotion/captions'; import type {Caption} from '@remotion/captions'; // How often captions should switch (in milliseconds) // Higher values = more words per page // Lower values = fewer words (more word-by-word) const SWITCH_CAPTIONS_EVERY_MS = 1200; const {pages} = useMemo(() => { return createTikTokStyleCaptions({ captions, combineTokensWithinMilliseconds: SWITCH_CAPTIONS_EVERY_MS, }); }, [captions]); ``` ## Rendering with Sequences Map over the pages and render each one in a ``. Calculate the start frame and duration from the page timing: ```tsx import {Sequence, useVideoConfig, AbsoluteFill} from 'remotion'; import type {TikTokPage} from '@remotion/captions'; const CaptionedContent: React.FC = () => { const {fps} = useVideoConfig(); return ( {pages.map((page, index) => { const nextPage = pages[index + 1] ?? null; const startFrame = (page.startMs / 1000) * fps; const endFrame = Math.min( nextPage ? (nextPage.startMs / 1000) * fps : Infinity, startFrame + (SWITCH_CAPTIONS_EVERY_MS / 1000) * fps, ); const durationInFrames = endFrame - startFrame; if (durationInFrames <= 0) { return null; } return ( ); })} ); }; ``` ## Word highlighting A caption page contains `tokens` which you can use to highlight the currently spoken word: ```tsx import {AbsoluteFill, useCurrentFrame, useVideoConfig} from 'remotion'; import type {TikTokPage} from '@remotion/captions'; const HIGHLIGHT_COLOR = '#39E508'; const CaptionPage: React.FC<{page: TikTokPage}> = ({page}) => { const frame = useCurrentFrame(); const {fps} = useVideoConfig(); // Current time relative to the start of the sequence const currentTimeMs = (frame / fps) * 1000; // Convert to absolute time by adding the page start const absoluteTimeMs = page.startMs + currentTimeMs; return (
{page.tokens.map((token) => { const isActive = token.fromMs <= absoluteTimeMs && token.toMs > absoluteTimeMs; return ( {token.text} ); })}
); }; ```