Viet-ASR: Formatted Vietnamese STT in 78 MB

Introduction
Most Vietnamese ASR dumps lowercase tokens and leaves casing, punctuation, and number formatting to a second pipeline. coflar-ai just published viet-asr (coflar-ai/viet-asr) — created 2026-11-04T09:05Z — as a single ~86M Zipformer2 transducer whose int8 ONNX pack is 78 MB and whose raw output is already publish-ready Vietnamese text.
One pass. No separate ITN / PnC stage. That is the maker product.
What Shipped
- Vendor / product: viet-asr — coflar-ai
- Modality: speech-to-text / ASR (offline, non-streaming encoder)
- Open vs closed: open weights, Apache-2.0
- Runnable today: download the
int8/ONNX graphs from Hugging Face and run them with sherpa-onnx; card also documents a VietASR SDK path (import vietasr/ multi-language bindings + WASM) - Concrete fact: pooled formatted WER across 24 Vietnamese test sets — 24.14 for viet-asr vs Google Chirp 3 25.16 and Viettel ASR 26.38 — with 28× realtime on one CPU core (int8, AMD EPYC 9334, end-to-end)
- Architecture: Zipformer2 transducer (non-streaming encoder, stateless decoder, context 2); 8192 BPE tokens including case, digits, punctuation, byte fallback; 16 kHz mono → 80-dim Kaldi fbank
Run It (sherpa-onnx)
hf download coflar-ai/viet-asr --local-dir viet-asrimport sherpa_onnx, soundfile as sf
rec = sherpa_onnx.OfflineRecognizer.from_transducer(
encoder="viet-asr/int8/encoder.int8.onnx",
decoder="viet-asr/int8/decoder.int8.onnx",
joiner="viet-asr/int8/joiner.int8.onnx",
tokens="viet-asr/int8/tokens.txt",
decoding_method="modified_beam_search",
max_active_paths=4,
)
pcm, sr = sf.read("audio.wav", dtype="float32")
s = rec.create_stream()
s.accept_waveform(sr, pcm)
rec.decode_stream(s)
print(s.result.text)The model is non-streaming. For long recordings, segment with a VAD (pauses ≥ 1.2 s, ≤ 30 s per chunk, ~1 s context) — the card says the SDK does that automatically when you use it.
Pro Tip
Score this model the way the vendor does: against cased, punctuated, written-form references. On bare lowercased no-punct WER it lands around 17.04, where smaller specialized Zipformers can look stronger — but those leave formatting to you. If your product needs captions that ship without a second ITN stack, the formatted leaderboard is the one that matters.
Limits Worth Knowing
- Non-streaming only at launch — live captioning needs chunking / VAD.
- Meeting sets are still hard (32.64 formatted WER on the vendor’s meeting slice).
- Card numbers are author-reported across public + private call-center/meeting sets; listen on your own domain before you swap a production Chirp/Viettel path.
Original Source
Conclusion
An Apache-2.0, CPU-first Vietnamese ASR that writes like a human typed it — and beats a major cloud ASR on the vendor’s formatted 24-set pool — is a rare same-day open drop. Pull the int8 graphs, wire sherpa-onnx, and see whether your captions still need that ITN sidecar.
—Anabel ♡
