Automatic Speech Recognition
NeMo
speech-recognition
fastconformer
indic
multilingual
telephony
call-center
zero-shot-language-identification
rnn-t
Eval Results (legacy)
Instructions to use TieIncred/VaaniCall with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- NeMo
How to use TieIncred/VaaniCall with NeMo:
import nemo.collections.asr as nemo_asr asr_model = nemo_asr.models.ASRModel.from_pretrained("TieIncred/VaaniCall") transcriptions = asr_model.transcribe(["file.wav"]) - Notebooks
- Google Colab
- Kaggle
File size: 17,983 Bytes
deb594e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 | ---
library_name: nemo
pipeline_tag: automatic-speech-recognition
license: apache-2.0
language:
- hi
- bn
- ta
- te
- kn
- ml
- mr
- gu
- pa
- or
- en
tags:
- automatic-speech-recognition
- speech-recognition
- fastconformer
- nemo
- indic
- multilingual
- telephony
- call-center
- zero-shot-language-identification
- rnn-t
datasets:
- ai4bharat/IndicVoices
- ARTPARK-IISc/Vaani
metrics:
- wer
- cer
model-index:
- name: VaaniCall
results:
- task:
type: automatic-speech-recognition
name: Automatic Speech Recognition
dataset:
name: AI4Bharat IndicVoices (telephonic)
type: ai4bharat/IndicVoices
split: test
metrics:
- type: wer
value: 24.06
name: WER
- type: cer
value: 8.26
name: CER
- task:
type: automatic-speech-recognition
name: Automatic Speech Recognition
dataset:
name: AI4Bharat IndicVoices (clean)
type: ai4bharat/IndicVoices
split: test
metrics:
- type: wer
value: 24.20
name: WER
- type: cer
value: 8.31
name: CER
- task:
type: automatic-speech-recognition
name: Automatic Speech Recognition
dataset:
name: Google FLEURS (clean)
type: google/fleurs
split: test
metrics:
- type: wer
value: 23.52
name: WER
- type: cer
value: 8.34
name: CER
---

