Live demo · in-browser ASR

TRY MY
ASR

Speak into your mic and watch the transcript appear in real time. The default here is my own fine-tune of Moonshine-tiny for accented English — tick the base model too to compare them live on your voice. Everything runs 100% in your browser (WebGPU, WASM fallback): no inference server, and your audio never leaves your device.

01Demo
models: tick 2+ — each phrase is transcribed by all of them, side by side
first run downloads ~30 MB of weights, then they're cached

Transcript will appear here.

Tip: the CC · try my ASR button (bottom right) keeps captions running while you browse the rest of the site — like YouTube captions for real life.

02Results — where the fine-tune wins

I fine-tuned Moonshine-tiny for non-native-accented English (LoRA on the L2-ARCTIC accent corpus + VCTK native speech). Word error rate below is on held-out speakers never seen in training — one per accent — so the numbers are honest, not memorized. Lower is better.

Eval set (unseen speakers)BaseMy fine-tune
Non-native accented English (L2-ARCTIC)25.9%17.1% −34%
— Korean-accented12.7%6.1%
— Hindi-accented12.7%8.0%
— Mandarin-accented26.3%18.9%
— Vietnamese-accented44.4%29.1%
— Arabic-accented23.1%14.6%
— Spanish-accented37.6%27.1%
Native English (VCTK)6.1%4.3% −30%
LibriSpeech test-clean (long-form audiobooks)4.8%7.0% regression, out-of-domain

Trained with LoRA on a university SLURM cluster. Four runs collapsed before I traced it to a double-label-shift bug in the transformers 4.57 Moonshine loss path (fixed with explicit decoder_input_ids). The long-form regression is the honest trade-off of specializing on short accented utterances — listed rather than hidden.

03How it works
Mic → VAD

Your mic is segmented by Silero VAD (WASM, also fully local) — the model only sees speech, not silence.

ASR in a Web Worker

Moonshine-tiny (27M params, built for low-latency on-device streaming) runs via transformers.js / ONNX Runtime Web — WebGPU when your browser has it, WASM otherwise.

Zero servers

Weights stream once from Hugging Face's CDN and cache in your browser. Nothing you say is uploaded, logged, or stored — there is no backend to send it to.

The training story

LoRA fine-tune on a SLURM cluster (L2-ARCTIC + VCTK) → eval on held-out accents → ONNX export + quantization → WebGPU inference in your tab. Weights live on Hugging Face (lucascho/moonshine-tiny-accent-ONNX); the portfolio ships zero model bytes.