Subtitle Translator — SRT & VTT into Any Language
Pricing
from $50.00 / 1,000 subtitle languages
Subtitle Translator — SRT & VTT into Any Language
Translate SRT and VTT subtitles into many languages in one run. Paste your subtitle file, or a video URL to transcribe first. Pick your target languages. You get one SRT and one VTT per language. Every original cue timing stays exact. $0.05 per language, flat rate.
Pricing
from $50.00 / 1,000 subtitle languages
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Subtitle Translator: turn one SRT or VTT file into as many languages as you need
Paste an SRT or VTT file, list the languages you want, 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.
| 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 | $0.05 per language, flat on every plan |
🔤 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 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 | box starts with a two-cue sample | Your SRT or VTT text, pasted in. SRT index lines and the WEBVTT header are both handled. |
videoUrl | none | Used only when subtitles is empty. A public video or audio URL to transcribe first. |
targetLanguages | ["es"] when the field is absent, box starts at es, fr, de | ISO codes. One row and one set of files per code. |
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 | https://api.openai.com/v1 | Point it at any OpenAI-compatible endpoint. |
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.
📤 What you get back
One row per language. Shown with the long storage URLs cut short:
{"ok": true,"sourceLanguage": "auto","language": "es","languageName": "Spanish","cues": 2,"srtKey": "subtitles-es-1758412903118.srt","srtUrl": "https://api.apify.com/v2/key-value-stores/.../records/subtitles-es-...","vttKey": "subtitles-es-1758412903118.vtt","vttUrl": "https://api.apify.com/v2/key-value-stores/.../records/subtitles-es-...","txtKey": "transcript-es-1758412903118.txt","txtUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-es-...","text": "Bienvenido de nuevo al canal.","preview": ["Bienvenido de nuevo al canal."]}
| Field | What it is |
|---|---|
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 does not have a name for, this repeats the code itself. |
preview | The first two translated lines, so you can eyeball the result without opening a file. |
🧾 Reading the output
Every row in the dataset is a finished language. Sample and notice rows are kept out of it
deliberately: they go to a record called SAMPLE_AND_NOTICES in the run's key-value store, so they
never sit in your results and no result is billed for them.
You get that sample instead of a real translation in two cases:
| What happened | What you do |
|---|---|
Neither subtitles nor videoUrl was filled in | Paste a subtitle file, or give a video URL. |
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. Languages already finished before that point stay in the dataset.
▶️ How to run it
- 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 URLs off the dataset.
💰 How much does it cost?
$0.05 per language. Flat on every Apify plan, no volume tiers. Three languages in one run is three rows.
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 and notice rows are not results and are not billed.
💡 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.
🚧 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.
🧭 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 |
| A whole video dubbed with a new voice track | AI Video Dubber |
| Captions burned into the picture | Auto Caption Burner |
| The source video and its caption file downloaded | YouTube Downloader Pro |
❓ Questions people ask
Do the timings change? No. Start and end times are carried across exactly as they were parsed, down to the millisecond.
Which languages work? 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.
Can I run it without a key? You can press Start and see the shape of the output, but the rows will be labelled samples in the key-value store rather than a real translation.
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 schedule it? Yes, like any actor on Apify. It is more commonly run once per video.
🆘 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.