Translate a whole season of subtitles in one pass — .srt/.ass/.vtt/.lrc, 120+ languages, 27 LLM providers, timing untouched | 整季字幕一次译完,时轴不动,支持 120+ 语言
See the codeBlazing-fast batch subtitle translation for 120+ languages — powered by AI
English · 简体中文
Paste a subtitle file into a general-purpose translator and two things go wrong: the model rewrites your timecodes, and you're doing it one file at a time. Subtitle Translator strips the timing out locally and sends only the dialogue to the engine — the timeline physically cannot be touched — then does a whole season in one drop.
Subtitle Translator is a free, browser-based batch subtitle translation tool for .srt, .ass, .vtt, and .lrc files. With chunked compression and parallel processing it hits ~1 second per episode. Batch-upload a whole season at once, connect to 8 traditional translation APIs (DeepL, Google, Azure, DeepLX, Qwen-MT, TranslateGemma, GTX, Edge) or 27 LLM providers and gateways, and translate into 120+ languages — or into several target languages in a single pass, each exported as its own file. Everything runs locally in your browser; subtitle content and API keys never touch a server. A CLI drives the same engine headlessly when you'd rather script it.
👉 Try it online: https://tools.newzone.top/en/subtitle-translator

movie.zh.srt, movie.fr.srt)..srt, .ass, .vtt, and .lrc. WebVTT NOTE / STYLE / REGION non-cue blocks are correctly skipped (not translated as dialogue). One-click format conversion (SRT ↔ VTT, SRT/VTT → ASS) during translation.yarn cli runs the same engine, parsers, and cache from a terminal — see Command Line.Supports 8 traditional MT APIs and 27 LLM providers and gateways:
| API | Quality | Stability | Free Tier |
|---|---|---|---|
| DeepL | ★★★★★ | ★★★★☆ | 500K chars/month |
| Google Translate | ★★★★☆ | ★★★★★ | 500K chars/month |
| Azure Translate | ★★★★☆ | ★★★★★ | 2M chars/month (first 12 months) |
| DeepLX (Free) | ★★★★☆ | ★★★☆☆ | Self-host or free public endpoints |
| Qwen-MT | ★★★★☆ | ★★★★☆ | Alibaba DashScope quota |
| TranslateGemma | ★★★★☆ | ★★★★☆ | Self-host (LM Studio / Ollama / etc.) |
| GTX API (Free) | ★★★☆☆ | ★★★☆☆ | Free (rate-limited) |
| Edge API (Free) | ★★★★☆ | ★★★☆☆ | Free (rate-limited) |
GTX and Edge need no configuration at all — they are the zero-setup defaults, and each is the other's fallback.
DeepSeek, OpenAI, Claude, Gemini, Qwen, Moonshot (Kimi), Doubao, Xiaomi MiMo, Zhipu GLM, MiniMax, Baidu ERNIE, Tencent Hunyuan, Mistral, xAI (Grok), Perplexity, Cohere, and YandexGPT.
OpenRouter, OpenCode Zen, Groq, SiliconFlow, Atlas Cloud, GitHub Models, Nvidia NIM, Azure OpenAI, LiteLLM, plus any Custom (OpenAI-compatible) endpoint (Ollama / LM Studio / vLLM / Together AI / Fireworks AI etc.).
Providers walled off from browsers by CORS can be routed through an API relay. The built-in relay works out of the box; API Settings → Relay address points every relayed provider at your own deployment of the relay Worker instead.
LLM modes give you:
LLM modes can send surrounding lines as context for each batch, improving dialogue coherence and character-voice consistency.
⚠️ Tip: Models under 70B parameters may produce misaligned output. Mainstream online large models (Claude, GPT, DeepSeek, Gemini) are recommended for context mode.
| Format | Auto-detect | Bilingual | Notes |
|---|---|---|---|
| .srt | ✅ | ✅ | 1–3 digit milliseconds, 100+ hour timestamps |
| .ass | ✅ | ✅ | Line-leading position tags (e.g. \an8) auto-restored; complex inline effect tags simplified |
| .vtt | ✅ | ✅ | NOTE / STYLE / REGION blocks correctly skipped; inline <c.classname> and karaoke timestamps handled on VTT→SRT |
| .lrc | ✅ | ✅ | Karaoke lines with multiple time tags handled correctly |
Which formats are supported? SRT, ASS, VTT, and LRC. SRT/VTT suit YouTube and HTML5 players; ASS suits Aegisub / anime fansubs (position tags like \an8 auto-restored); LRC suits music lyrics.
Machine translation or LLM? Machine translation (Google, DeepL, Azure, Qwen-MT) is cheap or free but reads flat. LLMs bill per token but produce far more natural dialogue — DeepSeek is the value pick for whole-season batches, Claude Sonnet / GPT give the most natural dialogue, and Gemini's large context handles book-length subtitles.
How do I keep names and proper nouns consistent? Add a glossary in the System Prompt (e.g. "Keep verbatim: iPhone, OpenAI, John Smith") on any LLM engine; all episodes share the same context, so terminology stays consistent across a season.
Do I need "preserve timecodes / line numbers" prompts? No. Timecodes, cue numbers, and headers are extracted locally and re-inserted after translation — the model never sees them. Keep your prompt focused on style, glossary, and tone.
Is it private? Yes. Everything runs client-side: subtitle parsing, translation requests, and caching all happen in your browser. API keys are stored only in local browser storage, and LLM requests go directly from your browser to your configured endpoint.
See the full FAQ in the docs for more.
yarn cli translates files headlessly over the same engine as the web app — same parsers, same retry and rate-limit handling, same cache keys. Configure the service once in the browser, hit Export settings, and hand the JSON to the CLI; nothing has to be re-entered.
yarn install # once
# A whole season into Chinese on the free GTX API — no key, no config.
yarn cli -i s01e01.srt -i s01e02.srt -t zh
# Two targets in one pass, bilingual, using your exported keys/prompts/glossary.
yarn cli -i movie.srt -t zh -t ja --bilingual -s ~/subtitle-settings.json -o out/
# A local model — nothing leaves the machine.
yarn cli -i movie.ass -t zh -m llm --url http://localhost:11434/v1 --model qwen3
# One-off override on top of a settings file.
yarn cli -i movie.vtt -t de -m deepseek --api-key sk-xxx
Output lands beside the input (or in -o <dir>) as movie.zh.srt. Bilingual runs add _bilingual, and for .srt / .vtt sources they default to ASS with separate styles per line — movie.zh_bilingual.ass. Pass --bilingual-format srt to stay in SRT.
| Option | Meaning |
|---|---|
-i, --input <file> | Input file. Repeatable. |
-t, --to <lang> | Target language. Repeatable. Default zh. |
-f, --from <lang> | Source language. Default auto. |
-m, --method <id> | Service id. Default gtxFreeAPI; --list-methods prints them all. |
-s, --settings <file> | Settings JSON exported from the web UI (keys, prompts, glossary, retry…). |
-o, --out-dir <dir> | Output directory. Default: next to each input. |
--api-key · --url · --model | One-off overrides for the chosen service. |
--bilingual · --original-first · --bilingual-format <ass|srt> | Bilingual output. |
--no-context | Turn off context-aware LLM batching (on by default for subtitles). |
--no-cache · --cache-file <file> | Cache control. Default ~/.translate-cli-cache.json. |
--relay · --no-relay | Route through the API relay. Off by default — Node has no CORS to work around. |
--format <fmt> | Force a format instead of inferring it from the extension. |
Subtitles are not the only input: the same command handles Markdown (.md, .markdown, .mdx — code blocks, links and LaTeX protected by default) and JSON locale files (.json — keys untouched, values translated). yarn cli --list-formats prints the mapping, yarn cli --help the full option list including the Markdown-specific flags.
Runs are resumable: every translated line is cached, so re-running after a Ctrl-C, a rate-limit wall, or a handful of failed lines only pays for what is still missing.
Exit codes: 0 everything translated · 1 finished but some lines soft-failed (kept as source text in the output) or a file failed · 2 bad invocation · 130 cancelled.
Node.js >= 24 and Yarn (or npm / pnpm).
git clone https://github.com/rockbenben/subtitle-translator.git
cd subtitle-translator
yarn install
yarn dev # http://localhost:3000
yarn build # production build
For detailed configuration, API setup, and self-hosting instructions, see the Official Documentation.
Quick Deployment: Deploy Guide
Contributions are welcome! Feel free to open issues and pull requests.
yarn and yarn dev locally150 followers · starred Jan 2026
54 followers · starred Sep 2026
264 followers · starred Feb 2026
3,570 followers · starred May 2025
Translate a whole season of subtitles in one pass — .srt/.ass/.vtt/.lrc, 120+ languages, 27 LLM providers, timing untouched | 整季字幕一次译完,时轴不动,支持 120+ 语言
See the codeBlazing-fast batch subtitle translation for 120+ languages — powered by AI
English · 简体中文
Paste a subtitle file into a general-purpose translator and two things go wrong: the model rewrites your timecodes, and you're doing it one file at a time. Subtitle Translator strips the timing out locally and sends only the dialogue to the engine — the timeline physically cannot be touched — then does a whole season in one drop.
Subtitle Translator is a free, browser-based batch subtitle translation tool for .srt, .ass, .vtt, and .lrc files. With chunked compression and parallel processing it hits ~1 second per episode. Batch-upload a whole season at once, connect to 8 traditional translation APIs (DeepL, Google, Azure, DeepLX, Qwen-MT, TranslateGemma, GTX, Edge) or 27 LLM providers and gateways, and translate into 120+ languages — or into several target languages in a single pass, each exported as its own file. Everything runs locally in your browser; subtitle content and API keys never touch a server. A CLI drives the same engine headlessly when you'd rather script it.
👉 Try it online: https://tools.newzone.top/en/subtitle-translator

