Word-by-word video captions, entirely in the browser
A free tool that transcribes any clip locally with word-level timing, renders live karaoke captions, and exports a burned-in MP4 — with nothing ever uploaded.
- Role
- Creator & Developer
- Year
- 2026
- Hosting
- A static SPA on Cloudflare, served with cross-origin isolation headers; all transcription, preview, and encoding run in the browser





- Client-side, nothing uploaded
- 100%
- Local Whisper transcription
- WebGPU
- Burned-in, watermark-free export
- MP4
Overview
Short-form creators want word-by-word "karaoke" captions, but the polished tools upload your footage to a server, stamp a watermark on the export, and hide it behind an account. Karaoke Captions does the whole job in the browser: drop a clip, it transcribes locally with word-level timestamps, you restyle it live, then export a finished MP4 — and nothing ever leaves your device.
I built it solo as a free, no-sign-up tool. The hard part is that real ML and video encoding now run entirely client-side: OpenAI’s Whisper via Transformers.js for word-level transcription, a Remotion composition for the live word-synced preview, and WebCodecs to burn captions into an H.264 MP4 — with no backend at all.
What the build involved
- Ran Whisper locally in a Web Worker via Transformers.js with word-level timestamps, using WebGPU inference and a WASM fallback so the UI and preview never freeze.
- Rendered a live, word-synced karaoke preview with Remotion, driven by a style panel for accent colour, font, size, position, outline, word-pop, and emphasis words.
- Exported a burned-in MP4 fully client-side with WebCodecs — canvas frames encoded to H.264, the original audio re-encoded to AAC, muxed with mp4-muxer — plus always-available SRT and VTT.
- Served the SPA with cross-origin isolation (COOP/COEP) so SharedArrayBuffer and threaded inference work, with visible badges for the active WEBGPU / WASM mode.
Challenges & solutions
Challenge
Running real speech-to-text and video encoding with no server, without freezing the browser.
Solution
Whisper runs in a Web Worker with WebGPU-or-WASM, streaming model-download and transcription progress to the UI, while WebCodecs handles H.264 and AAC encoding entirely on-device.
Challenge
Word-by-word captions have to stay perfectly in sync and never jump as phrases swap.
Solution
Timestamps are converted from seconds to frames once, centrally; each phrase is its own absolutely-centred element, and overlays wait on document.fonts.ready so a font swap never reflows the text.
Technologies
Available for new work
Want results like these?
Tell me what you are building. I will reply with a clear scope and a fixed quote.