<!-- kernel -->
> Creatomate AI reference — topic page "Subtitles"; the index of all pages is https://creatomate.com/llms.txt
<!-- /kernel -->

### Subtitles

Subtitles are text elements with `transcript_source` set. They generate at render time for `mp4`/`gif` outputs.

| Property | Default | Values |
|---|---|---|
| `transcript_source` | null | the **name** (case-insensitive) or **id** of an audio/video element — its own composition is searched first, then the whole document; prefer the same composition so their timing stays linked; an HTTP URL (file gets transcribed); a raw SRT/WebVTT string; or your own word timings as a keyframe array (below) |
| `transcript_effect` | `"color"` | color \| karaoke \| highlight \| fade \| bounce \| slide \| enlarge |
| `transcript_split` | `"word"` | none \| line \| word \| letter |
| `transcript_placement` | `"static"` | static \| animate \| align |
| `transcript_maximum_length` | null | max characters per page, ≥ 1 |
| `transcript_color` | `"#e74c3c"` | the accent color for the spoken word/segment |

**Bring your own timings.** Instead of a string, `transcript_source` takes an array with one keyframe per word: `{ "time": 0.64, "duration": 0.08, "value": "It" }`. `time` is seconds from the subtitle element's own start (the same clock as any keyframe, so keep that element starting with the media it captions), `duration` is how long the word is spoken (1 s when omitted), `value` the word. Add `"sentence": 1`, `2`, … to group the words into sentences: each sentence is then its own caption, paged further only by `transcript_maximum_length`; without them the words are one stream the engine pages itself. Nothing is transcribed. The array also works as a modification value: `"Subtitles-1.transcript_source": [ … ]`.

**What the effects do** (`transcript_effect`, on the unit `transcript_split` names, a word by default): `color` tints the unit being spoken in `transcript_color`; `karaoke` keeps every spoken unit tinted, a progressive fill; `highlight` draws a rounded box in `transcript_color` behind the spoken unit, using the text's `background_*` paddings and radius, and the unit's text keeps `fill_color`; `fade` fades each unit in as it is spoken; `bounce` and `slide` move the spoken unit in; `enlarge` scales it up and re-wraps the line around it.

**Subtitles have TWO colors**: `fill_color` is the base text color and `transcript_color` is the spoken-word accent. "Make the subtitles red" means changing BOTH. ElevenLabs voiceovers include word timestamps natively, so their subtitles need no transcription step.
