Always-on-top translated captions
Teams talks.
You read along, translated.
Lingua screen-reads the live caption strip, OCRs it, and translates it as the speaker talks — entirely in your browser.
01
Screen-read
capture the caption strip via getDisplayMedia.
capture the caption strip via getDisplayMedia.
02
OCR
DeepSeek-OCR-2 turns pixels into text.
DeepSeek-OCR-2 turns pixels into text.
03
Translate
an OpenAI-compatible chat call to the gateway.
an OpenAI-compatible chat call to the gateway.
04
Overlay
auto-scrolling transcript on top of every window.
auto-scrolling transcript on top of every window.
Your key never leaves the browser.
The MaaS API key is stored in this browser's
localStorage only.
Nothing is stored server-side: Lingua is a zero-dependency static PWA.
The only network traffic is the OCR and translate calls you initiate, sent
to the gateway you configure.
Pick your build
Web capture
Pick a window or tab, drag a rectangle over the caption strip, and Lingua translates as the speaker talks. Requires Chrome, Edge, or Firefox.
Mobile translate
Paste a caption or upload a screenshot — Lingua OCRs it (if needed) and translates it. Mobile browsers can't capture the screen, so this path uses paste or share.
Read picture
Take a photo or drop a screenshot and get every word and letter in it, with a word/letter count and optional translation. Laptop, iPhone and Android.
All projects
Browse the rest of the apps in this monorepo.
How it works
- Screen-read, not hooked. Teams has no public caption API, so Lingua captures the pixels of the caption strip via
getDisplayMediaand crops them down to 640 px wide before OCR (smaller images are markedly faster). - Change detection. every frame is reduced to a 64-px-wide perceptual hash; when the hash matches the previous frame, OCR + translate are skipped entirely, so an idle caption strip costs nothing.
- Two-stage pipeline. OCR (DeepSeek-OCR-2) runs first, then a non-streaming translation call to the configured chat model. The translation system prompt asks for the target language and nothing else, so the model output is the translation directly.
- Live last-line. the pipeline marks the last (still-growing) caption line as
live, re-translates it as more words arrive, and memoises translations so an identical line is sent to the model exactly once. - Speaker-aware. a short capitalised name plate (e.g. "Alice Chen") is detected heuristically and used as the speaker label of the following line, so names are shown once, not twice.
- Running transcript. a transcript accumulator keeps every line seen, so captions that scroll off the strip stay in the overlay until you clear it.
Constraints
- Browser screen capture is only available on desktop browsers. The mobile build uses paste / upload instead.
- Mixed content: browsers refuse to call an
http://gateway from anhttps://page. If you host this page over HTTPS, either host the gateway over HTTPS too, or run the page onhttp://localhost. - CORS: the gateway must allow your page's origin. If you see "Blocked by CORS", ask the gateway operator to add your origin to
Access-Control-Allow-Origin.