Subtitle Translator — SRT & VTT into Many Languages avatar

Subtitle Translator — SRT & VTT into Many Languages

Pricing

Pay per event

Go to Apify Store
Subtitle Translator — SRT & VTT into Many Languages

Subtitle Translator — SRT & VTT into Many Languages

Translate SRT and VTT subtitles into as many languages as you need, keeping every cue's timing to the millisecond. Paste a file, or a short video link to transcribe first. Each language gets an SRT, a VTT and a TXT. Runs on your own OpenAI key. $50.00 per 1,000 languages ($0.05 each).

Pricing

Pay per event

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

4 days ago

Last modified

Share

Translate an SRT or VTT subtitle file into as many languages as you need: paste the file, list the languages, and get back a finished SRT, VTT and plain text file for each one. Every cue keeps its original start and end time to the millisecond, so the files drop straight back onto the same video.

You bring your own OpenAI key. The translation is billed to your key by OpenAI, separately from what you pay here. And one model call does a whole language, so a feature-length file can come back with some lines left untranslated: split long files and run them in parts.

InputSRT or VTT text you paste, or a public video or audio URL to transcribe first
OutputOne row per target language, with SRT, VTT and .txt files in the run's storage
CeilingNo cap on languages. The video route runs out at roughly 13 minutes of audio
Account neededYour own OpenAI API key
Price$50.00 per 1,000 languages, so $0.05 a language on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 100

🔍 What Subtitle Translator does

It reads your subtitle file, splits it into cues, and sends the lines for one language to the model in a single call. The translated lines go back onto the original timings and come out as three files: a .srt, a .vtt and a plain .txt with the whole script as running text.

Ask for five languages and you get five rows, five sets of files, and five separate model calls. Nothing is shared between them, so one language coming out badly does not affect the others.

If you have no subtitle file, give it a public video or audio URL instead. It pulls the file, lifts the audio, and transcribes it with timestamps before translating. That route needs the same key.

📋 What data you get from each translated language

What you getField
The language code and its English namelanguage, languageName
The translated SRT file, and a direct link to itsrtKey, srtUrl
The translated VTT file, and a direct link to itvttKey, vttUrl
The whole translation as plain text, as a file and inlinetxtKey, txtUrl, text
How many cues the file has, always the same as the sourcecues
The first two translated lines, to eyeball the resultpreview
The language going in, detected on the video routesourceLanguage

▶️ How to translate subtitles into other languages

  1. Open Subtitle Translator and click Try for free.
  2. Paste your file into Subtitles (SRT or VTT), replacing the sample text that is already there.
  3. Type the codes you want into Target languages, one per line.
  4. Put your key into OpenAI API key (BYO), then click Start.
  5. Open the run's Key-value store tab to download the files, or read the links off the dataset.

Start it with no key and you get free labelled samples in the key-value store instead.

💰 How much does it cost to translate subtitles?

$0.05 per language on the Free plan, a little less on paid plans. Three languages in one run is three rows, $0.15, and on the free plan the $5 Apify gives you each month covers about 100 languages.

That is what you pay here. Your OpenAI key is charged separately by OpenAI for the model calls, at whatever rate your account is on. Sample rows are not results and are not billed.

📥 What you give it

{
"subtitles": "1\n00:00:00,000 --> 00:00:02,400\nWelcome back to the channel.\n",
"targetLanguages": ["es", "fr", "de"],
"sourceLanguage": "auto",
"outputFormat": "both",
"openaiApiKey": "sk-..."
}
FieldDefaultWhat it is
subtitlesnoneYour SRT or VTT text, pasted in. SRT index lines and the WEBVTT header are both handled. The box starts with a two-cue sample, which is a prefill, not a default.
videoUrlnoneUsed only when subtitles is empty. A public video or audio URL to transcribe first.
targetLanguages["es"] when the field is absentISO codes. One row and one set of files per code. The box starts at es, fr, de.
sourceLanguageautoThe language going in. auto lets the transcription detect it.
outputFormatbothboth, srt or vtt. The .txt is always written either way.
openaiApiKeynoneYour own key. Marked secret, so it is not stored with the run input.
translationModelgpt-4o-miniAny chat model your key can reach.
baseUrlnonePoint it at any OpenAI-compatible endpoint. Empty means https://api.openai.com/v1.

If both subtitles and videoUrl are filled in, the pasted subtitles win and the video is never fetched. Clear the box if you meant to transcribe. And an empty Target languages list fails the run straight away, key or no key.

📤 What you get back

One row per language in the dataset, and the files in the run's key-value store.

No run on record has translated with a customer's key, so here is the real sample record a keyless run wrote on 3 October 2026, the Spanish one of three, with the signed link cut short. A delivered row has no _sample, _notice or reason, carries the real translation in preview and text, and adds the vttKey, vttUrl, txtKey and txtUrl for the files written.

