ep-hindi-asr is a model for speech recognition from Epoch Discovery, released under Apache License 2.0 (access requested at publisher). It has 354M parameters. At 16-bit it needs about 0.8 GB of GPU memory, which fits on 1x MI300X from $1.85 an hour, at the lowest prices in the SAVRN Index.
ep-hindi-asr is a Hindi speech recognition model built on the audio encoder of EmbeddingGemma 2. A CTC head reads a learned mix of the encoder's layers and predicts Gemma tokenizer units.
Runs On
What it takes to serve ep-hindi-asr (354M parameters): the memory its weights need at each precision, and the cheapest way to rent enough data-center GPUs to hold them.
| Precision | Weights | Memory needed | Cheapest setup | Per hour | Also fits |
|---|---|---|---|---|---|
| 16-bit | 0.7 GB | 0.8 GB | 1x MI300X (192 GB) Vultr |
$1.85 | 1x H100 $1.99 · 1x MI325X $2.00 |
| 8-bit | 0.4 GB | 0.4 GB | 1x MI300X (192 GB) Vultr |
$1.85 | 1x H100 $1.99 · 1x MI325X $2.00 |
| 4-bit | 0.2 GB | 0.2 GB | 1x MI300X (192 GB) Vultr |
$1.85 | 1x H100 $1.99 · 1x MI325X $2.00 |
Memory is the weights at that precision plus 20% for the runtime and a short context; a long context needs more. Prices are the lowest on-demand hourly rates in the SAVRN Index, read Oct 18, 2026.
ep-hindi-asr on every accelerator the SAVRN Index prices, at every precision
Model Card
By Epoch Discovery, published under apache-2.0, revision df499ee64c9a.
ep-hindi-asr is a Hindi speech recognition model built on the audio encoder of EmbeddingGemma 2. A CTC head reads a learned mix of the encoder's layers and predicts Gemma tokenizer units. Only the top two encoder layers, the layer mix and the head are trained; the rest of the encoder is used as released by Google DeepMind. The model was trained in two stages on a single NVIDIA A10: 300 hours of IndicVoices Hindi, then continued fine-tuning on IndicVoices, Vaani, Kathbath and Gram Vaani with noise augmentation. It decodes in one pass with no autoregressive decoder, and transcribes about 800 times faster than real time with batched input. All results use the released checkpoint (stage 2, step…
Read Epoch Discovery's full model card
Hugging Face |
Base model |
Vaani Benchmark
License: Apache 2.0 | Authors: Epoch Discovery
ep-hindi-asr is a Hindi speech recognition model built on the audio encoder of EmbeddingGemma 2 . A CTC head reads a learned mix of the encoder's layers and predicts Gemma tokenizer units. Only the top two encoder layers, the layer mix and the head are trained; the rest of the encoder is used as released by Google DeepMind.
The model was trained in two stages on a single NVIDIA A10: 300 hours of IndicVoices Hindi, then continued fine-tuning on IndicVoices, Vaani, Kathbath and Gram Vaani with noise augmentation. It decodes in one pass with no autoregressive decoder, and transcribes about 800 times faster than real time with batched input.
Model Overview
| Parameters | Total at inference | ~350M |
|---|---|---|
| Audio encoder (EmbeddingGemma 2) | 300M, top 2 of 12 layers fine-tuned | |
| Trained parameters | 99.5M (encoder layers 50.4M, reader 43.3M, head 5.8M) | |
| Architecture | Encoder | 12-layer Conformer, 25 frames/s (40 ms) |
| Layer mix | Softmax-weighted sum of 13 hidden states (1024-d) | |
| Reader | Linear 1024→768, depthwise conv (k=15), 6 Transformer blocks (768-d, 12 heads) | |
| Head | Linear 768→512, dot product with unit embeddings initialised from Gemma token embeddings | |
| Output units | 10,539 (10,537 Gemma tokens + blank + unknown) | |
| Loss / decoding | CTC; greedy or beam search with a word 4-gram KenLM | |
| Input/Output | Input | Mono audio, any sample rate (resampled to 16 kHz) |
| Output | Hindi text in Devanagari, no punctuation | |
| Checkpoint | model.safetensors, bf16, 0.71 GB (full model, ~350M parameters) + config.json |
Benchmark Results
All results use the released checkpoint (stage 2, step 28,000) in bf16. The checkpoint was selected on dev sets only. The KenLM decoder settings are the stage-1 settings, tuned on our IndicVoices dev split.
| Benchmark | Metric | Greedy | + KenLM |
|---|---|---|---|
| Vaani-Benchmark-V1.0, Hindi test (5,050 segments, 10.9 h) | WER, 3 references (official toolkit) | 14.3 | 13.5 |
IndicVoices Hindi valid (5,504 utterances, 8.9 h) |
WER | 18.45 | – |
| CER | 9.08 | – | |
| Kathbath Hindi test-unknown (1,929 utterances, 3.0 h) | WER | 18.26 | – |
| Kathbath Hindi test-known (3,130 utterances, 5.0 h) | WER | 18.25 | – |
| Lahaja (6,152 utterances, 12.3 h) | WER | 18.11 | – |
| FLEURS Hindi test (418 utterances, 1.3 h) | WER | 21.69 | – |
| Gram Vaani eval (1,032 utterances, 2.8 h) | WER | 33.38 | – |
Except for Vaani, WER is single-reference after normalize.py (strict) on reference and hypothesis.
Stage 1 (previous release) and stage 2
| Benchmark | Stage 1, greedy | Stage 2, greedy |
|---|---|---|
| Vaani-Benchmark-V1.0 | 21.8 | 14.3 |
IndicVoices valid |
19.21 | 18.45 |
| FLEURS Hindi test | 25.72 | 21.69 |
Inference
1. Get access and download
The repository and the base model are gated. Accept the terms on both pages first:
epoch-discovery/ep-hindi-asr and
google/embeddinggemma-2.
pip install -U "huggingface_hub[cli]"
hf auth login
hf download epoch-discovery/ep-hindi-asr --local-dir ep-hindi-asr
cd ep-hindi-asr
pip install -r requirements.txt
transcribe.py loads the weights from model.safetensors and config.json. From google/embeddinggemma-2 it
downloads only the configuration files and the tokenizer.
2. Command line
# greedy decoding (fastest)
python transcribe.py --ckpt model.safetensors audio.wav
# several files in one call (the model loads once)
python transcribe.py --ckpt model.safetensors a.wav b.flac c.mp3
# beam search with the 4-gram KenLM (lower WER, slower; the search runs on the CPU)
python transcribe.py --ckpt model.safetensors --decode lm \
--lm hi_train_noheldout_4gram.bin --unigrams unigrams_noheldout.txt audio.wav
# CPU only
python transcribe.py --ckpt model.safetensors --device cpu audio.wav
Each output line is <file>\t<text>\t(RTF <real-time factor>). Add --normalize to apply the scoring normaliser
(normalize.py, strict mode). The KenLM settings (alpha 0.3, beta 1.0, beam 64) come from config.json;
--alpha, --beta and --beam override them.
3. Python
import torch
from transcribe import load, read_audio, log_probs, greedy
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model, units, ck = load("model.safetensors", device)
wav = read_audio("audio.wav") # mono float32, resampled to 16 kHz
lp = log_probs(model, wav, device) # CTC log-probabilities, 25 frames per second
print(greedy(lp, units))
4. Long recordings
The model was trained on segments of 30 s or less, and transcribe.py decodes each file in one pass. Split longer
audio into segments of up to 30 s before transcription. Split at pauses (for example with a voice activity
detector), not at fixed times, so that words are not cut.
5. Speed and hardware
| Hardware | Setting | Speed |
|---|---|---|
| NVIDIA A10 24 GB, bf16 | length-sorted batches, greedy | ~770-890x real time |
| NVIDIA A10 24 GB, bf16 | one file at a time, greedy (transcribe.py) |
~160x real time |
| Apple Mac, CPU | one file at a time, greedy | ~15-18x real time |
Peak GPU memory is 5.6 GB with batched input. KenLM beam search runs on the CPU and adds decode time.
6. Notes
- Run in bf16 (GPU) or fp32 (CPU). fp16 is not supported.
- Use SDPA attention (the default in
eg2_model.py). Eager attention in transformers 5.19.0 gives wrong outputs. - Output is Devanagari without punctuation or digits. English words are written in Devanagari.
7. Reproduce the Vaani score
python scripts/vaani_eval.py --pkg . --data <Vaani-Benchmark-V1.0 snapshot> \
--toolkit <Vaani-Benchmark-Evaluation-Toolkit> --out out/
python run_eval.py --model epoch-discovery/ep-hindi-asr --mode score --predictions out/predictions_beam_lm.json
The second command is from the official toolkit.
Training
| Setting | Value |
|---|---|
| Stage 1 | 300 h IndicVoices Hindi, 24,000 steps from google/embeddinggemma-2 |
| Stage 2 | continued from stage 1: Vaani 40 %, IndicVoices 40 %, Kathbath + Gram Vaani 20 % per batch; ~1,460 h available |
| Trained parts | top 2 encoder layers, layer mix, reader, CTC head (99.5M parameters) |
| Augmentation | SpecAugment, speed perturbation, MUSAN noise/music/babble, room reverb, telephone band-limiting |
| Selection | best mean WER on dev sets; no test data used for training, tuning or selection |
| Hardware | 1x NVIDIA A10 24 GB; ~4 h (stage 1) + ~8 h (stage 2) |
Training scripts for stage 1 are in scripts/.
Usage and Limitations
Intended Usage
Transcription of Hindi speech to Devanagari text: voice notes, interviews, call and meeting recordings, and batch transcription of audio archives where throughput matters.
Limitations
- Language and script: Hindi only. English and other Latin-script words are written in Devanagari or missed; there is no romanised or code-mixed output.
- Numbers: the training transcripts spell numbers as words, so the model does not output digits. Test sets that write numbers as digits (for example FLEURS) count these as errors.
- Formatting: no punctuation or capitalisation.
- Accents and audio: accuracy varies by region; on Vaani, greedy WER per state ranges from 7.2 to 22.6. Rural telephone speech (Gram Vaani) remains the hardest domain.
- Streaming: not supported; each window uses its full context.
- Language model: the KenLM is built from IndicVoices transcripts only and has a limited vocabulary for formal or technical text.
License and Acknowledgements
The fine-tuned weights and code are released under Apache 2.0. Use of the base model is subject to the terms of
google/embeddinggemma-2. Training data: IndicVoices and
Kathbath (AI4Bharat),
Vaani (ARTPARK, IISc) and
Gram Vaani (OpenSLR 118), each under its own terms. Noise augmentation uses
MUSAN and simulated room impulse responses (OpenSLR 28).
The KenLM text comes from IndicVoices.
The recipe follows QUAN-Transcribe and the idea of transcribing with the EmbeddingGemma 2 audio encoder from Embedding Gemma Transcribe.
Identity and Version
- Repository
- epoch-discovery/ep-hindi-asr
- Publisher
- Epoch Discovery
- Task
- Speech recognition
- Modality
- Audio
- Library
- pytorch
- Parameters
- 354M parameters
- Languages
- hi
- Revision
- df499ee64c9a4146b4d462d9070d30c87fbc13ed
- First published
- 2026-10-15
- Last updated
- 2026-10-16
Files and Weights
26 files, 754.6 MB in total. The weights are 2 files totalling 753.0 MB in bin, safetensors.
Every file
| File | Type | Size | SHA-256 |
|---|---|---|---|
| hi_train_noheldout_4gram.bin | Weights | 45.0 MB | — |
| model.safetensors | Weights | 708.0 MB | — |
| .eval_results/ARTPARK-IISc-Vaani-Benchmark-V1-0.yaml | Configuration | 111 B | — |
| config.json | Configuration | 100.6 KB | — |
| decode_configs.json | Configuration | 223 B | — |
| eg2_model.py | Configuration | 13.8 KB | — |
| normalize.py | Configuration | 5.7 KB | — |
| scripts/build_vocab.py | Configuration | 4.8 KB | — |
| scripts/decode.py | Configuration | 10.3 KB | — |
| scripts/decode_lm.py | Configuration | 14.0 KB | — |
| scripts/dl_meta.py | Configuration | 2.3 KB | — |
| scripts/eval.py | Configuration | 6.5 KB | — |
| scripts/export_slim.py | Configuration | 1.3 KB | — |
| scripts/export_st.py | Configuration | 3.0 KB | — |
| scripts/lm_text_filtered.py | Configuration | 1.5 KB | — |
| scripts/make_subsets.py | Configuration | 1.4 KB | — |
| scripts/prep_lang.py | Configuration | 8.6 KB | — |
| scripts/train_ctc.py | Configuration | 24.6 KB | — |
| scripts/vaani_eval.py | Configuration | 4.8 KB | — |
| transcribe.py | Configuration | 7.0 KB | — |
| units_hi.json | Configuration | 328.1 KB | — |
| README.md | Documentation | 9.6 KB | — |
| requirements.txt | Other | 148 B | — |
| scripts/build_lm_filtered.sh | Other | 1.2 KB | — |
| unigrams_noheldout.txt | Other | 1.0 MB | — |
| .gitattributes | Repository | 1.5 KB | — |
License and Download
- License
- apache-2.0
- Access
- Access requested at publisher
- Download size
- 753.0 MB
Epoch Discovery grants access through its official repository on Hugging Face. Read the license.
Built From
- Derived from google/embeddinggemma-2
- Trained on (disclosed) ARTPARK-IISc/Vaani-transcription-part
- Trained on (disclosed) ai4bharat/IndicVoices
- Trained on (disclosed) ai4bharat/Kathbath
Evaluations
Each result is shown as reported, with the conditions its reporter stated. None is a SAVRN measurement. A comparison lines two results up only when their configuration, unit and setup are all stated and identical.
| Benchmark | Conditions | Result | Reported by | Revision | Date |
|---|---|---|---|---|---|
| ARTPARK-IISc/Vaani-Benchmark-V1.0 | Task Hindi_WERMetric Hindi_WERComparison conditions not established | 13.5 | Not named Reported by a third party |
Evaluated revision not stated | 2026-10-16 |
Memory Requirements
| Precision | Weights in memory |
|---|---|
| As published | 753.0 MB |
| 16-bit | 0.7 GB |
| 8-bit | 0.4 GB |
| 4-bit | 0.2 GB |
Weights only, from the published parameter count; the key-value cache and runtime add to this.
Questions About ep-hindi-asr
How much GPU memory does ep-hindi-asr need?
About 0.8 GB at 16-bit and 0.2 GB at 4-bit: the weights (354M parameters) plus a working margin. A long context needs more.
What is the cheapest GPU to run ep-hindi-asr on?
At 16-bit, 1x MI300X from $1.85 an hour; at 4-bit, 1x MI300X from $1.85 an hour, at the lowest on-demand prices the SAVRN Index lists.
Can I use ep-hindi-asr commercially?
Yes. ep-hindi-asr is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.
Similar Models
Fine-tuned facebook/wav2vec2-large-xlsr-53 hindi using the Multilingual and code-switching ASR challenges for low resource Indian languages. When using this model, make sure that your speech input is sampled at 16kHz. The model can be used directly (without a language model) as follows: The model can be evaluated as follows on the hindi test data of Common Voice. The script used for training can be found Hindi ASR Fine Tuning Wav2Vec2
This model is a finetuned version of facebook/wav2vec2-large-xlsr-53. There was an issue with vocab, seems like there are special characters included and they were not considered during training You could try
A fine-tuned XLS-R 300M CTC model for Urdu automatic speech recognition. It transcribes 16 kHz mono audio and includes an optional 5-gram KenLM decoder. Best reported result: 39.89% WER / 16.70% CER with KenLM decoding on the Urdu Common Voice 8.0 test set. See the Kaggle evaluation notebook for a reproducible example. The repository contains a 5-gram KenLM language model. The Kaggle notebook evaluates a five-sample streaming smoke test from fixie-ai/commonvoice170 (ur, test). Results are reported on the Urdu test split of Mozilla Common Voice 8.0. The language-model row is the model-card score; compare each result only with the same decoding strategy. To reproduce language-model evaluation…
IPA phoneme recognition for Kölsch (Ripuarian German, Cologne). Fine-tuned from facebook/wav2vec2-xls-r-300m with a CTC head over a 48-symbol IPA inventory. This is also the forced-alignment model. Its frame-level CTC posteriors drive torchaudio.functional.forcedalign to produce Praat TextGrids with word and phone tiers — see notebook 9 in the repository. Trained during the CIF Tandem Fellowship at IfL-Phonetik, University of Cologne, on Alles Kölsch (Bhatt & Lindlar 1998) — 4,670 utterances, 4.5 hours of spontaneous Cologne dialect speech from 105 speakers aged 10–88 across 49 neighbourhoods. Kölsch is Ripuarian German. It has no public speech dataset and no standardised spelling: 94.1 %…
Model · Speech recognition
wav2vec2-xls-r-parlaspeech-hr
CLASSLA - CLARIN Knowledge Centre for South Slavic Languages
This model for Croatian ASR is based on the facebook/wav2vec2-xls-r-300m model and was fine-tuned with 300 hours of recordings and transcripts from the ASR Croatian parliament dataset ParlaSpeech-HR v1.0. If you use this model, please cite the following paper: Nikola Ljubešić, Danijel Koržinek, Peter Rupnik, Ivo-Pavao Jazbec. ParlaSpeech-HR -- a freely available ASR dataset for Croatian bootstrapped from the ParlaMint corpus. http://www.lrec-conf.org/proceedings/lrec2022/workshops/ParlaCLARINIII/pdf/2022.parlaclariniii-1.16.pdf Evaluation is performed on the dev and test portions of the ParlaSpeech-HR v1.0 dataset. There are multiple models available, and in terms of CER and WER, the…