Browser-based speech transcription powered by Whisper and WebGPU. No server, no API keys — the model runs entirely on your GPU inside the browser tab.
- Real-time transcription via OpenAI Whisper (tiny / base / small)
- WebGPU inference with automatic WASM fallback
- Voice activity detection — stops recording when you stop speaking
- Continuous mode for hands-free dictation
- Models cached in the browser after first download
- Chrome 113+ (WebGPU enabled by default)
- Firefox and Safari fall back to WASM automatically (slower)
- Node.js (for the dev server only — not used at runtime)
npm install
npm run devOpen http://localhost:5173 in Chrome.
- Select a model and click Load Model
- Click the microphone or press
Spaceto start recording - Speech is transcribed automatically and appears at the top of the transcript
| Mode | Shortcut | Behaviour |
|---|---|---|
| Auto-stop | 2 |
Records until silence is detected, then transcribes |
| Continuous | 3 |
Loops: records → detects silence → transcribes → repeats |
| Manual | 1 |
Toggle recording on/off manually (keyboard only) |
Space — start / stop recording
Esc — stop the continuous loop
1 2 3 — switch modes
| Model | Size | Notes |
|---|---|---|
| Whisper Tiny | ~39 MB | Fastest, less accurate |
| Whisper Base | ~74 MB | Recommended — reliable for English, Swedish, Russian |
| Whisper Small | ~244 MB | Higher memory usage, may be slow |
Models are downloaded once and cached in the browser's Cache Storage.
src/App.tsx— React application shell for model loading, recording modes, transcription, and grammar correctionsrc/services/AudioRecorder.ts— Microphone capture, VAD viaAnalyserNode, and resampling to 16 kHz mono viaOfflineAudioContextsrc/services/WorkerService.ts— Main-thread wrapper around the inference workersrc/worker.ts— Whisper and grammar pipelines run in a Web Worker to keep the UI responsivesrc/pipeline/index.ts— Message protocol between main thread and worker (extension point for future VAD, LLM, and TTS stages)vite.config.ts— SetsCross-Origin-Opener-PolicyandCross-Origin-Embedder-Policyheaders required forSharedArrayBuffer(used by the ONNX WASM backend)
@huggingface/transformers— Whisper inference in the browser- Vite — dev server and bundler
- Web Audio API — audio capture and resampling
- WebGPU — GPU inference