Add Subtitles to Videos avatar

Add Subtitles to Videos

Pricing

from $500.00 / 1,000 results

Go to Apify Store
Add Subtitles to Videos

Add Subtitles to Videos

Burn karaoke-style word-highlighted subtitles into videos. Upload a clip or paste a URL, choose font, size, and highlight color, and download a captioned MP4.

Pricing

from $500.00 / 1,000 results

Rating

0.0

(0)

Developer

Marco Rodrigues

Marco Rodrigues

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 days ago

Last modified

Share

🎬 Add Subtitles to Videos

Turn a talking video into a captioned MP4 with word highlighting.

The input is the video. Upload a file or paste a direct URL, pick a font and colors, and download the subtitled clip plus an SRT and a word-level transcript. Each video can be at most 3 minutes and 50 MB.

A transcript JSON file is optional. Most runs only need the video β€” speech is transcribed automatically. If you already have a transcript (for example you fixed a few words in a previous output), attach that file and it replaces automatic transcription. Captions are burned from your JSON instead.

πŸ’‘ Perfect for

  • πŸ“£ Influencers and creators: Caption TikToks, Reels, and Shorts so the hook still lands on mute.
  • πŸŽ₯ UGC content: Subtitle product demos, testimonials, and creator ads before they go to brands or ad accounts.
  • πŸ›οΈ Ecommerce and brands: Caption unboxings, how-tos, and shoppable clips for paid social.
  • πŸ§‘β€πŸ’Ό Agencies: Caption client videos through the Apify API instead of editing by hand.
  • πŸŽ™οΈ Podcasts and YouTube: Burn captions onto clips, trailers, and audiograms.
  • πŸŽ“ Courses and explainers: Make lessons readable without the sound on.
  • πŸ€– Avatar and talking-head videos: Overlay karaoke-style subtitles on generated spokespeople.
  • πŸ”— Automations: Call the Actor from Make, Zapier, n8n, or the Apify API.

✨ What you get

For the input video the Actor:

  1. Gets word-level captions β€” either by transcribing the audio, or by using your optional transcript file.
  2. Burns captions into the video, highlighting the word being spoken.
  3. Saves a captioned MP4, an SRT, a JSON transcript, and a dataset row with download links.

The output keeps the source frame rate. Clips larger than 1080p on the long side are scaled down so rendering stays fast. Captions are drawn on top.

πŸ“„ Optional transcript file

Leave transcriptJson empty unless you want to control the wording.

InputWhat happens
Video onlyAudio is transcribed, then captions are burned in.
Video + transcript JSONTranscription is skipped. Your JSON is burned in as captions.

Use the transcript file when you want to perfect the output: download transcript-1.json from a previous result, change only the wrong word values, and pass that file with the same video. Leave start and end unchanged so highlighting still matches the audio. Segment text is rebuilt from the words.

{
"language": "en",
"text": "Hello world this is a demo",
"segments": [
{
"text": "Hello world",
"start": 0.2,
"end": 1.1,
"words": [
{ "word": "Hello", "start": 0.2, "end": 0.5 },
{ "word": "world", "start": 0.55, "end": 1.1 }
]
}
]
}

You can upload the file in transcriptJson, or paste the same JSON into transcriptJsonContent.

πŸ”€ Font family

Choose one of these 20 typefaces with fontFamily:

ValuePreview
montserratMontserrat
poppinsPoppins
oswaldOswald
interInter
robotoRoboto
rubikRubik
nunitoNunito
antonAnton
bebas_neueBebas Neue
archivo_blackArchivo Black
ralewayRaleway
latoLato
work_sansWork Sans
dm_sansDM Sans
outfitOutfit
kanitKanit
tekoTeko
russo_oneRusso One
righteousRighteous
barlow_condensedBarlow Condensed

🎨 Colors

textColor, highlightColor, and outlineColor accept:

  • Hex: #FFF or #FFFFFF
  • Names: white, black, red, orange, yellow, green, blue, purple, pink, cyan, magenta, gray, navy, teal, gold, brown, and similar CSS color names

highlightColor is the background overlay on the word currently being spoken.

πŸš€ How to use

  1. Add a video to video β€” upload a file or paste a direct URL.
  2. Optionally add a transcript JSON if you want to skip transcription and use your own wording.
  3. Set font family, size, and colors.
  4. Start the Actor and download subtitled-video-1.mp4 from the key-value store.

One video per run, at most 3 minutes and 50 MB. Start another run for each extra clip.

πŸ“₯ Input example

{
"video": "https://api.apify.com/v2/key-value-stores/3ZzUVcATxmN3HCTaI/records/qa-speech.mp4",
"fontFamily": "montserrat",
"fontSize": 40,
"textColor": "white",
"highlightColor": "#FFCC00",
"outlineColor": "black",
"uppercase": true,
"position": "bottom",
"maxWordsPerCaption": 4,
"language": "en"
}

With an optional transcript file:

{
"video": "https://api.apify.com/v2/key-value-stores/3ZzUVcATxmN3HCTaI/records/qa-speech.mp4",
"transcriptJson": "https://api.apify.com/v2/key-value-stores/.../records/transcript-1.json",
"fontFamily": "montserrat",
"highlightColor": "#FFCC00"
}

πŸ“€ Output example

{
"source_video": "https://api.apify.com/v2/key-value-stores/3ZzUVcATxmN3HCTaI/records/qa-speech.mp4",
"subtitled_video_url": "https://api.apify.com/v2/key-value-stores/.../records/subtitled-video-1.mp4",
"srt_url": "https://api.apify.com/v2/key-value-stores/.../records/subtitles-1.srt",
"transcript_url": "https://api.apify.com/v2/key-value-stores/.../records/transcript-1.json",
"transcript_text": "Hello world this is a demo",
"language": "en",
"duration_seconds": 12.4,
"word_count": 6,
"font_family": "Montserrat",
"font_size": 40,
"highlight_color": "#FFCC00",
"used_transcript_json": false
}

The first captioned file is also stored as subtitled-video-1.mp4 in the default key-value store.

βš™οΈ Parameters

ParameterTypeRequiredDescription
videofile or URLYesVideo to caption. Upload a file or paste a direct link. One per run, 3 minutes and 50 MB max.
transcriptJsonJSON file or URLNoOptional transcript file. When set, replaces automatic transcription.
transcriptJsonContentJSON objectNoOptional. Paste the same transcript JSON in the console.
fontFamilystringNoCaption typeface. One of the 20 fonts listed above.
fontSizeintegerNoCaption size in pixels (16–120). Default 40.
textColorhex or nameNoColor of idle words. Default white.
highlightColorhex or nameNoOverlay color for the spoken word. Default #003399.
outlineColorhex or nameNoCaption stroke color. Default black.
uppercasebooleanNoForce uppercase captions. Default true.
positionstringNobottom, center, or top.
maxWordsPerCaptionintegerNoWords shown together on screen. Default 5.
languagestringNoSpoken language for transcription. Default en.
mistralApiKeysecretNoOptional Mistral key override.