Model or dataset
Blue-B/WhisperSubTranslate avatar
Blue-B/WhisperSubTranslate

WhisperSubTranslate: local subtitle extraction and translation for video

A free, local desktop app to extract subtitles (SRT) from video and translate them into any language — unlimited use, no signup, no cloud.

814 stars63 forksJavaScriptNOASSERTION

At a glance

What is it?
WhisperSubTranslate is an Electron desktop app that turns a video into an SRT subtitle file with whisper.cpp and then translates it with a local Hy-MT2 model or an online engine, all on your own machine. It ships as a 2.15 GB Windows ZIP with no Python and no separate CUDA toolkit, and it is explicit that it creates new subtitles from audio rather than reading embedded tracks.
Who is it for?
WhisperSubTranslate suits someone who needs subtitles for their own video and cannot or will not send the file to a cloud service, and who is prepared to spend several gigabytes of disk on models to get the job done offline. It is the wrong tool if you want to extract a subtitle track that already exists in the file, because the app says plainly that it does not read embedded tracks or on-screen text, and the wrong choice for a machine with a small disk or no GPU.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 13 days ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What the app does and what it explicitly does not do

WhisperSubTranslate is a free, local desktop app that extracts subtitles as SRT from a video and translates them into any language. The README puts the workflow in one sentence: drop in a video, generate an SRT with whisper.cpp, then translate it offline with a downloaded Hy-MT2 model or with free or paid online engines.

The limitation is stated in a blockquote right at the top and it is the one that determines whether the app is useful to you. The app creates new subtitles from your video's audio, which is speech to text. It does not extract embedded subtitle tracks and it does not read on-screen text, so there is no OCR.

That distinction matters more than it might sound. A video that already carries a subtitle track, or that shows its dialogue as burned-in text, needs a different tool. This one re-derives the timing from the audio, which is a slower and less accurate route to a subtitle that may already exist, and its value is in the languages it can then translate into.

The privacy property is the other headline. The feature list says 100 percent local speech to text, that your video never leaves your machine, with no account and no upload. The translation side is more mixed, since the online engines are available too, but the local path needs no API key once the models are downloaded.

The Windows package and the first run

The user path starts with a download rather than an install, and the README is unusually precise about it.

The latest Windows x64 ZIP is about 2.15 GB, and on the release page you pick WhisperSubTranslate-v<version>-win-x64.zip under Assets, not GitHub's own source code archives. No Python and no separate CUDA Toolkit installation is needed for that package. Linux users are directed to the source setup.

The first rule is that you extract the entire ZIP into a new folder and run WhisperSubTranslate.exe inside it, and you do not run the executable from inside the ZIP or move it away from its bundled files. This is an Electron application with native components, and a portable bundle that is not self-contained will fail in ways that are hard to diagnose.

For a first check, the README suggests a short video of about ten to thirty seconds with clear speech, with translation set to no translation, the spoken language chosen or left on automatic, and device left on automatic. The default speech model is large-v3-turbo, while tiny and base use less download space for a quick check at lower accuracy.

Then it is click Start Extraction, confirm the model download if prompted, and keep the internet connected until it finishes. The model download happens once and is separate from transcription time, which is the detail that stops people thinking the extraction is hung.

When the job completes, Open output folder finds the .srt. By default it is saved beside the source video, and existing files are saved under a new name rather than overwritten. The README suggests checking a few lines and their timing in a video player before trusting the result.

The download and disk budget, in numbers

The README publishes a table of sizes, and it is the most decision-relevant part of the documentation.

The Windows x64 portable ZIP is 2.15 GB, once per app version. The large-v3-turbo speech model, which is the default, adds 1.62 GB at the first extraction with that model. The tiny and base speech models add 77.7 MB and 148 MB respectively and exist for a smaller setup check. The Hy-MT2 1.8B translation model adds 1.13 GB and is needed only for local translation, while the Hy-MT2 7B model adds 6.16 GB for those who want the larger local translator.

The arithmetic is given too. The ZIP plus the default speech model is about 3.77 GB of network downloads, and adding Hy-MT2 1.8B makes it about 4.90 GB.

The README is careful that these are not free-disk-space requirements, because extraction needs space for both the ZIP and the unpacked application, and processing needs headroom for temporary audio, output and downloads. It explicitly declines to claim an exact total disk requirement, since the unpacked Windows app size is not measured.

One more layout detail catches people. Models normally live on the system drive under %APPDATA%\whispersubtranslate even when the executable sits on another drive, and for a self-contained installation you create a portable-data folder next to the executable before the first launch.

Translating, and choosing between the local and online engines

Translation is a second pass, not part of the extraction. You select Hy-MT2 (local) and a target language, then start again, or you add an existing SRT. The selected translation model downloads separately on first use, and after the required models are downloaded, local extraction and local translation work offline with no API key.

The Hy-MT2 model is a Tencent translation model, and the README describes the online alternative as free or paid engines where an API key is required where applicable, naming MyMemory, DeepL, OpenAI, Gemini and Claude.