{
"ok": true,
"_sample": true,
"_notice": "SAMPLE OUTPUT - provide \"subtitles\" or \"videoUrl\" plus \"openaiApiKey\" for real translation.",
"reason": "missing_api_key",
"sourceLanguage": "auto",
"language": "es",
"languageName": "Spanish",
"cues": 2,
"srtKey": "sample-subtitles-es-1790986387045.srt",
"srtUrl": "https://api.apify.com/v2/key-value-stores/h5RA85hOm4SXvU6Il/records/sample-subtitles-es-1790986387045.srt?signature=...",
"preview": [
"[Sample Spanish] This row previews the translated subtitle output.",
"[Sample Spanish] Add real subtitles and an OpenAI API key for production results."
]
}
FieldHow to read it
srtUrl, vttUrl, txtUrlDirect download links to the finished files in this run's key-value store. vttUrl is absent when outputFormat is srt, and the other way round.
textThe whole translation as one paragraph, with the timings stripped. Handy for a description or a blog post.
cuesHow many subtitle cues the file ended up with. It always matches the source count.
languageNameThe English name of the language. For a code the actor has no name for, it repeats the code.

🧾 Reading the output

Every row in the dataset is a finished language. Sample rows are kept out of it deliberately: they go to a record called SAMPLE_AND_NOTICES in the run's key-value store, one per language, each with a labelled sample .srt beside it, so they never sit in your results and are never billed.

reason on the sampleWhat happenedWhat you do
missing_sourceNeither subtitles nor videoUrl was filled inPaste a subtitle file, or give a video URL.
missing_api_keyNo openaiApiKey was suppliedAdd your key and run again.

There are no error rows. If something goes wrong partway through, the run fails and the log says why.

💡 What people use it for

  • Shipping one video with subtitle tracks in six languages, without re-cutting anything.
  • Turning an existing English caption file into the Spanish and Portuguese versions for the same upload.
  • Getting the flat .txt out of a caption file to reuse as a description or an article draft.
  • Transcribing a short interview from a URL and getting the translated tracks in the same run.

A YouTube video's own captions in three more languages, in three steps:

  1. Run YouTube Transcript Scraper on the video and copy the srt field from its row. That field is the whole file.
  2. Paste it into Subtitles (SRT or VTT) here, with es, fr and de in Target languages.
  3. Download each language's file from srtUrl and add it to the video as a subtitle track.

🚧 What it does not do

  • It does not pay for the model. Translation and transcription run on your own key, and you see that cost on your OpenAI bill.
  • Long files can come back short. All the cues for one language go in a single model call, so a very long subtitle file can hit the model's reply limit. When the reply comes back with fewer lines than went in, the missing ones are filled with the untranslated original rather than left blank. Split a feature-length file and run it in parts.
  • The video route is for short clips. Audio is uploaded whole for transcription, which runs out at roughly 13 minutes.
  • Styling is dropped. Italics, positioning and colour tags are stripped during parsing. You get plain cues back.
  • Timings are copied, not re-fitted. A translation that is wordier than the source stays on the original cue and can read fast on screen.
  • A failure partway stops the run. Languages already written stay in the dataset and are billed; the ones after it are not produced.
  • No language cap. Twenty codes is twenty rows and twenty model calls, so check the list before you start.
  • It is not an official tool of any platform or company named on this page. Dami's Studio is independent and is not affiliated with or endorsed by any of them.

🧭 Which subtitle tool do you need?

If you wantUse
Subtitles you already have, in more languagesThis one
A video or audio file turned into a transcript and caption filesVideo & Audio Transcriber
The captions a YouTube video already has, as an SRT to translateYouTube Transcript Scraper
A whole video dubbed with a new voice trackAI Video Dubber
Captions burned into the pictureAuto Caption Burner
Your own YouTube video and its caption files downloadedYouTube Downloader Pro

❓ Questions people ask

Do the subtitle timings change?

No. Start and end times are carried across exactly as they were parsed, down to the millisecond.

Which languages can it translate into?

Any language the model handles. Codes like es, fr, de, hi, ar, ja and zh also get a readable name on the row; anything else still translates, it just shows the raw code in languageName.

Can I use a different model or provider?

Yes. Set translationModel to any chat model your key can reach, and baseUrl to any OpenAI-compatible endpoint.

Why did some lines come back in the original language?

The model returned fewer lines than were sent, and the gaps were filled with the source text so the file still lines up. That is the sign to split the file into shorter chunks.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/subtitle-translator. Either way the run happens on your Apify account at the same price, and OpenAI bills your key as usual.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and, if you can, the first few cues of the file you pasted. The run log names the language it was on when it stopped.