← All work
Karaoke Captions/2026

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
Karaoke Captions — screenshot 1 of 5
Karaoke Captions — screenshot 2 of 5
Karaoke Captions — screenshot 3 of 5
Karaoke Captions — screenshot 4 of 5
Karaoke Captions — screenshot 5 of 5
1 / 5
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

React 19TypeScriptViteRemotionTransformers.jsWebCodecs
This is aAI Product Developmentproject.

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.