{"id":50199545,"url":"https://github.com/Blue-B/WhisperSubTranslate","last_synced_at":"2026-06-11T12:00:38.234Z","repository":{"id":309388984,"uuid":"1035884228","full_name":"Blue-B/WhisperSubTranslate","owner":"Blue-B","description":"A free, local desktop app to extract subtitles (SRT) from video and translate them into any language — unlimited use, no signup, no cloud.","archived":false,"fork":false,"pushed_at":"2026-06-10T08:21:29.000Z","size":7688,"stargazers_count":115,"open_issues_count":0,"forks_count":10,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-06-10T10:12:58.652Z","etag":null,"topics":["javascript","srt","translate","translator","video","whisper"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Blue-B.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"Blue-B","buy_me_a_coffee":"beckycode7h","custom":["https://www.paypal.com/ncp/payment/ZEWFKDX595ESJ"]}},"created_at":"2025-08-11T08:34:29.000Z","updated_at":"2026-06-10T08:22:00.000Z","dependencies_parsed_at":"2026-01-08T16:01:44.197Z","dependency_job_id":null,"html_url":"https://github.com/Blue-B/WhisperSubTranslate","commit_stats":null,"previous_names":["blue-b/whispersubtranslate"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/Blue-B/WhisperSubTranslate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blue-B%2FWhisperSubTranslate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blue-B%2FWhisperSubTranslate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blue-B%2FWhisperSubTranslate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blue-B%2FWhisperSubTranslate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Blue-B","download_url":"https://codeload.github.com/Blue-B/WhisperSubTranslate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blue-B%2FWhisperSubTranslate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34197394,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","srt","translate","translator","video","whisper"],"created_at":"2026-05-25T21:00:35.598Z","updated_at":"2026-06-11T12:00:38.209Z","avatar_url":"https://github.com/Blue-B.png","language":"JavaScript","funding_links":["https://github.com/sponsors/Blue-B","https://buymeacoffee.com/beckycode7h","https://www.paypal.com/ncp/payment/ZEWFKDX595ESJ"],"categories":["Applications"],"sub_categories":[],"readme":"# WhisperSubTranslate\n\nEnglish | [한국어](./docs/README.ko.md) | [日本語](./docs/README.ja.md) | [中文](./docs/README.zh.md) | [Polski](./docs/README.pl.md)\n\nA local-first desktop workflow for turning videos into multilingual subtitles. Drop in a video, generate SRT with whisper.cpp, then translate it with free, paid, or upcoming local translation engines.\n\n\u003e Important: This app creates new SRT subtitles from your video's audio using whisper.cpp. It does not extract existing embedded subtitle tracks or on‑screen text (no OCR).\n\u003e\n\u003e v2.0 focus: context-aware translation, safer API key storage, local translation routing, and a more polished contributor-friendly codebase.\n\n## Preview\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/hero/hero.png\" alt=\"WhisperSubTranslate — main UI\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n## Why use WhisperSubTranslate\n\nSubtitle extraction runs 100% locally — your video never leaves your machine. No cloud uploads, no accounts, no credit cards. Create accurate SRT offline; translation can run **fully offline** with the bundled local Hy-MT2 model, or use free/paid online engines (MyMemory, your own DeepL/OpenAI/Gemini keys).\n\n### Value at a glance\n\n| Need                      | What you get                                                                                          |\n| ------------------------- | ----------------------------------------------------------------------------------------------------- |\n| Privacy \u0026 control         | 100% local STT; no cloud uploads                                                                      |\n| Zero signup               | No account, no credit card, no personal data                                                          |\n| Unlimited use             | No app‑level daily/monthly limits                                                                     |\n| Understand foreign videos | Extract + translate SRT in one run                                                                    |\n| Avoid setup pain          | Auto model download; no Python required                                                               |\n| Clear feedback            | Queue, smooth progress, ETA                                                                           |\n| Safe interruptions        | Cancel a model download mid-flight; partial files are cleaned up and resumed from scratch on next run |\n| History on your terms     | Local-only job history (up to 200 entries), togglable, with forensic-safe clear                       |\n\n\u003e Note: When using online translation engines, provider‑side limits may apply (e.g., MyMemory quota). The app itself does not impose usage caps.\n\n## Getting started\n\n### For users: run the portable release\n\n- Download the latest portable archive from Releases: `WhisperSubTranslate-v2.2.0-win-x64.zip`\n- Open the extracted folder and run `WhisperSubTranslate.exe`\n\nThat's it — extraction runs fully offline on your PC. Translation is optional (local Hy-MT2 model for 100% offline, free MyMemory, or your own DeepL/OpenAI/Gemini API keys).\n\n### For developers: run from source\n\n```bash\nnpm install\nnpm start\n```\n\n- **Node.js ≥ 20.19 or ≥ 22.12** is required (Electron 42 build toolchain)\n- **whisper-cpp** is automatically downloaded during `npm install` (~700MB CUDA version on Windows)\n- On **Linux/macOS**, if no pre-built binary is available, whisper.cpp is automatically built from source (requires `cmake`, `gcc`/`clang`, and `git`)\n- **FFmpeg** is automatically included via npm package\n- First run will download the selected GGML model into `_models/` when missing\n\n\u003e If auto-download fails, manually download from [whisper.cpp releases](https://github.com/ggml-org/whisper.cpp/releases) and extract to `whisper-cpp/` folder.\n\n### Linux Setup\n\nWhisperSubTranslate works on Linux with a few extra steps:\n\n**Prerequisites:**\n\n```bash\n# Ubuntu/Debian\nsudo apt install cmake build-essential git ffmpeg\n\n# For CUDA GPU acceleration (optional, requires NVIDIA GPU + drivers)\n# Install CUDA Toolkit: https://developer.nvidia.com/cuda-downloads\n```\n\n**Run from source:**\n\n```bash\ngit clone https://github.com/Blue-B/WhisperSubTranslate.git\ncd WhisperSubTranslate\nnpm install    # whisper.cpp will be auto-built from source\nnpm start\n```\n\nIf auto-build fails, build whisper.cpp manually:\n\n```bash\ngit clone https://github.com/ggml-org/whisper.cpp\ncd whisper.cpp\n\n# CPU only\ncmake -B build \u0026\u0026 cmake --build build --config Release\n\n# With CUDA (NVIDIA GPU)\ncmake -B build -DGGML_CUDA=ON \u0026\u0026 cmake --build build --config Release\n\n# Copy the binary\ncp build/bin/whisper-cli /path/to/WhisperSubTranslate/whisper-cpp/\n```\n\n### Build (Windows)\n\n```bash\nnpm run build-win\n```\n\nArtifacts are emitted to `dist2/`.\n\n## Tech Stack\n\n[![Electron](https://img.shields.io/badge/Electron-2C2E3B?style=for-the-badge\u0026logo=electron\u0026logoColor=9FEAF9)](https://www.electronjs.org/) [![Node.js](https://img.shields.io/badge/Node.js-339933?style=for-the-badge\u0026logo=node.js\u0026logoColor=white)](https://nodejs.org/) [![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge\u0026logo=javascript\u0026logoColor=000)](https://developer.mozilla.org/docs/Web/JavaScript) [![DeepL](https://img.shields.io/badge/DeepL_API-0F2B46?style=for-the-badge\u0026logo=deepl\u0026logoColor=white)](https://www.deepl.com/pro-api) [![OpenAI](https://img.shields.io/badge/OpenAI_API-412991?style=for-the-badge\u0026logo=openai\u0026logoColor=white)](https://platform.openai.com/)\n\n| Area                   | Details                                                                                          |\n| ---------------------- | ------------------------------------------------------------------------------------------------ |\n| Runtime                | Electron, Node.js, JavaScript                                                                    |\n| Packaging              | electron‑builder                                                                                 |\n| Networking             | axios                                                                                            |\n| Speech‑to‑text         | whisper.cpp (GGML models)                                                                        |\n| Translation (optional) | **Local (Hy-MT2 1.8B/7B GGUF, offline via node-llama-cpp)**, MyMemory, DeepL, OpenAI GPT, Gemini |\n\n## Translation engines\n\nWhisperSubTranslate can translate subtitles **fully offline** with the bundled Tencent **Hy-MT2** model, or route to free/paid online engines using your own API keys.\n\n| Engine                            | Offline | API key | Cost            | Notes                                                                          |\n| --------------------------------- | :-----: | :-----: | --------------- | ------------------------------------------------------------------------------ |\n| **Hy-MT2 1.8B** (local · default) |   ✅    |   No    | Free            | ~1.13 GB · VRAM 2 GB / RAM 4 GB · 100% on-device                               |\n| **Hy-MT2 7B** (local)             |   ✅    |   No    | Free            | ~6.16 GB · VRAM 8 GB / RAM 12 GB · larger model                                |\n| MyMemory                          |   ❌    |   No    | Free            | ~50K chars/day per IP                                                          |\n| DeepL                             |   ❌    |   Yes   | Free 500K/month | Deterministic output                                                           |\n| OpenAI GPT-5.4 mini               |   ❌    |   Yes   | Paid            | $0.075 in / $0.60 out per 1M tokens · context-aware                            |\n| OpenAI GPT-5.4 nano               |   ❌    |   Yes   | Paid            | Cheaper tier — $0.20 in / $1.25 out per 1M tokens                              |\n| Gemini 3 Flash                    |   ❌    |   Yes   | Free / low-cost | Recommended low-cost route ([Get key](https://aistudio.google.com/app/apikey)) |\n\n\u003e **Privacy:** the local Hy-MT2 engine is the only option that needs **no API key, no network, and no per-use cost** — your video and its dialogue never leave your machine.\n\u003e\n\u003e **Tip:** For long videos (1hr+), MyMemory's daily limit can cause slowdowns. Use Gemini, DeepL, or a configured GPT model instead.\n\n### Translation quality (offline engine)\n\nWhisperSubTranslate ships Tencent's **Hy-MT2** models (1.8B default, 7B optional). In Tencent's official multi-benchmark evaluation, the Hy-MT2 family is competitive with — and on several benchmarks ahead of — leading commercial translation APIs:\n\n![Hy-MT2 translation benchmark — official Tencent figures, bundled in WhisperSubTranslate](assets/hy-mt2-benchmark.png)\n\n\u003e **Source:** official benchmarks published by the model's authors, Tencent — [Hy-MT2 repository](https://github.com/Tencent-Hunyuan/Hy-MT2) · [technical report](https://arxiv.org/pdf/2605.22064) · [models on HuggingFace](https://huggingface.co/tencent/Hy-MT2-1.8B). The chart above is **redrawn from Tencent's official Figure 1**, with our bundled-model (1.8B/7B) numbers verified against the paper tables. These figures measure the **underlying model** on standard MT benchmarks (WildMTBench, WMT25, FLORES-200, etc.), **not** an app-specific re-benchmark of WhisperSubTranslate. Per Tencent, the 7B/30B sizes outperform open models like DeepSeek-V4-Pro/Kimi, and the lightweight **1.8B (our default)** surpasses mainstream commercial APIs such as Microsoft and Doubao overall.\n\nAPI keys and preferences are saved locally on your PC under `app.getPath('userData')` with basic encoding to prevent casual exposure. The configuration file is never uploaded to Git or included in builds.\n\n### Data Storage\n\n| Data                 | Location                                                                                     |\n| -------------------- | -------------------------------------------------------------------------------------------- |\n| Settings \u0026 API Keys  | `%APPDATA%\\whispersubtranslate\\translation-config-encrypted.json`                            |\n| Job History          | `%APPDATA%\\whispersubtranslate\\history.json` (up to 200 entries, file-based for portability) |\n| Error Logs (Windows) | `%APPDATA%\\whispersubtranslate\\logs\\errors.log`                                              |\n| Error Logs (macOS)   | `~/Library/Application Support/whispersubtranslate/logs/errors.log`                          |\n| Error Logs (Linux)   | `~/.config/whispersubtranslate/logs/errors.log`                                              |\n| Models               | `_models/` (in app folder)                                                                   |\n\n### Job History\n\n- Auto-saved per finished job (name, output path, status, timestamp); **capped at 200 entries**.\n- Each row has **Open** (play the result file) and **Folder** (reveal in Explorer) actions.\n- Toggle on/off any time in **Settings → History** — turning it off only stops _new_ entries; existing ones are preserved.\n- **Clear All** performs a forensic-safe wipe: the JSON file is overwritten with zeros, deleted, and any legacy `localStorage` keys are padded out to encourage compaction. SSD wear-leveling means software cannot guarantee 100% unrecoverability — use full-disk encryption for hard guarantees.\n\n### Model Downloads\n\n- While a model is downloading, the card shows a **Cancel** button next to **Downloading…**.\n- Closing the window mid-download safely aborts the transfer.\n- Whisper GGML files are written to a `.partial` path and only renamed to `ggml-*.bin` on success — so a half-downloaded file is **never** mistaken for an installed model on next launch.\n\n## Language support\n\n### UI Languages\n\nKorean, English, Japanese, Chinese, Polish (5 languages)\n\n### Translation Target Languages (14)\n\nKorean (ko), English (en), Japanese (ja), Chinese (zh), Spanish (es), French (fr), German (de), Italian (it), Portuguese (pt), Russian (ru), Hungarian (hu), Arabic (ar), Polish (pl), **Persian (fa)**\n\n### Audio Recognition Languages\n\nwhisper.cpp supports 100+ languages including all major world languages (English, Spanish, French, German, Italian, Portuguese, Russian, Chinese, Japanese, Korean, Arabic, Hindi, Turkish, and many more).\n\n## Models \u0026 performance\n\nModels are stored under `_models/` and auto‑downloaded on demand. Choose a size that fits your machine; larger models are slower but may be more accurate. CUDA is used when available; otherwise CPU runs by default.\n\n| Model             | Size   | VRAM | Speed   | Quality   |\n| ----------------- | ------ | ---- | ------- | --------- |\n| tiny              | ~75MB  | ~1GB | Fastest | Basic     |\n| base              | ~142MB | ~1GB | Fast    | Good      |\n| small             | ~466MB | ~2GB | Medium  | Better    |\n| medium            | ~1.5GB | ~4GB | Slow    | Great     |\n| large-v3          | ~3GB   | ~5GB | Slowest | Best      |\n| large-v3-turbo ⭐ | ~809MB | ~4GB | Fast    | Excellent |\n\n\u003e Note: VRAM requirements are for [whisper.cpp](https://github.com/ggerganov/whisper.cpp) with GGML optimization, which is significantly lower than PyTorch Whisper (~10GB for large). Tested: large-v3 works on 6GB VRAM GPU.\n\n## Branching model\n\nSingle-trunk: `main` is the only long-lived branch. The maintainer commits directly to `main` and tags releases (e.g. `v2.2.0`).\n\n**Contributors:** open a Pull Request from your fork. Any short-lived `feature/\u003cscope\u003e` branch is welcome; it will be squash-merged into `main`.\n\n## Contributing\n\n\u003e **Want to add a new language?** See the [Translation Guide](docs/TRANSLATION.md).\n\n### 1) Branching \u0026 naming\n\nUse one branch type for everything (features, fixes, docs):\n\n| Pattern                        | Use for     |\n| ------------------------------ | ----------- |\n| `feature/\u003cscope\u003e-\u003cshort-desc\u003e` | All changes |\n\nRecommended \u003cscope\u003e values: i18n, ui, translation, whisper, model, download, queue, progress, ipc, main, renderer, updater, config, build, logging, perf, docs, readme\n\nExamples:\n\n```text\nfeature/i18n-api-modal\nfeature/ui-progress-smoothing\nfeature/translation-deepl-test\nfeature/main-disable-devtools\n```\n\n### 2) Commit style (Conventional Commits)\n\nUse prefixes like `feat:`, `fix:`, `docs:`, `refactor:`, `chore:`, `perf:`, `build:`.\n\n```text\nfeat: add DeepL connection test\nfix: localize target language note\n```\n\n### 3) Code guidelines\n\n| Topic             | Guideline                                                                 |\n| ----------------- | ------------------------------------------------------------------------- |\n| I18N              | Don't inline UI/log strings. Add them to I18N tables and reference by key |\n| UX                | Keep progress/ETA/queue states consistent; avoid regressions              |\n| Scope             | Prefer small, focused changes with clear function names                   |\n| Multi‑language UI | Update ko/en/ja/zh/pl together when adding UI                             |\n\n### 4) Manual test checklist\n\n| Scenario                 | Verify                                                  |\n| ------------------------ | ------------------------------------------------------- |\n| Extraction only          | Start/stop flows, progress/ETA behavior                 |\n| Extraction + translation | End‑to‑end result and final SRT naming                  |\n| Model download           | Missing model path; cancel/stop mid‑download            |\n| I18N switch              | Target‑language label, API modal texts update correctly |\n| Translation engines      | MyMemory (no key), DeepL/OpenAI (with keys)             |\n| Build                    | `npm run build-win` completes                           |\n\n### 5) Pull Request checklist\n\n| Item        | Expectation                                           |\n| ----------- | ----------------------------------------------------- |\n| Description | Clear explanation of changes                          |\n| UI impact   | Screenshots for visual changes                        |\n| Testing     | Steps to reproduce/verify                             |\n| Assets      | No large binaries in Git; screenshots under `assets/` |\n\n## Support\n\nIf this project saves you time or helps you publish better subtitles, supporting it directly accelerates development:\n\n- Your support helps: bug fixes, model download reliability, UI polish, new translation options, and Windows build/testing.\n- Transparency: I don't sell data; funds go to development time, infra for release builds, and test credits for translation APIs.\n- One‑time sponsors are credited in README and release notes (opt‑out available).\n- Monthly sponsors ($3/mo via GitHub Sponsors, auto‑billing) also get best‑effort priority triage for \"Sponsor Request\" issues.\n\n[![GitHub Sponsors](https://img.shields.io/badge/Sponsor-GitHub-EA4AAA?style=for-the-badge\u0026logo=github-sponsors\u0026logoColor=white)](https://github.com/sponsors/Blue-B) [![Buy Me A Coffee](https://img.shields.io/badge/One‑time_$3-Buy_Me_A_Coffee-FFDD00?style=for-the-badge\u0026logo=buy-me-a-coffee\u0026logoColor=000)](https://buymeacoffee.com/beckycode7h) [![PayPal](https://img.shields.io/badge/Donate-PayPal-00457C?style=for-the-badge\u0026logo=paypal\u0026logoColor=white)](https://www.paypal.com/ncp/payment/ZEWFKDX595ESJ)\n\n## Acknowledgments\n\n- whisper.cpp is developed by Georgi Gerganov: [ggml-org/whisper.cpp](https://github.com/ggml-org/whisper.cpp)\n- FFmpeg: [ffmpeg.org](https://ffmpeg.org/)\n\n## Contributors\n\nThanks to everyone who helps make WhisperSubTranslate better! 🙏\n\n\u003ca href=\"https://github.com/Blue-B\"\u003e\u003cimg src=\"https://github.com/Blue-B.png?size=80\" width=\"80\" alt=\"Blue-B\" title=\"Blue-B\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/matbgn\"\u003e\u003cimg src=\"https://github.com/matbgn.png?size=80\" width=\"80\" alt=\"matbgn\" title=\"matbgn\" /\u003e\u003c/a\u003e\n\n## Repository activity\n\n![Repobeats analytics image](https://repobeats.axiom.co/api/embed/bb4da4df4fdd4f9193f24a6647d5f10022e9bab9.svg 'Repobeats analytics image')\n\n## Translations\n\nHelp translate WhisperSubTranslate into your language! Translatable strings live in [`locales/*.json`](locales/) and are managed on [Weblate](https://hosted.weblate.org/engage/whispersubtranslate/). See the [Translation Guide](docs/TRANSLATION.md).\n\n\u003ca href=\"https://hosted.weblate.org/engage/whispersubtranslate/\"\u003e\n  \u003cimg src=\"https://hosted.weblate.org/widget/whispersubtranslate/ui/multi-auto.svg\" alt=\"Translation status\" /\u003e\n\u003c/a\u003e\n\n## Star History\n\n\u003ca href=\"https://star-history.com/#Blue-B/WhisperSubTranslate\u0026Date\"\u003e\n  \u003cimg src=\"https://api.star-history.com/svg?repos=Blue-B/WhisperSubTranslate\u0026type=Date\" alt=\"Star History Chart\" width=\"600\" /\u003e\n\u003c/a\u003e\n\n## License\n\nGPL-3.0. External APIs/services (DeepL, OpenAI, etc.) require compliance with their own terms.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBlue-B%2FWhisperSubTranslate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FBlue-B%2FWhisperSubTranslate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBlue-B%2FWhisperSubTranslate/lists"}