<br>
# VaaniCall
**Call-grade speech recognition for 11 Indian languages.**
By [Tausif Iqbal](https://huggingface.co/TieIncred). Built on NVIDIA NeMo FastConformer, fine-tuned from VAANI for PSTN, VoIP, and contact-center audio.
VaaniCall transcribes a phone call without a language code. It infers language and script, and it is trained through a 21-stage telephony pipeline so AMR, packet loss, and handset noise look like training data β not a domain shift.

---
## Why VaaniCall
| | |
|---|---|
| **Zero-shot language ID** | No `lang=` argument. One model, eleven languages, native scripts. |
| **Telephony-hardened** | 21-stage GPU augmentation: codecs, burst loss, VAD bite, handset EQ, room IR. |
| **Holds on clean audio** | Phone fine-tune does not tax clean WER (24.20% β 24.06% on IndicVoices). |
| **Beats Whisper on Indic** | **3.5Γ lower** overall WER than Whisper large-v3 on IndicVoices. |
| **FastConformer + RNNT** | Streaming-friendly NVIDIA NeMo `EncDecRNNTBPE` checkpoint (`.nemo`). |
---
## Performance at a glance
All numbers are **Word Error Rate** (lower is better). Evaluations use **500 clips per language**.

| Benchmark | Condition | VaaniCall | Whisper large-v3 | Relative WER cut |
|---|---|---:|---:|---:|
| IndicVoices | Clean | **24.20%** | 84.07% | **71%** |
| IndicVoices | Telephonic | **24.06%** | 84.50% | **72%** |
| Google FLEURS | Clean | **23.52%** | 65.23% | **64%** |
Whisper large-v3 still leads on **English**. VaaniCall is the Indic-language model.

---
## Benchmarks
### vs Whisper large-v3 β IndicVoices, telephonic

<details>
<summary><b>IndicVoices Β· telephonic Β· full table</b></summary>
| Language | N | VaaniCall WER β | VaaniCall CER β | Whisper WER | Whisper CER |
|---|---:|---:|---:|---:|---:|
| Bengali | 500 | **15.41%** | **4.93%** | 73.87% | 38.04% |
| English | 500 | 13.26% | 4.56% | **7.80%** | **3.04%** |
| Gujarati | 500 | **21.46%** | **7.56%** | 61.48% | 29.72% |
| Hindi | 500 | **16.04%** | **6.87%** | 30.31% | 15.61% |
| Kannada | 500 | **38.01%** | **10.96%** | 98.03% | 53.05% |
| Malayalam | 500 | **40.70%** | **11.53%** | 138.83% | 108.41% |
| Marathi | 500 | **17.10%** | **6.30%** | 93.50% | 47.21% |
| Odia | 500 | **31.52%** | **10.40%** | 110.63% | 97.36% |
| Punjabi | 500 | **14.46%** | **6.03%** | 86.10% | 54.26% |
| Tamil | 500 | **33.82%** | **9.84%** | 80.72% | 40.71% |
| Telugu | 500 | **28.45%** | **8.63%** | 146.64% | 97.12% |
| **Overall** | **5500** | **24.06%** | **8.26%** | 84.50% | 56.30% |
</details>
<details>
<summary><b>IndicVoices Β· clean Β· full table</b></summary>
| Language | N | VaaniCall WER β | VaaniCall CER β | Whisper WER | Whisper CER |
|---|---:|---:|---:|---:|---:|
| Bengali | 500 | **15.16%** | **4.96%** | 73.36% | 36.81% |
| English | 500 | 14.14% | 4.67% | **8.37%** | **3.12%** |
| Gujarati | 500 | **20.02%** | **6.68%** | 56.27% | 25.96% |
| Hindi | 500 | **16.45%** | **6.77%** | 30.71% | 15.20% |
| Kannada | 500 | **38.26%** | **11.02%** | 99.44% | 52.16% |
| Malayalam | 500 | **41.79%** | **12.11%** | 145.50% | 114.81% |
| Marathi | 500 | **16.76%** | **5.80%** | 92.38% | 46.12% |
| Odia | 500 | **31.85%** | **10.63%** | 107.96% | 95.15% |
| Punjabi | 500 | **15.71%** | **6.59%** | 89.11% | 58.95% |
| Tamil | 500 | **34.50%** | **10.22%** | 77.39% | 38.11% |
| Telugu | 500 | **28.39%** | **8.73%** | 141.52% | 96.52% |
| **Overall** | **5500** | **24.20%** | **8.31%** | 84.07% | 56.30% |
</details>
### vs Whisper large-v3 β Google FLEURS (out of domain)
Held-out read speech. Odia is not in FLEURS.

<details>
<summary><b>FLEURS Β· clean Β· full table</b></summary>
| Language | N | VaaniCall WER β | VaaniCall CER β | Whisper WER | Whisper CER |
|---|---:|---:|---:|---:|---:|
| Bengali | 500 | **26.00%** | **9.22%** | 77.60% | 32.63% |
| English | 500 | 15.16% | 7.88% | **4.47%** | **1.78%** |
| Gujarati | 500 | **24.94%** | **8.22%** | 54.99% | 22.19% |
| Hindi | 500 | **15.70%** | **6.18%** | 27.61% | 9.63% |
| Kannada | 500 | **25.80%** | **7.95%** | 72.85% | 22.87% |
| Malayalam | 500 | **37.55%** | **10.36%** | 130.76% | 102.00% |
| Marathi | 500 | **22.32%** | **7.18%** | 76.52% | 22.61% |
| Punjabi | 500 | **16.53%** | **6.06%** | 74.63% | 35.88% |
| Tamil | 500 | **32.78%** | **9.84%** | 47.73% | 12.11% |
| Telugu | 500 | **29.19%** | **9.99%** | 126.29% | 74.64% |
| **Overall** | **5000** | **23.52%** | **8.34%** | 65.23% | 34.04% |
> Tamil CER is lower for Whisper (12.11%) despite a higher WER β typically an artifact of shorter predicted strings. VaaniCall still wins WER.
</details>
### Per-language profile

Strongest Indic languages on phone audio: **Punjabi 14.5% Β· Bengali 15.4% Β· Hindi 16.0% Β· Marathi 17.1%**.
### vs VAANI base β the telephony fine-tune
VaaniCall is a telephony specialist on top of VAANI. On phone-channel audio it improves **9 of 10** Indic languages. On clean audio the two models are statistically tied (24.37% vs 24.38% WER).

<details>
<summary><b>vs VAANI base Β· telephonic</b></summary>
| Language | N | VaaniCall WER β | VAANI WER | ΞWER | VaaniCall CER β | VAANI CER | ΞCER |
|---|---:|---:|---:|---:|---:|---:|---:|
| Bengali | 500 | **19.85%** | 21.70% | +1.85 | **7.74%** | 9.36% | +1.62 |
| Gujarati | 500 | **26.27%** | 28.97% | +2.70 | **10.72%** | 11.50% | +0.78 |
| Hindi | 500 | **19.65%** | 20.28% | +0.63 | **8.92%** | 9.22% | +0.30 |
| Kannada | 500 | **44.44%** | 47.03% | +2.59 | **14.93%** | 15.73% | +0.80 |
| Malayalam | 500 | **47.67%** | 48.51% | +0.84 | **16.46%** | 16.79% | +0.33 |
| Marathi | 500 | **23.65%** | 25.12% | +1.46 | **9.29%** | 10.02% | +0.73 |
| Odia | 500 | 35.93% | **34.56%** | β1.37 | 13.65% | **13.28%** | β0.37 |
| Punjabi | 500 | **20.26%** | 20.78% | +0.51 | **9.50%** | 9.71% | +0.21 |
| Tamil | 500 | **40.88%** | 41.84% | +0.96 | **14.69%** | 15.10% | +0.41 |
| Telugu | 500 | **32.17%** | 33.04% | +0.88 | **11.41%** | 11.75% | +0.34 |
| **Overall** | **5000** | **29.96%** | 31.04% | **+1.08** | **11.96%** | 12.46% | **+0.51** |
*Ξ = VAANI β VaaniCall. Positive Ξ β VaaniCall is better. English excluded (not a VAANI fine-tune target).*
</details>
<details>
<summary><b>vs VAANI base Β· clean</b></summary>
| Language | N | VaaniCall WER | VAANI WER | ΞWER | VaaniCall CER | VAANI CER | ΞCER |
|---|---:|---:|---:|---:|---:|---:|---:|
| Bengali | 500 | **14.94%** | 15.07% | +0.13 | 5.01% | **4.97%** | β0.04 |
| Gujarati | 500 | **21.11%** | 21.93% | +0.82 | **7.38%** | 7.61% | +0.24 |
| Hindi | 500 | 16.47% | **16.39%** | β0.08 | 6.78% | **6.75%** | β0.03 |
| Kannada | 500 | **37.91%** | 38.78% | +0.87 | **10.99%** | 11.16% | +0.17 |
| Malayalam | 500 | **40.37%** | 40.63% | +0.26 | **11.46%** | 11.60% | +0.14 |
| Marathi | 500 | 17.05% | **17.01%** | β0.04 | 5.38% | **5.33%** | β0.05 |
| Odia | 500 | 31.18% | **28.49%** | β2.69 | 9.68% | **9.15%** | β0.53 |
| Punjabi | 500 | **14.17%** | 14.38% | +0.21 | 5.93% | **5.86%** | β0.07 |
| Tamil | 500 | **34.26%** | 34.49% | +0.24 | **9.82%** | 9.87% | +0.05 |
| Telugu | 500 | **27.12%** | 27.55% | +0.43 | **7.95%** | 8.07% | +0.12 |
| **Overall** | **5000** | **24.37%** | 24.38% | **+0.01** | **8.17%** | 8.18% | **+0.01** |
*Results are statistically equivalent on clean audio β the fine-tune does not spend general accuracy to buy telephony robustness.*
</details>
### vs AI4Bharat IndicConformer
IndicConformer is a strong general-purpose Indic ASR and still leads this comparison. VaaniCall is optimized for **call-channel robustness and zero-shot language ID**, not for matching a dedicated per-language conformer on clean read speech.
| Condition | VaaniCall | IndicConformer | Gap |
|---|---:|---:|---:|
| Telephonic | 29.38% | **26.11%** | β3.26 pp |
| Clean | 24.56% | **20.63%** | β3.93 pp |
Largest telephonic gaps: Malayalam β5.61 pp, Telugu β5.49 pp. English excluded.
<details>
<summary><b>vs IndicConformer Β· telephonic</b></summary>
| Language | N | VaaniCall WER | IndicConformer WER β | ΞWER | VaaniCall CER | IndicConformer CER β | ΞCER |
|---|---:|---:|---:|---:|---:|---:|---:|
| Bengali | 500 | 18.99% | **16.81%** | β2.18 | 7.29% | **6.65%** | β0.63 |
| Gujarati | 500 | 25.31% | **22.48%** | β2.83 | 9.89% | **9.46%** | β0.43 |
| Hindi | 500 | 19.61% | **17.27%** | β2.34 | 9.25% | **7.86%** | β1.40 |
| Kannada | 500 | 44.50% | **43.22%** | β1.28 | 15.24% | **13.92%** | β1.33 |
| Malayalam | 500 | 45.91% | **40.30%** | β5.61 | 15.74% | **12.75%** | β2.99 |
| Marathi | 500 | 22.31% | **18.78%** | β3.53 | 8.27% | **7.09%** | β1.18 |
| Odia | 500 | 36.38% | **32.34%** | β4.04 | 13.86% | **12.42%** | β1.44 |
| Punjabi | 500 | 19.16% | **16.48%** | β2.68 | 8.75% | **8.74%** | β0.01 |
| Tamil | 500 | 38.82% | **35.30%** | β3.52 | 13.53% | **11.34%** | β2.18 |
| Telugu | 500 | 34.36% | **28.87%** | β5.49 | 12.52% | **10.10%** | β2.41 |
| **Overall** | **5000** | 29.38% | **26.11%** | β3.26 | 11.62% | **10.15%** | β1.47 |
</details>
<details>
<summary><b>vs IndicConformer Β· clean</b></summary>
| Language | N | VaaniCall WER | IndicConformer WER β | ΞWER | VaaniCall CER | IndicConformer CER β | ΞCER |
|---|---:|---:|---:|---:|---:|---:|---:|
| Bengali | 500 | 15.42% | **12.79%** | β2.64 | 4.96% | **4.00%** | β0.95 |
| Gujarati | 500 | 20.37% | **15.24%** | β5.13 | 7.09% | **5.11%** | β1.98 |
| Hindi | 500 | 15.97% | **14.23%** | β1.74 | 6.58% | **5.68%** | β0.89 |
| Kannada | 500 | 37.67% | **33.94%** | β3.73 | 11.10% | **9.40%** | β1.70 |
| Malayalam | 500 | 41.67% | **35.23%** | β6.43 | 12.06% | **9.67%** | β2.39 |
| Marathi | 500 | 16.08% | **13.02%** | β3.05 | 5.26% | **4.28%** | β0.99 |
| Odia | 500 | 30.82% | **25.86%** | β4.96 | 9.86% | **8.01%** | β1.85 |
| Punjabi | 500 | 15.00% | **10.65%** | β4.35 | 6.48% | **4.21%** | β2.27 |
| Tamil | 500 | 34.76% | **30.35%** | β4.41 | 10.31% | **8.52%** | β1.79 |
| Telugu | 500 | 27.90% | **24.43%** | β3.47 | 8.49% | **6.92%** | β1.57 |
| **Overall** | **5000** | 24.56% | **20.63%** | β3.93 | 8.40% | **6.74%** | β1.66 |
</details>
---
## How it works

### Training
Two-phase fine-tune from the VAANI FastConformer checkpoint.

1. **Language alignment** β encoder frozen; decoder learns script and language mapping.
2. **Acoustic refinement** β last five encoder layers plus the full decoder unfrozen for telephonic acoustics.
### Data
Trained on [AI4Bharat IndicVoices](https://huggingface.co/datasets/ai4bharat/IndicVoices) and [VAANI](https://huggingface.co/datasets/ARTPARK-IISc/Vaani): **50,000** train / **5,000** val / **5,000** test clips per language (mean duration ~18 s).
### Telephony augmentation
Every training batch can pass through a 21-stage, GPU-accelerated call-channel simulator.

<details>
<summary><b>All 21 stages</b></summary>
| # | Stage | Prob | What it does |
|---|---|---|---|
| 0 | Identity setup | 100% | Tier: Premium / Standard / Legacy. Locks mic profile and codec behavior. |
| 1 | Formant shift | 25% | Vocal-tract warp (0.95β1.05Γ) so the model does not memorize speakers. |
| 2 | Speed perturbation | 30% | Tempo + pitch together (0.9β1.1Γ). |
| 3 | Room IR | 50% | GPU conv1d reverb, partial RMS match, up to 20 ms pre-delay. |
| 4 | Background noise | 90% | WHAM! floor (15β25 dB SNR) + MUSAN chatter (40%, 10β20 dB). |
| 5 | Mic profile | 100% | Flat / mid / low / muffled EQ + tanh saturation. |
| 6 | Mic plosives | 35% | Breath thumps on transients, 20β50 Hz. |
| 7 | Handling noise | 45% | Handset friction, lowpass @ 2.5 kHz, 25β35 dB SNR. |
| 8 | Vocal EQ | 75% | Presence peak 900β1600 Hz; optional nasal / low-mid dip. |
| 9 | Volume drift | 20% | Interpolated gain envelope, Β±3 dB. |
| 10 | Pre-codec AGC | 85% | Noise-aware rolling-RMS AGC, gain capped at 3.5Γ. |
| 11 | Codec roundtrip | 100% | pcm_alaw 35% / amrnb 35% / amrwb 15% / opus 10% / pcm_mulaw 5%. |
| 12 | Loudness recovery | 100% | Peak targets: Premium β8 / Standard β4 / Legacy β1 dBFS. |
| 13 | Gateway VAD clipping | 35% | IVR VAD bite: 15β45 ms off 40% of onsets. |
| 14 | Network loss | 40% | GilbertβElliott burst loss, 20 ms packets, optional PLC smear. |
| 15 | Stutter / jitter | 25% | 5β40 ms micro-dropouts to 0β10% amplitude. |
| 16 | Clock drift | 15% | Per-100 ms resample warp 0.998β1.002Γ. |
| 17 | IMD distortion | 35% | Quadratic + cubic harmonics. |
| 18 | Soft clipping | 70% | Handset tanh above 0.5β0.85. |
| 19 | Receiver hiss | 40β85% | Hardware floor from β85 to β54 dBFS by tier. |
| 20 | Filter mode | 100% | Static 75% / dynamic 25%; NB or WB band limits. |
| 21 | Mastering | 100% | Gain, smart nudge, tanh, brick-wall at Β±0.98. |
</details>
---
## Quick start
```python
from nemo.collections.asr.models import EncDecRNNTBPEModel
model = EncDecRNNTBPEModel.from_pretrained(
model_name="TieIncred/VaaniCall"
)
hypotheses = model.transcribe(["sample.wav"], return_hypotheses=True)
print(hypotheses[0].text)
```
No language flag. 16 kHz mono WAV is the happy path; typical telephony (8 kHz, ΞΌ-law / AMR) is the training domain.
---
## Intended use
- Inbound / outbound **contact-center** transcription in Indic languages
- **VoIP and PSTN** call analytics
- Multilingual IVR and voice-bot post-processing
- Offline batch transcription of call recordings
**Not intended for:** medical or legal dictation, real-time emergency dispatch, or English-only broadcast ASR (use Whisper or a dedicated English model).
---
## Limitations
- **English** trails Whisper large-v3 (expected: this checkpoint is Indic-first).
- **Malayalam, Kannada, Tamil** remain the hardest languages (WER 34β41% on IndicVoices).
- **Odia** slightly regresses vs the VAANI base under telephony (β1.37 pp).
- **IndicConformer** is still stronger as a general Indic ASR.
- Code-mixed utterances and heavy music-on-hold are not separately benchmarked.
- Evaluations are 500 clips / language; treat per-language gaps of <1 pp as noise.
---
## Citation
If you use VaaniCall, please cite this model and VAANI, the base the fine-tune starts from:
```bibtex
@misc{iqbal2026vaanicall,
title={VaaniCall: Multilingual Telephony ASR for Indic Languages},
author={Iqbal, Tausif},
year={2026},
howpublished={Hugging Face},
url={https://huggingface.co/TieIncred/VaaniCall}
}
```
```bibtex
@misc{pulikodan2026vaanicapturinglanguagelandscape,
title={VAANI: Capturing the language landscape for an inclusive digital India},
author={Sujith Pulikodan and Abhayjeet Singh and Agneedh Basu and Nihar Desai and Pavan Kumar J and Pranav D Bhat and Raghu Dharmaraju and Ritika Gupta and Sathvik Udupa and Saurabh Kumar and Sumit Sharma and Vaibhav Vishwakarma and Visruth Sanka and Dinesh Tewari and Harsh Dhand and Amrita Kamat and Sukhwinder Singh and Shikhar Vashishth and Partha Talukdar and Raj Acharya and Prasanta Kumar Ghosh},
year={2026},
eprint={2603.28714},
archivePrefix={arXiv},
primaryClass={eess.AS},
url={https://arxiv.org/abs/2603.28714}
}
```
Also cite [IndicVoices](https://huggingface.co/datasets/ai4bharat/IndicVoices) when reporting numbers on that test set.
---
<p align="center">
<em>VaaniCall Β· Tausif Iqbal Β· Apache 2.0</em>
</p>
|