Instructions to use spark-ux/indic-transcribe-core with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use spark-ux/indic-transcribe-core with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("automatic-speech-recognition", model="spark-ux/indic-transcribe-core", trust_remote_code=True)# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("spark-ux/indic-transcribe-core", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
Indic-Transcribe-core
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.
Why Choose Indic-Transcribe-core?
- 🔀 Code-mixing, natively. Indians rarely speak one language at a time. Indic-Transcribe-core transcribes Hinglish and other mixed speech as it is actually spoken, instead of forcing it into a single language.
- 🌐 Language identification built in. Use the model directly as a language-ID system, or let it auto-detect the language and then transcribe — at the cost of one decoder step, not a second encoder pass.
- 🏥 Domain coverage where it matters. Deep vocabulary in education, agriculture, and healthcare.
- ⚡ Fast. RTFx 911 on a single H100 — one hour of audio in about four seconds.
Supported Languages
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 |
Model Architecture
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 |
Capabilities
| Feature | Indic-Transcribe-core |
|---|---|
| Languages | 25 |
| Code-mixed audio | ✅ |
| Transcription output | Native script |
| Automatic language ID | ✅ |
| Inverse Text Normalization | ❌ |
| Romanized output | ❌ |
| Streaming | ❌ |
Results at a Glance
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.
Voice of India benchmark
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.
Throughput & Efficiency
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.
How to Use this Model
Installation
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.
Conda environment (recommended for reproducibility)
conda create -n indic-transcribe python=3.10 -y
conda activate indic-transcribe
pip install torch torchaudio transformers sentencepiece soundfile
Input audio requirements
| 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
Basic inference
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.
Automatic language ID + transcription
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), ...]}
Language identification only
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.
Input(s)
| 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. |
Output
| 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. |
Software Integration
Runtime Engine: PyTorch + Hugging Face Transformers (model code ships in this repository)
Supported Hardware Microarchitecture Compatibility:
- NVIDIA Ampere
- NVIDIA Hopper
- NVIDIA Lovelace
Supported Operating System(s): Linux
Supported Language Codes
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).
Full list of language codes (25)
| 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 |
Limitations
- Native script only. This model transcribes into the language's own script. It does not produce mixed-script/ITN or romanized output — spoken numbers stay as words, and English words inside Indic speech are rendered in the native script. Apply your own inverse text normalization or transliteration downstream if you need it.
- Single-speaker audio. The model is trained for single-speaker recordings. For multi-speaker scenarios, pair it with a diarization module and transcribe each speaker turn separately.
- Automatic language ID is uneven — do not rely on it for Hindi-belt languages. Accuracy varies widely by language, and Bhojpuri, Maithili and Urdu are absorbed by Hindi far too often to be trusted. Pass
langexplicitly whenever you have it. - Low-resource languages are weaker. Kashmiri, Maithili, Sanskrit, Bodo and Bhili have the least training data and the highest error rates. Check the per-language numbers in Results at a Glance before committing to a language.
- Noise robustness has limits. Heavily overlapped speech, far-field audio, and very low-SNR recordings will still degrade quality.
- Streaming is not available. This model is for batch and request-response transcription.
License / Terms of Use
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.
Use Case
Native-script transcription of multilingual and code-mixed Indian-language audio, plus language identification.
Deployment Geography
Global
Citation
@misc{indictranscribe2026,
title = {Indic-Transcribe: Multilingual Speech Recognition for Indian Languages},
author = {TODO},
year = {2026},
url = {https://huggingface.co/bodhan-ai/indic-transcribe-core}
}
Ethical Considerations
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.
- Downloads last month
- -
Model tree for spark-ux/indic-transcribe-core
Base model
nvidia/canary-1b-v2