Automatic captioning is a solved problem right up to the moment you burn the text into the pixels. After that it stops being a transcription question and becomes a layout question, and layout is where it goes wrong.

We burn captions on every clip we ship — several a day, across six languages — and almost every caption failure we have had was geometric rather than linguistic. The words were right. They were the wrong size, in the wrong place, or running off the edge of the frame. Here is the workflow that stopped it.

Soft subtitles versus burned-in captions

Two different things, and the choice determines everything downstream:

  • Soft subtitles — a separate track or SRT file. Editable forever, switchable off, indexable by the platform. This is the right answer for long-form and for anything on YouTube's main feed.
  • Burned-in captions — the text is part of the picture. Nothing can turn them off, nothing can restyle them, and nothing can fix them later without re-rendering.

Short-form is burned-in territory, because a viewer scrolling with the sound off will never enable a subtitle track. The trade is permanence: pixels cannot be edited after publishing. That single fact should change how carefully you check them, and it is the reason we never put anything volatile — a price, a stock claim, a date — into a burned caption at all. The caption carries the message; the landing page carries the numbers.

AI Video Generator Skool Community Banner

Word-level timestamps are the whole game

Most transcription APIs will return segment-level timings by default: a sentence, a start time, an end time. That is enough for a subtitle file and not enough for captions that sit under a fifteen-second cut.

What you want is word-level timestamps — a start and end for every individual word. With those you can group words into caption cards that break at natural pauses instead of at a fixed character count, and the captions land in time with the delivery rather than a beat behind it. Ask for word timestamps explicitly; several APIs return them only when you request the option.

Two details that matter more than the model you pick:

  • Transcribe the final audio, not the script. If you caption from the script you wrote, every difference between what you wrote and what the voice actually said becomes a caption that is subtly out of sync. Transcribe the rendered voiceover file.
  • Keep two rows maximum. Three rows of caption over a vertical video covers the subject. Two rows, lower third, is the format that reads without eating the picture.
Flat vector diagram of an audio waveform aligned to word blocks showing word level timing

Style: plain white beats every effect

We tried the karaoke look — the word-by-word highlight in a bright colour — and moved away from it. It draws the eye to the caption rather than to the product, and on a fashion or product clip the caption is not the thing you want people looking at.

What we ship now is deliberately boring: plain white text, a lower-third position, two rows at most, no colour highlight. The one setting worth arguing about is size, and it is smaller than instinct suggests. We ran captions one size larger for a while, and a two-row block at that size took nearly the full frame width and sat across the garment — which defeats the point of a product video. Dropping the size back kept it readable on a phone, survived platform compression, and let the product stay the subject.

Font weight does more for legibility than font size does. A heavier weight with a thin outline reads cleanly over a busy background at a size where a light weight would disappear.

Safe areas: the platform covers more than you think

Every platform draws its own interface on top of your video, and it does not consult you first.

On a 1080x1920 vertical clip, the bottom strip is the dangerous one — the caption, the handle, the audio label and the progress bar all live there, and the exact height varies by platform and by app version. The right column is the second hazard, where the action buttons stack. In practice, keep anything that must be read between roughly 12% and 78% of the frame height, and keep it horizontally centred with margin on the right.

This applies to end cards even more than to captions. An end card is the one frame where you are asking someone to read a link, and it is exactly the frame most likely to be sitting behind a row of buttons. Check it by extracting the final frame and looking at it inside a mock-up of the platform's overlay, not by trusting the edit.

Translation is what actually breaks the layout

Here is the failure that cost us the most, and it has nothing to do with the captioning tool.

A caption written in one language and translated into another changes length, sometimes dramatically. German and Dutch routinely run 30 to 40 percent longer than English for the same sentence. If your caption renderer only breaks lines where you put an explicit break — and many subtitle renderers behave exactly this way with certain wrap settings — a translated line that was one row in the source becomes one very long row in the target, and it runs straight off the side of the frame.

We shipped fifteen clips like that before anyone noticed, across six languages, because every automated check passed. The exit codes were clean. The transcription was accurate. The text was simply hanging off the edge of the picture, and nothing in the pipeline was measuring pixels.

The fix has three parts, and all three are necessary:

  1. Measure, do not estimate. Compute the rendered width of the actual string in the actual font — uppercase if you render uppercase — against the frame's safe width, before burning anything.
  2. Wrap to more rows before shrinking the text. A caption that does not fit gets two or three rows, not a smaller font. Shrinking is the last resort, not the first.
  3. Fail loudly. A card that still cannot fit at three rows should stop the render, not quietly burn itself off-frame. A hard failure costs you ten minutes; a silent one costs you a published clip you cannot edit.
Flat vector comparison of a caption overflowing a phone frame against the same text wrapped onto three rows inside the safe area

Check the pixels, not the exit code

The second-worst caption failure we have had was scaffolding. A model asked to write caption cards returned its instructions along with them — a template line and a section marker — and those strings went through the pipeline and were burned onto eleven clips as on-screen text. Every step reported success, because every step only checked that it had run.

Two gates catch this, and you want both:

  • A deterministic text check before rendering: reject anything containing markup characters, section markers, bare numbers where prose is expected, or a price.
  • An extracted frame per caption card, looked at by a human or a vision check, after rendering.

One more thing worth knowing if you preview frames with ffmpeg: seek on the output, not the input. Putting the seek before the input file resets timestamps, so a card that lives between 0.4 and 3.2 seconds never appears in your preview frame — and it looks exactly like a caption that failed to burn when in fact it burned perfectly.

Common questions

What is the best AI subtitle generator?

Any transcription API that returns word-level timestamps for your language. The differentiator is not accuracy on clean studio audio — nearly all of them are fine there — it is whether you get per-word timings and how the renderer downstream handles wrapping.

Should I burn captions in or use a subtitle file?

Burn them in for vertical short-form, because most viewers watch muted and will never enable a track. Use a soft subtitle file for long-form, where the platform indexes it and the viewer expects the control.

How many lines should a caption be?

Two, lower third. Three is acceptable only as an overflow strategy for a long translated line, and even then it should be the exception rather than the default layout.

Why do my captions get cut off on TikTok and Instagram?

Because the app draws its own interface over the bottom strip and the right column of your video. Keep anything that must be read inside roughly the middle three quarters of the frame height, centred, with margin on the right.

Do captions really increase watch time?

They increase the odds of the first two seconds landing, which is what actually matters on a scroll feed. A muted viewer with no captions has nothing to read and no reason to stop; the caption is doing the job of the hook.

What happens if a translated caption is too long?

It either overflows the frame or gets silently shrunk, depending on your renderer, and both are bad. Measure the string width before rendering and wrap to more rows rather than reducing the font size.

Where to go next

Captions are the cheapest quality upgrade in short-form and the one most likely to be broken by something outside the captioning tool — a translation, a font, a platform overlay. Build the measurement step into the pipeline rather than trusting the render, and look at a frame from every clip before you call it done.

If you are translating clips as well as captioning them, our guide to AI video translators covers where the length problems start.

Looking for something else? Browse all AI video guides in one list.

Join the AI Video Generator community on Skool and bring the clip you are stuck on.

Latest Stories

This section doesn’t currently include any content. Add content to this section using the sidebar.