The distinction between those two paths is the whole design of the app. The local path is the privacy path and the free path, at the cost of the model download and of the translation quality you get from a 1.8B or 7B parameter model against a hosted frontier model. The online path is the quality path, at the cost of the file leaving the machine, which for subtitles means the text of your video leaves the machine, and the cost of a key.

There is a diagnostic warning in the README that is worth repeating. If a local translation job is unexpectedly slow, check the actual backend shown in the log, then use Settings, Copy diagnostics. Speech recognition and translation choose their backends separately, and owning an NVIDIA GPU does not prove a translation job used CUDA. That is a real trap, because a user with a fast GPU and a slow translation will otherwise assume the machine is at fault.

Running from source and the Linux path

The developer setup is short for Node users.

bash
npm ci
npm start

Node.js 22.12.0 or newer is required, and the README asks you to use the committed lockfile. The dependency installation also provisions whisper.cpp, with CUDA and Vulkan builds on Windows, and the README warns to allow several gigabytes of disk space for it. FFmpeg comes in through npm, and the selected GGML model downloads on first use.

The Linux path builds more of the stack yourself.

bash
sudo apt install cmake build-essential git ffmpeg   # Ubuntu/Debian
npm ci   # whisper.cpp is built from source
npm start

For CUDA acceleration on Linux, the NVIDIA CUDA Toolkit has to be installed before npm ci, because the whisper.cpp build is compiled against it. The manual build steps are in CONTRIBUTING.md.

The application code is organised under src/main/ for the Electron main process and services, src/preload/ for the renderer bridge, src/renderer/ for the user interface, and src/shared/ for the shared IPC channels.

The Windows build has its own command.

bash
npm run build-win -- --publish never   # artifacts are emitted to dist2/

The README explains the constraint that trips up cross-builders. When cross-building from Linux, npm may omit Windows-only optional packages, so the build workspace must include the lockfile-pinned @node-llama-cpp/win-x64, win-x64-cuda, win-x64-cuda-ext and win-x64-vulkan packages with their JS and JSON metadata and native binaries. And it warns that a successful build alone does not verify that local translation can load its backend on Windows.

The package.json shows the rest of the toolchain, with electron-builder doing the packaging, a postinstall script, an i18n build and check pair, and a set of smoke and end to end test scripts including dedicated ones for all models, interaction, log visualisation and the pipeline.

The Linux keyring fallback is the one to fix before you use it

There is a security note in the README that deserves to be read before you configure an online engine on Linux.

API keys are stored via Electron safeStorage, which on Linux uses libsecret. Without a keyring daemon, which is the situation in a headless SSH session or on a minimal desktop or window manager, saving falls back to legacy AES with a hardcoded key.

The app is explicit about the consequences. The app logs an explicit security warning and marks the save as insecure, and the README says plainly that this storage is not secure. The fix is to install gnome-keyring, or to run in a desktop session that has a keyring.

So the tool tells you when it has degraded itself, which is better than the usual case of a key silently ending up in a recoverable place on disk. But the user still has to act, and the advice is simple: on a headless Linux box, either install a keyring or do not use the online engines, and use the local Hy-MT2 path instead.

This is worth weighing against the rest of the design. The app is careful about video never leaving the machine, and about not requiring an account, and the one place it hands a secret to the operating system is the place where the operating system may not be able to keep it.

Where WhisperSubTranslate is the wrong tool

The first limitation is the embedded subtitle point already covered, and it is the one that sends people looking for a different app. If the video already has a subtitle track in a language you want, this app will derive a new one from the audio, which is slower, less accurate and entirely unnecessary.

The second is the disk and network cost. A 2.15 GB application download, a 1.62 GB speech model and a 1.13 GB translation model is a lot for a first install, and a machine with a small disk or a metered connection will feel it. The 6.16 GB option for the larger translator is more of the same.

The third is that the quality ceiling of the local path is a small model. A 1.8B or 7B parameter translation model is not going to match a hosted frontier model on subtitle dialogue, which is full of idioms, names and wordplay. The local path is private and free, not better.

The fourth is the platform coverage. The packaged experience described in detail is Windows x64, and the Linux path is a source build with the CUDA Toolkit ordering constraint. There is no macOS path described, and the portable ZIP and the Linux source setup are not the same kind of artefact.

The fifth is the drift risk of the local translation backend. The package.json pins @node-llama-cpp binaries per platform and variant, and the README warns that a build succeeding does not mean the backend loads. A local translation stack is another moving dependency beside whisper.cpp, FFmpeg, the GGML models and Node itself.

How it compares with a hosted transcription service and with subtitle editors

The comparison with a hosted transcription service such as the major speech to text APIs is the one the app is built against, and the difference in approach is where the data goes. A hosted service takes your audio, returns text with timings, and the privacy question is answered by the provider's policy. This app does the same work on your machine with whisper.cpp, which means the file never moves, which means no account, no upload, no per-minute cost, and also no vendor improving the model for you.

