Downloads · 30 days
79
61% of all-time downloads
spark-ux/indic-transcribe-core
indic-transcribe-core is a automatic speech recognition model from spark-ux. Use it when you need speech turned into text. It is set up for transformers. The card lists the license as other.
<h1 id="indic-transcribe-core" style="color:FFD21E;"Indic-Transcribe-core</h1
Downloads · 30 days
79
61% of all-time downloads
All-time downloads
129
Public
Parameters
1.2B
4.9 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors4.9 GB · 100%
From the Hugging Face model README
Multilingual speech recognition for 25 Indian languages, in each language's native script.
Indic-Transcribe-core is a multilingual Automatic Speech Recognition (ASR) model built for 25 Indian languages. It is trained to be robust and general purpose: it handles the full diversity of Indian accents and holds up in noisy real-world conditions, from crowded markets to call-center floors, with strong coverage in the domains where Indian voice products are actually built — education, agriculture, and healthcare.
The model transcribes into the native script of the language being spoken, and can identify the language on its own when you don't know it in advance.
This model is ready for commercial use.
The model covers 25 languages across four groups:
| Group | Languages |
|---|---|
| Indian-accented English | English |
| 22 constitutionally recognised languages | Assamese, Bengali, Bodo, Dogri, Gujarati, Hindi, Kannada, Kashmiri, Konkani, Maithili, Malayalam, Manipuri, Marathi, Nepali, Odia, Punjabi, Sanskrit, Santali, Sindhi, Tamil, Telugu, Urdu |
| Hindi dialect | Bhojpuri |
| Low resource | Bhili |
Architecture Type: NVIDIA Canary — FastConformer encoder with a Transformer decoder.
Indic-Transcribe-core is built on the nvidia/canary-1b-v2 architecture. The FastConformer encoder produces acoustic representations that the Transformer decoder converts into text, with task tokens selecting the target language.
| Model name | Indic-Transcribe-core |
| Task | Speech-to-Text (Automatic Speech Recognition) |
| Base model | nvidia/canary-1b-v2 |
| Total parameters | 1.2B |
| Encoder | FastConformer — 32 layers, 811M params, 1024 hidden dim, 8 attention heads, conv kernel 9 |
| Decoder | Transformer — 24 layers, 419M params, 1024 hidden size, 8 attention heads |
| Vocabulary | 7,152 tokens (1,152 special / task + 6,000 multilingual) |
| Sub-word algorithm | BPE (byte fallback disabled) |
| Precision | fp32 on disk, bf16 at inference |
| Checkpoint size | 4.6 GB |
| Feature | Indic-Transcribe-core |
|---|---|
| Languages | 25 |
| Code-mixed audio | ✅ |
| Transcription output | Native script |
| Automatic language ID | ✅ |
| Inverse Text Normalization | ❌ |
| Romanized output | ❌ |
| Streaming | ❌ |
Accuracy is reported as OIWER — an orthographically-informed word error rate that accepts documented spelling and transliteration variants as correct, scored against multi-reference transcripts. Lower is better.
<h3 style="color:#FFD21E;">Voice of India benchmark</h3>283,668 clips across 14 languages.
| Language | Assamese | Bengali | Bhojpuri | Gujarati | Hindi | Kannada | Maithili | Malayalam | Marathi | Odia | Punjabi | Tamil | Telugu | Urdu |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OIWER | 8.32 | 4.34 | 13.66 | 9.28 | 3.51 | 7.64 | 11.81 | 11.96 | 5.74 | 8.90 | 8.36 | 9.20 | 11.61 | 5.06 |
Average OIWER across the 14 languages: 8.53.
Measured on a single NVIDIA H100, bf16, batched inference over 3,000 clips (3.11 hours of audio).
| Metric | Indic-Transcribe-core |
|---|---|
| RTFx | 911 |
| Throughput | 244 utterances/s |
| Latency (batch size 1) | 286 ms median, 398 ms p90 |
| Checkpoint size | 4.6 GB |
RTFx is the inverse real-time factor: RTFx 911 means one hour of audio is transcribed in about 4 seconds.
pip install torch torchaudio transformers sentencepiece soundfile
The model code ships inside this repository, so there is nothing else to install — no NeMo, no other toolkit.
<details> <summary>Conda environment (recommended for reproducibility)</summary>conda create -n indic-transcribe python=3.10 -y
conda activate indic-transcribe
pip install torch torchaudio transformers sentencepiece soundfile
</details>
<h3 style="color:#FFD21E;">Input audio requirements</h3>
| Sample rate | 16 kHz (resampled automatically if it differs) |
| Channels | Mono |
| Formats | .wav, .flac, .mp3 |
| Speakers | Single speaker — see Limitations |
# Convert anything to the expected format
ffmpeg -i input.mp3 -ac 1 -ar 16000 -c:a pcm_s16le audio.wav
<h3 style="color:#FFD21E;">Basic inference</h3>
from huggingface_hub import snapshot_download
from indic_transcribe import IndicTranscribe
asr = IndicTranscribe.from_pretrained(snapshot_download("bodhan-ai/indic-transcribe-core"))
print(asr("audio.wav", lang="hi"))
# मैंने कल पांच बजे तीन फाइलें अपलोड कीं
Output is always in the native script of the language being transcribed.
<h3 style="color:#FFD21E;">Automatic language ID + transcription</h3>When you don't know the language ahead of time, omit lang. The model identifies it first,
then transcribes — at the cost of one decoder step, not a second encoder pass.
text, lid = asr.transcribe("unknown_language.wav", return_lid=True)
print(lid["lang"]) # e.g. "ta"
print(text)
A language you supply always wins; identification only fills a gap. return_lid=True also
works when you did supply one, so a disagreement between your metadata and the model stays
visible instead of silent:
text, lid = asr.transcribe("audio.wav", lang="hi", return_lid=True)
# lid == {"lang": "hi", "source": "explicit", "topk": [("hi", 0.9999), ("ur", 0.0001), ...]}
<h3 style="color:#FFD21E;">Language identification only</h3>
To use the model purely as a language-ID system, read the predicted language and discard the transcript.
for path in ["a.wav", "b.wav", "c.wav"]:
print(path, asr.identify(path))
# [('ta', 0.9812), ('ml', 0.0104), ('kn', 0.0031), ...]
identify returns the ranked distribution rather than a single string, because for the
confusable pairs the top-1 alone hides how close the decision was. Accuracy is uneven across
languages — the Hindi-belt languages in particular are often absorbed by Hindi. If you have a
language label, pass it.
You can narrow the candidate set when you know your traffic:
from indic_transcribe import RECOMMENDED_LANGS
asr.identify("audio.wav", allowed_langs=RECOMMENDED_LANGS)
This is a hard filter — audio in an excluded language is silently reassigned to the nearest permitted one rather than flagged.
| Field | Details |
|---|---|
| Input Type(s) | Audio, Language ID |
| Input Format(s) | .wav, .flac, .mp3; string language code |
| Input Parameters | One-dimensional (1D) audio; one-dimensional (1D) language ID |
| Other Properties | 16 kHz mono; audio is resampled automatically if it differs. Single speaker. |
| Field | Details |
|---|---|
| Output Type(s) | Text string in the input language |
| Output Format(s) | String |
| Output Parameters | One-dimensional (1D) |
| Other Properties | Native-script rendering; optional detected-language tag. |
Runtime Engine: PyTorch + Hugging Face Transformers (model code ships in this repository)
Supported Hardware Microarchitecture Compatibility:
Supported Operating System(s): Linux
Pass these to lang. Omit lang for automatic language identification.
| Example | Value |
|---|---|
| Hindi | lang="hi" |
| Tamil | lang="ta" |
| Bengali | lang="bn" |
| Indian English | lang="en" |
| Auto-detect | omit lang |
All 25 languages use standard ISO 639-1 / 639-3 codes (also listed in the language: field at the top of this card).
| Language | Code | Script | Group |
|---|---|---|---|
| English (Indian) | en | Latin | Indian-accented English |
| Assamese | as | Bengali–Assamese | Scheduled |
| Bengali | bn | Bengali | Scheduled |
| Bodo | brx | Devanagari | Scheduled |
| Dogri | doi | Devanagari | Scheduled |
| Gujarati | gu | Gujarati | Scheduled |
| Hindi | hi | Devanagari | Scheduled |
| Kannada | kn | Kannada | Scheduled |
| Kashmiri | ks | Perso-Arabic / Devanagari | Scheduled |
| Konkani | kok | Devanagari | Scheduled |
| Maithili | mai | Devanagari | Scheduled |
| Malayalam | ml | Malayalam | Scheduled |
| Manipuri | mni | Bengali / Meetei Mayek | Scheduled |
| Marathi | mr | Devanagari | Scheduled |
| Nepali | ne | Devanagari | Scheduled |
| Odia | or | Odia | Scheduled |
| Punjabi | pa | Gurmukhi | Scheduled |
| Sanskrit | sa | Devanagari | Scheduled |
| Santali | sat | Ol Chiki | Scheduled |
| Sindhi | sd | Perso-Arabic / Devanagari | Scheduled |
| Tamil | ta | Tamil | Scheduled |
| Telugu | te | Telugu | Scheduled |
| Urdu | ur | Perso-Arabic | Scheduled |
| Bhojpuri | bho | Devanagari | Hindi dialect |
| Bhili | bhb | Devanagari | Low resource |
lang explicitly whenever you have it.Released under BODHAN AI OPEN MODEL LICENSE 1.0.
The base model, nvidia/canary-1b-v2, carries its own license terms — ensure your use complies with both.
Native-script transcription of multilingual and code-mixed Indian-language audio, plus language identification.
Global
@misc{indictranscribe2026,
title = {Indic-Transcribe: Multilingual Speech Recognition for Indian Languages},
author = {TODO},
year = {2026},
url = {https://huggingface.co/bodhan-ai/indic-transcribe-core}
}
The integration of foundation and fine-tuned models into AI systems requires additional testing using use-case-specific data to ensure safe and effective deployment. Developers should work with their team to ensure this model meets requirements for the relevant industry and use case, and addresses unforeseen product misuse.