movie.zh.srt, movie.fr.srt)..srt, .ass, .vtt, and .lrc. WebVTT NOTE / STYLE / REGION non-cue blocks are correctly skipped (not translated as dialogue). One-click format conversion (SRT ↔ VTT, SRT/VTT → ASS) during translation.yarn cli runs the same engine, parsers, and cache from a terminal — see Command Line.Supports 8 traditional MT APIs and 27 LLM providers and gateways:
| API | Quality | Stability | Free Tier |
|---|---|---|---|
| DeepL | ★★★★★ | ★★★★☆ | 500K chars/month |
| Google Translate | ★★★★☆ | ★★★★★ | 500K chars/month |
| Azure Translate | ★★★★☆ | ★★★★★ | 2M chars/month (first 12 months) |
| DeepLX (Free) | ★★★★☆ | ★★★☆☆ | Self-host or free public endpoints |
| Qwen-MT | ★★★★☆ | ★★★★☆ | Alibaba DashScope quota |
| TranslateGemma | ★★★★☆ | ★★★★☆ | Self-host (LM Studio / Ollama / etc.) |
| GTX API (Free) | ★★★☆☆ | ★★★☆☆ | Free (rate-limited) |
| Edge API (Free) | ★★★★☆ | ★★★☆☆ | Free (rate-limited) |
GTX and Edge need no configuration at all — they are the zero-setup defaults, and each is the other's fallback.
DeepSeek, OpenAI, Claude, Gemini, Qwen, Moonshot (Kimi), Doubao, Xiaomi MiMo, Zhipu GLM, MiniMax, Baidu ERNIE, Tencent Hunyuan, Mistral, xAI (Grok), Perplexity, Cohere, and YandexGPT.
OpenRouter, OpenCode Zen, Groq, SiliconFlow, Atlas Cloud, GitHub Models, Nvidia NIM, Azure OpenAI, LiteLLM, plus any Custom (OpenAI-compatible) endpoint (Ollama / LM Studio / vLLM / Together AI / Fireworks AI etc.).
Providers walled off from browsers by CORS can be routed through an API relay. The built-in relay works out of the box; API Settings → Relay address points every relayed provider at your own deployment of the relay Worker instead.
LLM modes give you:
LLM modes can send surrounding lines as context for each batch, improving dialogue coherence and character-voice consistency.
⚠️ Tip: Models under 70B parameters may produce misaligned output. Mainstream online large models (Claude, GPT, DeepSeek, Gemini) are recommended for context mode.
| Format | Auto-detect | Bilingual | Notes |
|---|---|---|---|
| .srt | ✅ | ✅ | 1–3 digit milliseconds, 100+ hour timestamps |
| .ass | ✅ | ✅ | Line-leading position tags (e.g. \an8) auto-restored; complex inline effect tags simplified |
| .vtt | ✅ | ✅ | NOTE / STYLE / REGION blocks correctly skipped; inline <c.classname> and karaoke timestamps handled on VTT→SRT |
| .lrc | ✅ | ✅ | Karaoke lines with multiple time tags handled correctly |
Which formats are supported? SRT, ASS, VTT, and LRC. SRT/VTT suit YouTube and HTML5 players; ASS suits Aegisub / anime fansubs (position tags like \an8 auto-restored); LRC suits music lyrics.
Machine translation or LLM? Machine translation (Google, DeepL, Azure, Qwen-MT) is cheap or free but reads flat. LLMs bill per token but produce far more natural dialogue — DeepSeek is the value pick for whole-season batches, Claude Sonnet / GPT give the most natural dialogue, and Gemini's large context handles book-length subtitles.
How do I keep names and proper nouns consistent? Add a glossary in the System Prompt (e.g. "Keep verbatim: iPhone, OpenAI, John Smith") on any LLM engine; all episodes share the same context, so terminology stays consistent across a season.
Do I need "preserve timecodes / line numbers" prompts? No. Timecodes, cue numbers, and headers are extracted locally and re-inserted after translation — the model never sees them. Keep your prompt focused on style, glossary, and tone.
Is it private? Yes. Everything runs client-side: subtitle parsing, translation requests, and caching all happen in your browser. API keys are stored only in local browser storage, and LLM requests go directly from your browser to your configured endpoint.
See the full FAQ in the docs for more.
yarn cli translates files headlessly over the same engine as the web app — same parsers, same retry and rate-limit handling, same cache keys. Configure the service once in the browser, hit Export settings, and hand the JSON to the CLI; nothing has to be re-entered.
yarn install # once
# A whole season into Chinese on the free GTX API — no key, no config.
yarn cli -i s01e01.srt -i s01e02.srt -t zh
# Two targets in one pass, bilingual, using your exported keys/prompts/glossary.
yarn cli -i movie.srt -t zh -t ja --bilingual -s ~/subtitle-settings.json -o out/
# A local model — nothing leaves the machine.
yarn cli -i movie.ass -t zh -m llm --url http://localhost:11434/v1 --model qwen3
# One-off override on top of a settings file.
yarn cli -i movie.vtt -t de -m deepseek --api-key sk-xxx
Output lands beside the input (or in -o <dir>) as movie.zh.srt. Bilingual runs add _bilingual, and for .srt / .vtt sources they default to ASS with separate styles per line — movie.zh_bilingual.ass. Pass --bilingual-format srt to stay in SRT.
| Option | Meaning |
|---|---|
-i, --input <file> | Input file. Repeatable. |
-t, --to <lang> | Target language. Repeatable. Default zh. |
-f, --from <lang> | Source language. Default auto. |
-m, --method <id> | Service id. Default gtxFreeAPI; --list-methods prints them all. |
-s, --settings <file> | Settings JSON exported from the web UI (keys, prompts, glossary, retry…). |
-o, --out-dir <dir> | Output directory. Default: next to each input. |
--api-key · --url · --model | One-off overrides for the chosen service. |
--bilingual · --original-first · --bilingual-format <ass|srt> | Bilingual output. |
--no-context | Turn off context-aware LLM batching (on by default for subtitles). |
--no-cache · --cache-file <file> | Cache control. Default ~/.translate-cli-cache.json. |
--relay · --no-relay | Route through the API relay. Off by default — Node has no CORS to work around. |
--format <fmt> | Force a format instead of inferring it from the extension. |
Subtitles are not the only input: the same command handles Markdown (.md, .markdown, .mdx — code blocks, links and LaTeX protected by default) and JSON locale files (.json — keys untouched, values translated). yarn cli --list-formats prints the mapping, yarn cli --help the full option list including the Markdown-specific flags.
Runs are resumable: every translated line is cached, so re-running after a Ctrl-C, a rate-limit wall, or a handful of failed lines only pays for what is still missing.
Exit codes: 0 everything translated · 1 finished but some lines soft-failed (kept as source text in the output) or a file failed · 2 bad invocation · 130 cancelled.
Node.js >= 24 and Yarn (or npm / pnpm).
git clone https://github.com/rockbenben/subtitle-translator.git
cd subtitle-translator
yarn install
yarn dev # http://localhost:3000
yarn build # production build
For detailed configuration, API setup, and self-hosting instructions, see the Official Documentation.
Quick Deployment: Deploy Guide
Contributions are welcome! Feel free to open issues and pull requests.
yarn and yarn dev locally150 followers · starred Jan 2026
54 followers · starred Sep 2026
264 followers · starred Feb 2026
3,570 followers · starred May 2025