The second comparison is with the class of tools that only edit subtitles, the ones that shift timings, fix punctuation and convert between SRT and other formats. Those are much smaller, much faster and they work on an SRT you already have. This app is the upstream half: it creates the SRT. The overlap is the translation step, where a subtitle editor may offer machine translation and this app offers both a local model and a set of API keys.

The third comparison is with a self-hosted Whisper setup of your own, for example a Python script calling whisper.cpp or faster-whisper on the command line. The difference in approach is packaging and workflow. A script gives you a pipeline you can compose, and this app gives you a queue, a job history kept local, live progress, a settings interface and the model download handled for you. For a single file, a script is lighter. For a queue of twenty files and a person who does not want to think about FFmpeg arguments, the app earns its place.

The fourth is the offline story. Once the models are downloaded, this app works with no network at all. That is a property no hosted service can offer, and for someone working on footage they cannot upload, it is the reason to use this kind of local tool at all.

Licence, releases and what to set up before the first job

The licence field on the repository records a custom licence that GitHub cannot classify, with the terms in the LICENSE file. The package.json metadata is more specific and says GPL-3.0, and the package description is in Korean, describing a subtitle extraction and translation tool based on Whisper with whisper.cpp. A THIRD_PARTY_NOTICES.md file is present at the root, which matters for an application that bundles whisper.cpp, FFmpeg, llama.cpp and several models.

The project is not archived and the last push was on 2026-10-10, so it is being worked on. The recent releases are v2.5.2 from 2026-10-10, v2.5.1 from 2026-09-27 and v2.5.0 from 2026-08-26, a steady monthly patch cadence, and the repository also carries a release-notes/ directory and a docs/ folder with the translated READMEs for Korean, Japanese, Chinese and Polish.

Five things to sort out before the first job.

How much disk you can spend, since the app itself is 2.15 GB and the models add to it. Which speech model, using tiny or base for a setup check and large-v3-turbo for real work. Whether you will translate locally, which means the 1.13 GB Hy-MT2 1.8B model, or through an online engine, which means an API key and, on Linux, a keyring daemon. Where the models should live, since a portable-data folder next to the executable has to be created before the first launch to keep everything on one drive. And which output format you want to check first, since the SRT is written beside the source video and the README asks you to verify a few lines and their timing in a video player before trusting a whole file.

Editorial conclusion

WhisperSubTranslate suits someone who needs subtitles for their own video and cannot or will not send the file to a cloud service, and who is prepared to spend several gigabytes of disk on models to get the job done offline. It is the wrong tool if you want to extract a subtitle track that already exists in the file, because the app says plainly that it does not read embedded tracks or on-screen text, and the wrong choice for a machine with a small disk or no GPU. Before installing, read the download size table, decide whether you need the 6.16 GB Hy-MT2 7B translator or the 1.13 GB one, and install a keyring daemon on Linux, because without one your API keys fall back to a hardcoded key that the app itself flags as insecure.

Frequently asked questions

Does WhisperSubTranslate extract existing subtitle tracks from a video?

No. The README states that the app creates new subtitles from your video's audio through speech to text, and that it does not extract embedded subtitle tracks or read on-screen text, so there is no OCR.

How do I install WhisperSubTranslate on Windows?

Download the Windows x64 ZIP from the release page, choosing the WhisperSubTranslate-v<version>-win-x64.zip asset rather than the source code archives, then extract the entire ZIP into a new folder and run WhisperSubTranslate.exe inside it. No Python and no separate CUDA Toolkit is needed for that package.

How much disk space do the models need for WhisperSubTranslate?

The Windows ZIP is 2.15 GB, the default large-v3-turbo speech model adds 1.62 GB, and the Hy-MT2 1.8B translation model adds 1.13 GB, so the ZIP plus the default speech model is about 3.77 GB of downloads and adding the 1.8B translator makes it about 4.90 GB. The README notes these are not free disk space requirements, since extraction and processing need extra headroom.

Can WhisperSubTranslate work fully offline?

Yes, once the required models are downloaded. Local extraction uses whisper.cpp and local translation uses the Hy-MT2 model, and after the downloads complete, both work offline with no API key. The online engines such as MyMemory, DeepL, OpenAI, Gemini and Claude are available as alternatives with keys where applicable.

Why are my API keys stored insecurely on Linux?

Keys are stored through Electron safeStorage using libsecret, and without a keyring daemon the app falls back to legacy AES with a hardcoded key. The app logs a security warning and marks the save as insecure. Installing gnome-keyring or running in a desktop session with a keyring enables secure storage.

How do I build WhisperSubTranslate from source on Linux?

Install the build dependencies with `sudo apt install cmake build-essential git ffmpeg`, then run `npm ci` and `npm start`, with whisper.cpp built from source. Node.js 22.12.0 or newer is required, and for CUDA acceleration the NVIDIA CUDA Toolkit has to be installed before npm ci.

Official sources

  1. Blue-B/WhisperSubTranslate on GitHub
  2. Issues
  3. README
  4. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/blue-b-whispersubtranslate.svg)](https://hysenlabs.com/projects/blue-b-whispersubtranslate)

Was this useful?