Subtitle Translator — SRT & VTT into Many Languages
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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.
| Input | SRT or VTT text you paste, or a public video or audio URL to transcribe first |
| Output | One row per target language, with SRT, VTT and .txt files in the run's storage |
| Ceiling | No cap on languages. The video route runs out at roughly 13 minutes of audio |
| Account needed | Your 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 get | Field |
|---|---|
| The language code and its English name | language, languageName |
| The translated SRT file, and a direct link to it | srtKey, srtUrl |
| The translated VTT file, and a direct link to it | vttKey, vttUrl |
| The whole translation as plain text, as a file and inline | txtKey, txtUrl, text |
| How many cues the file has, always the same as the source | cues |
| The first two translated lines, to eyeball the result | preview |
| The language going in, detected on the video route | sourceLanguage |
▶️ How to translate subtitles into other languages
- Open Subtitle Translator and click Try for free.
- Paste your file into Subtitles (SRT or VTT), replacing the sample text that is already there.
- Type the codes you want into Target languages, one per line.
- Put your key into OpenAI API key (BYO), then click Start.
- 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-..."}
| Field | Default | What it is |
|---|---|---|
subtitles | none | Your 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. |
videoUrl | none | Used only when subtitles is empty. A public video or audio URL to transcribe first. |
targetLanguages | ["es"] when the field is absent | ISO codes. One row and one set of files per code. The box starts at es, fr, de. |
sourceLanguage | auto | The language going in. auto lets the transcription detect it. |
outputFormat | both | both, srt or vtt. The .txt is always written either way. |
openaiApiKey | none | Your own key. Marked secret, so it is not stored with the run input. |
translationModel | gpt-4o-mini | Any chat model your key can reach. |
baseUrl | none | Point 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."]}
| Field | How to read it |
|---|---|
srtUrl, vttUrl, txtUrl | Direct 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. |
text | The whole translation as one paragraph, with the timings stripped. Handy for a description or a blog post. |
cues | How many subtitle cues the file ended up with. It always matches the source count. |
languageName | The 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 sample | What happened | What you do |
|---|---|---|
missing_source | Neither subtitles nor videoUrl was filled in | Paste a subtitle file, or give a video URL. |
missing_api_key | No openaiApiKey was supplied | Add 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
.txtout 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:
- Run YouTube Transcript Scraper on the
video and copy the
srtfield from its row. That field is the whole file. - Paste it into Subtitles (SRT or VTT) here, with
es,franddein Target languages. - Download each language's file from
srtUrland 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 want | Use |
|---|---|
| Subtitles you already have, in more languages | This one |
| A video or audio file turned into a transcript and caption files | Video & Audio Transcriber |
| The captions a YouTube video already has, as an SRT to translate | YouTube Transcript Scraper |
| A whole video dubbed with a new voice track | AI Video Dubber |
| Captions burned into the picture | Auto Caption Burner |
| Your own YouTube video and its caption files downloaded | YouTube 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.