eulogik/polywhisper
      
๐๏ธ PolyWhisper v9 โ Efficient Multilingual Indic ASR
by Eulogik โ Frontier Edge AI ยท Vernacular Intelligence ยท eulogik.com
TL;DR: PolyWhisper v9 is a research-ready automatic speech recognition (ASR) system for Hindi, Tamil, Telugu, Bengali, and Marathi. It pairs a frozen OpenAI Whisper-Small backbone (244M params) with tiny per-language LoRA adapters (~14MB each). Bengali WER drops โ28.2% and Marathi โ79.6% versus the no-augmentation baseline โ at roughly 1% of the storage cost of full fine-tuning.

โจ Why PolyWhisper?
WER = word error rate (lower is better). FLEURS test set, beam=1, punctuation-normalized scoring.
๐ Benchmarks (FLEURS, beam=1, normalized WER)

๐งช The v9 finding: augment per language, not globally
Training with SpecAugment + speed perturbation on all languages damaged Hindi/Tamil (token-loop degeneration) while massively helping Bengali/Marathi. The v9 recipe augments only `bn`/`mr` and trains hi/ta/te clean:

๐ฏ Decoding: per-language beam widths (measured, full FLEURS test)
Beam-5 + repetition penalty 1.3 helps every language except Telugu, where beam search collapses into repeated-token loops (0/472 perfect samples, 326/472 over 100% WER). The library/CLI defaults encode this (num_beams=None โ per-language optimal):
๐ฆ Which adapter should I use?
All adapters are rank-16 LoRA (decoder + encoder attention), ~14MB each. Backbone weights are not included โ they load from openai/whisper-small at runtime. The _prod suffix is the v9 production-run tag, not an augmentation marker: Telugu was trained clean in the selective v9 recipe.
๐ Quickstart
pip install -e .# Hindi speech to text
polywhisper transcribe audio.wav --lang hi
# Tamil with JSON output
polywhisper transcribe audio.wav --lang ta --format json
# Auto-detect language, SRT subtitles
polywhisper transcribe audio.wav --format srt > subs.srt
# Batch a folder
polywhisper batch ./audio_folder/ --lang bn --output results.jsonfrom polywhisper import transcribe
result = transcribe("audio.wav", lang="mr")
print(result.text)
print(result.segments) # timestamped segments๐ฅ๏ธ CPU-only inference (ONNX Runtime)
Export INT8-quantized ONNX graphs (no PyTorch, no GPU needed at inference):
polywhisper export --lang hi --variant prod --int8Pre-exported v9 graphs live under export/onnx/ on the Hub โ per language, fp32 + INT8:
Files are named {lang}_{lang}_best_prod_{encoder,decoder}{,_int8}.onnx. INT8 is ~4ร smaller.

Verification: fp32 ONNX vs PyTorch max diff < 1e-3 on all five languages (encoder + decoder). End-to-end greedy spot-checks (FLEURS audio, beam=1):
Spot-checks are tiny (5โ10 utterances) so single-sentence flips move the numbers; fp32 ONNX is at parity with torch. INT8 trades a few points for 4ร smaller files.
๐๏ธ Training recipe (reproducible)
- Data: IndicVoices-ST (~19โ20k clips/language) ยท Eval: FLEURS
- Backbone:
openai/whisper-small, frozen ยท Adapters: LoRA rank-16, encoder + decoder attention - Schedule: 3โ5 epochs/language, batch 4, AdamW, cosine LR (peak 1e-4), 2ร NVIDIA T4
- Augmentation (v9): SpecAugment + speed perturb for
bn/mronly;hi/ta/teclean - Selection: WER-gated checkpoints (
*_best_*.pt) on FLEURS dev slices - Code: `train_v3.py` ยท orchestrator `kaggle_train_resumable.py` ยท scoring `normalize_ortho.py`
โ FAQ
What is PolyWhisper? PolyWhisper is an open-source Indic ASR toolkit: one frozen Whisper-Small backbone plus five small per-language LoRA adapters covering Hindi, Tamil, Telugu, Bengali, and Marathi.
How is it different from fine-tuning Whisper? Full fine-tuning rewrites ~244Mโ1.5B weights per language. PolyWhisper freezes the backbone and trains ~3.5M LoRA parameters per language (~14MB), so five languages ship for the storage cost of a rounding error.
Which languages are usable? All five ship working adapters. Hindi (46.3 WER) and Tamil (70.1) are strongest; Telugu, Bengali, and Marathi remain high-WER research adapters, useful for assistive/search/subtitle-draft workflows rather than verbatim transcription.
Can I run it on CPU? Yes โ export to ONNX INT8 and run with ONNX Runtime, no GPU required.
Can I run it on a Mac? Yes โ PyTorch MPS is supported (Device: mps), plus CPU via ONNX.
What data was it trained/evaluated on? Trained on IndicVoices-ST conversational speech, evaluated on FLEURS read speech with punctuation-normalized, script-aware scoring.
โ ๏ธ Limitations
- Absolute WER on Telugu/Bengali/Marathi is still high โ usable for assistive/search/subtitle-draft workflows, not verbatim legal/medical transcription.
- Evaluated on read speech (FLEURS); spontaneous conversational accuracy will differ.
- Beam=1 numbers in the benchmark table above (paper parity); shipped defaults use beam-5 + repetition penalty 1.3 except Telugu (beam-1), see decoding table.
๐ License & citation
MIT. Whisper weights ยฉ OpenAI. Training data: IndicVoices-ST (CC-BY) ยท Eval: FLEURS (CC-BY).
@misc{polywhisper2026,
title = {PolyWhisper: Efficient Multilingual Indic ASR via Frozen Backbone and Per-Language LoRA Adapters},
author = {Kishore, Gautam},
year = {2026},
publisher = {HuggingFace},
url = {https://huggingface.co/eulogik/polywhisper}
}๐ Links
- ๐ Eulogik: eulogik.com
- ๐ค Model: huggingface.co/eulogik/polywhisper
- ๐ป Code: github.com/eulogik/PolyWhisper
- ๐ฃ๏ธ Train data: ai4bharat/indicvoices-st
- ๐งช Eval data: google/fleurs
