# OpenSubs > A subtitle generator that runs inside the browser tab. It transcribes a > video's speech, translates it, styles it, and burns the result into the > picture. The video file is never uploaded, because the product contains no > upload endpoint. https://opensubs.app ## How it works - Speech recognition is OpenAI's Whisper, compiled to ONNX and run by transformers.js. WebGPU where the machine has it, WebAssembly otherwise. - Three model sizes are offered, downloaded once and then cached by the browser: Tiny (English only, ~40 MB), Base (~80 MB), Small (~250 MB). Only the model is fetched from the network. The audio is not. - Subtitles are rendered by libass — the same renderer used for the preview and for the burn, so what is previewed is what is produced. - Burning in uses WebCodecs. Only the picture is re-encoded; the audio track is copied across untouched. - The subtitle engine is Rust compiled to WebAssembly, shared with the desktop build and the command-line tool. ## What is different about it - **There is no upload endpoint in the product.** This is stronger than a promise not to upload: there is no server to upload to, so a footage leak is not something that has to be prevented. It can be checked in the browser's Network tab — after the page and the model have loaded, working on a video produces no requests on the default on-device route. - **No file-size limit, no queue, no watermark.** All three exist on hosted tools because the file has to reach a server and the server has to pay for the encode. Neither applies here. - **No account for anything that runs locally.** Transcription, on-device translation, all 12 subtitle styles, word-by-word highlighting, trimming, burning into MP4 and every export format work signed out. An account is needed only for optional cloud translation on our own backend, priced at $5 for 1,000 credits, with the price of a job shown before it runs. - **Mixed-language audio produces one subtitle file.** The spoken language is detected every four seconds rather than once per file, so a video that switches between two languages is transcribed in both. Whisper's own pipeline has no language detection at all; this is implemented on top of it. - **Exports:** .srt, .vtt and .ass; .txt, the words alone with no timings; or an MP4 with the subtitles burned in. - **Licence:** AGPL-3.0-or-later. ## Honest limitations - Accuracy is Whisper's accuracy at the model size the machine can afford, and a browser is a smaller budget than a server. - **The figures below are a floor, not field accuracy.** They are measured on synthesised speech, where the reference transcript is exactly the text that was spoken, so there is no annotator judgement in them — and also no accent, no overlap, no room noise and no music. Real footage scores worse. They are published in this form because a number with its method attached can be checked, and "highly accurate" cannot. Measured on 2026-09-09, three single-language clips, `e2e/accuracy.mjs`: | Model | English (WER) | Chinese (CER) | Japanese (CER) | |-------|---------------|---------------|----------------| | Base (~80 MB) | 7.7% | 3.4% | 4.3% | | Small (~250 MB)| 0.0% | 1.7% | 4.3% | Small roughly halves the error on English and Chinese and costs about twice the time. On Japanese it scored identically to Base on this clip — a bigger model is not a guaranteed improvement per language. - **No comparison against other tools yet.** A head-to-head against a competing browser-based tool is open as a tracked task and unfinished, so this file makes no relative claim. - The first visit downloads a model. That is a real wait, and it is the price of not uploading the video. - Cloud translation, if chosen, sends the subtitle *text* — never the video — to whichever provider was picked. Cloud transcription, if chosen, sends the audio span you trimmed to the service whose key you supplied — again, never the video. The on-device options send nothing and are the defaults. - iOS 17 Safari cannot run the recogniser at all; iOS 26 works. - **The editor changes words, not timings.** Cue text is editable; the start and end times are not, and cues cannot be added, deleted or merged. A file that is out of sync with its video needs a different tool. ## Where it runs - In the browser at https://opensubs.app/, with nothing installed. - As a browser extension that puts subtitles over whatever is playing in the tab: - Chrome Web Store: https://chromewebstore.google.com/detail/live-subtitles-in-your-br/ebiggkbolhfmhhiclmhkjkjofnflbepd - Firefox Add-ons: https://addons.mozilla.org/en-US/firefox/addon/opensubs/ - Edge Add-ons: https://microsoftedge.microsoft.com/addons/detail/live-subtitles-in-your-br/ocegdknngeahbblajpajaekoekghgdnh - As a desktop app for macOS, Windows and Linux, for long files (one video at a time). - As a command-line tool, built from source. Contact: hello@opensubs.app ## Pages - [Subtitle generator](https://opensubs.app/): the tool, and what it does. - [Burn subtitles into video](https://opensubs.app/burn-subtitles-into-video): hardcoding captions into the picture. - [Subtitle styles](https://opensubs.app/styles): the twelve presets, each rendered live from the engine's own numbers rather than screenshotted. - [Translate subtitles](https://opensubs.app/translate-subtitles) - [Subtitle sites](https://opensubs.app/subtitle-sites): where to download subtitles, and making them yourself. - [Browser extension](https://opensubs.app/browser-extension): subtitles over whatever is playing in the tab; Chrome, Edge and Firefox. - [Transcribe video](https://opensubs.app/transcribe-video): transcribing a video to text in the browser, exported as .txt (the words alone) or as .srt, .vtt or .ass. - [Whisper in the browser](https://opensubs.app/whisper-in-browser): how OpenSubs runs Whisper locally in the tab, and the three model sizes. - [Subtitle editor](https://opensubs.app/subtitle-editor): correcting the text of an .srt or .vtt in the browser; timings are not editable. - [Caption generator](https://opensubs.app/caption-generator): generating captions from a video's speech in the browser, exported as a caption file or burned into an MP4. - [VTT to SRT](https://opensubs.app/vtt-to-srt): converting a .vtt to .srt in the browser, and what the conversion keeps and drops. - [SRT file generator](https://opensubs.app/srt-file-generator): creating an .srt file from a video's speech in the browser, and what the file contains. - [Bilingual subtitles](https://opensubs.app/bilingual-subtitles): putting the original and a translation on screen together, burned into an MP4 or exported, for your own video files. - [VEED and Kapwing alternative](https://opensubs.app/veed-alternative): OpenSubs compared with VEED and Kapwing for adding subtitles (price, watermark, upload, subtitle files, translation), each fact sourced, and when either of them is the better choice. - [Blog](https://opensubs.app/blog) - [Privacy](https://opensubs.app/privacy): what is stored, and where. - [Windows desktop privacy policy](https://opensubs.app/desktop-privacy): the separate policy for the Windows desktop app. ## Languages Four pages exist as real documents in eight languages, translated at build time rather than by script, each with its own URL and canonical: the home page, Burn subtitles into video, Subtitle styles and Privacy. The home page in each language is: - English — https://opensubs.app/ (also the hreflang x-default) - 简体中文 — https://opensubs.app/zh-Hans - 繁體中文 — https://opensubs.app/zh-Hant - 日本語 — https://opensubs.app/ja - 한국어 — https://opensubs.app/ko - Deutsch — https://opensubs.app/de - Español — https://opensubs.app/es - Português — https://opensubs.app/pt The other three sit under the same prefix: /ja/burn-subtitles-into-video, /ja/styles, /de/privacy, and so on. Where the tool is embedded in a page, it follows that page, so the interface and the copy around it are the same language. The remaining pages — Translate subtitles, Subtitle sites, Browser extension, Transcribe video, Whisper in the browser and the blog — are in English. One blog post, How to add captions to a video, also has a Portuguese version at https://opensubs.app/pt/blog/how-to-add-captions-to-a-video.