/ Модель

Характеристики

Лицензия
Своя лицензия
Базовая модель
canary-1b-v2
Библиотека
nemo
Опубликована
7 авг 2026

indic-transcribe-flex

Распознавание речиАудио → текст9 профессий

Мультиязычная модель Bodhan AI для транскрибации речи на индийских языках и английском с индийским акцентом с выводом в родной письменности, смешанном формате или латинице.

4 388скачиваний за 30 дней34лайкавеса обновлены23 сен 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

Indic-Transcribe-Flex — мультиязычная модель распознавания речи, разработанная Bodhan AI на основе NVIDIA Canary-1B-v2. Она предназначена для транскрибации речи на 27 индийских языках и английском с индийским акцентом, включая смешанную речь вроде Hinglish. Архитектура сочетает акустический энкодер FastConformer и Transformer-декодер; вход — аудио, выход — текст.

Модель поддерживает вывод в родной письменности, смешанный вариант с английскими словами и числами латиницей, а также полную романизацию латиницей. Она может автоматически определять язык речи или работать с заданным языком; среди заявленных сценариев — аудио в шумных условиях и лексика образования, сельского хозяйства и здравоохранения. Для входа указаны монофонические аудиофайлы с частотой 16 кГц; WAV, FLAC и MP3. В README отмечено, что Indic-Transcribe-Core показывает более высокую точность на приведённом бенчмарке.

Модель распространяется по лицензии с идентификатором Hugging Face «other»; конкретные условия лицензии в доступных данных не раскрыты.

Сценарии применения

  • транскрибация речи на индийских языках
  • распознавание смешанной речи, например Hinglish
  • получение романизированной транскрипции для поиска и интерфейсов только с латиницей
  • автоматическое определение языка аудиозаписи
  • распознавание речи в шумных записях колл-центров и общественных мест
  • транскрибация аудио с лексикой образования, сельского хозяйства и здравоохранения

Ограничения

По результатам бенчмарка Voice of India точность уступает Indic-Transcribe-Core. README указывает требования к входному аудио: моно, 16 кГц, форматы WAV, FLAC или MP3.

Для каких профессий подходит9

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Также подходит для

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

Model Arch Params Languages Language License

Multilingual speech recognition for 27 Indian languages with native-script, mixed-script, and romanized output.

Quick links: Blog · Demo · Try it out . Github

Indic-Transcribe-Flex is a multilingual Automatic Speech Recognition (ASR) model built for 27 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-centre floors, with strong coverage in the domains where Indian voice products are actually built: education, agriculture, and healthcare.

Unlike traditional ASR systems that return only a native-script transcript, Indic-Transcribe offers three transcription modes: native script, romanized text, or true code-mixed output so you can match the output to what your product expects.


  • 🔀 Code-mixing, natively. Indians rarely speak one language at a time. Indic-Transcribe transcribes Hinglish and other mixed speech as it is actually spoken, instead of forcing it into a single language.
  • 📝 Three transcription modes. Native script for fully native output; mixed script for native words in native script with English and numerals in Latin; romanized for everything in Latin script.
  • 🏥 Domain coverage where it matters. Deep vocabulary in education, agriculture, and healthcare.
  • 🌐 Language identification built in. Use the model directly as a language-ID system, or let it auto-detect the language and then transcribe.

The model covers 27 languages across four groups:

GroupLanguages
Indian-accented EnglishEnglish benchmarked across speakers from 19 states
22 constitutionally recognised languagesAssamese, Bengali, Bodo, Dogri, Gujarati, Hindi, Kannada, Kashmiri, Konkani, Maithili, Malayalam, Manipuri, Marathi, Nepali, Odia, Punjabi, Sanskrit, Santali, Sindhi, Tamil, Telugu, Urdu
Hindi dialectsChhattisgarhi, Haryanvi
Extremely low-resourceBhili, Bhojpuri

See Supported Language Codes for the code to pass at inference time.

The same utterance, three renderings:

ModeOutput
Native scriptमैंने कल पांच बजे तीन फाइल्स अपलोड कीं
Mixed scriptमैंने कल 5 बजे 3 files upload कीं
Romanizedmaine kal 5 baje 3 files upload kin

Architecture Type: NVIDIA Canary: FastConformer encoder with a Transformer decoder.

Indic-Transcribe-Flex 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 transcription mode and target language.

Model nameIndic-Transcribe-Flex
TaskSpeech-to-Text (Automatic Speech Recognition)
Base modelnvidia/canary-1b-v2
Total parameters1.2B
EncoderFastConformer: 32 layers, 811M params, 1024 hidden dim, 8 attention heads, conv kernel 9
DecoderTransformer: 24 layers, 419M params, 1024 hidden size, 8 attention heads
Vocabulary7,152 tokens (1,152 special / task + 6,000 multilingual)
Sub-word algorithmBPE (byte fallback disabled)
Precisionfp16
Checkpoint size4.6 GB

Results below are from the Voice of India benchmark. ASR performance is measured using Word Error Rate (WER); lower is better. Best score per column is in bold.

ModelAverageAssameseBhojpuriBengaliGujaratiHindiChhattisgarhiKannadaMaithiliMalayalamMarathiOdiaPunjabiTamilTeluguUrdu
Indic-Transcribe-core8.78.213.34.39.23.513.67.411.311.55.78.78.39.011.45.0
Saaras V310.79.117.95.29.73.814.08.814.212.26.511.18.69.113.57.5
Indic-Transcribe-flex11.39.618.55.010.84.113.69.715.113.76.610.29.510.813.15.6
Indic Conformer17.813.130.39.516.36.524.516.316.328.211.613.119.116.220.08.0
Gemini 3 Pro21.123.724.110.318.19.319.620.127.221.014.025.719.315.524.610.6
Gemini 3 Flash23.125.020.211.120.37.121.718.528.030.114.223.323.217.325.511.0
Gemma E4B36.145.027.019.627.39.124.031.036.744.424.444.423.437.941.614.2
OmniASR LLM 7B44.523.926.320.932.09.620.735.044.648.824.572.331.740.648.714.8
OmniASR CTC 7B62.533.339.243.562.520.733.450.051.661.333.690.280.758.362.189.3

Indic-Transcribe Flex offers support for more transcription modes and languages. Do check out Indic-Transcribe Core for better accuracy.


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 create -n indic-transcribe python=3.10 -y
conda activate indic-transcribe
pip install torch torchaudio transformers sentencepiece soundfile
Sample rate16 kHz (resampled automatically if it differs)
ChannelsMono
Formats.wav, .flac, .mp3
SpeakersSingle speaker — see Limitations
# Convert anything to the expected format
ffmpeg -i input.mp3 -ac 1 -ar 16000 -c:a pcm_s16le audio.wav
# Gated model: accept the terms on this page, then run `hf auth login` once (older installs: `huggingface-cli login`).
import sys
from huggingface_hub import snapshot_download

model_dir = snapshot_download("bodhan-ai/Indic-Transcribe-Flex")
sys.path.insert(0, model_dir)          # the model code ships inside the download

from indic_transcribe import IndicTranscribe
asr = IndicTranscribe.from_pretrained(model_dir)
print(asr("audio.wav", lang="hi"))

The same audio, three outputs. Pick the mode that matches what your downstream system expects.

Native script: everything in the language's own script. Recommended for production.

print(asr("audio.wav", lang="hi", mode="native"))
# मैंने कल पांच बजे तीन फाइलें अपलोड कीं

Mixed script (ITN): native words in native script; English words and numerals in Latin. Inverse text normalization turns spoken numbers into digits. Recommended if you want formatted and normalized output.

print(asr("audio.wav", lang="hi", mode="mixed"))
# मैंने कल 5 बजे 3 files upload कीं

Romanized: everything transliterated into Latin script. Useful for search indexing, keyword spotting, and Latin-only UIs.

print(asr("audio.wav", lang="hi", mode="romanized"))
# maine kal 5 baje 3 files upload kin

When you don't know the language ahead of time, omit lang. The model first identifies it, then transcribes at the cost of one decoder step, without requiring 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), ...]}

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: ml/ta 0.98 and kn/bn 0.96, against bho 0.05, hi 0.26, mai 0.36 and ur 0.49, each absorbed by a close neighbour. If you have a language label, pass it.

asr(...) decodes a file in one pass and refuses audio longer than 45 s. That limit is deliberate: the model trains on clips of up to 30 s, and a single pass over long audio collapses into repetition rather than degrading gracefully. For long audio, use the chunked helper that ships with the model. It cuts the audio at natural pauses (or at exactly 30 s when there is none) into pieces of at most 30 s, transcribes each, and joins the text:

from long_form import transcribe_long

print(transcribe_long(asr, "long_audio.wav", lang="hi"))

Omit lang and the language is identified once, from samples across the whole file. Pass it whenever you know it — it is faster and avoids a wrong guess.

Output modes work the same way on long audio — pass mode="mixed" or mode="romanized" to transcribe_long.

How the long-audio path works:

audio (.wav / .flac / .mp3, any sample rate, mono or stereo)
  │  load → mono → 16 kHz
  ▼
lang given? ── no ──► identify it (long files: 3 × 20 s windows across the file)
  │
  ▼
≤ 30 s? ── yes ──► decode in one pass ───────────────────────────┐
  │ no                                                           │
  ▼                                                              │
split at pauses                                                  │
  • pause = ≥ 250 ms at least 25 dB below the file's peak        │
  • cut in the middle of the pause nearest 25 s                  │
  • no pause within 30 s → cut at exactly 30 s                   │
  ▼                                                              │
decode each piece (every piece ≤ 30 s)                           │
  • output looping? → split that piece at a pause, decode again  │
  • still looping?  → collapse the repeated phrase               │
  ▼                                                              │
join the pieces ─────────────────────────────────────────────────┴──► transcript

Pieces are kept as long as possible because every cut costs a little accuracy — the words at a cut are the ones most likely to be wrong — and 30 s is the longest input the model was trained on.

inference.py ships with the model and wraps the same calls. It picks the whole-file or chunked path by duration, and identifies the language when --lang is omitted.

MODEL_DIR=$(python -c 'from huggingface_hub import snapshot_download; print(snapshot_download("bodhan-ai/Indic-Transcribe-Flex"))')

python "$MODEL_DIR/inference.py" audio.wav --lang hi
python "$MODEL_DIR/inference.py" long_call.wav --show-lang      # no --lang: identify it, and print it
python "$MODEL_DIR/inference.py" *.wav --lang ta                # several files
python "$MODEL_DIR/inference.py" audio.wav --lang hi --mode romanized

nemo/ holds the same model as an NVIDIA NeMo checkpoint, for pipelines already built on NeMo. Its config names the tokenizer class the model was trained with, which is not part of a stock NeMo install, so load_nemo registers the copy that ships beside it before restoring:

import sys
from huggingface_hub import snapshot_download

model_dir = snapshot_download("bodhan-ai/indic-transcribe-flex")
sys.path.insert(0, f"{model_dir}/nemo")      # the loader ships inside the download

from load_nemo import load_nemo_model
model = load_nemo_model(model_dir)
print(model.transcribe(["audio.wav"], source_lang="hi", target_lang="hi", pnc="yes")[0].text)

Nothing inside NeMo is modified, and the loader finds the checkpoint next to itself. If you would rather not add anything to sys.path, copy nemo/canary_multilingual_tokenizer.py into your NeMo install beside canary_tokenizer.py and restore_from the .nemo directly.

Give it a language. Pass any of the codes in Full list of language codes below as both source_lang and target_lang:

as  bho  bn  brx  doi  en  gu  hi  kn  kok  ks  mai  ml  mni
mr  ne  or  pa  sa  sat  sd  ta  te  ur

The checkpoint keeps one shared sub-tokenizer for all of them, and the class above routes every code to it. Without it, stock NeMo raises RuntimeError: Unsupported language: 'ml'.

The NeMo path writes each language in its native script. The mixed and romanized modes are available through the Hugging Face model above (mode="mixed" / mode="romanized").

pip install "nemo_toolkit[asr]"

MODEL_DIR=$(python -c 'from huggingface_hub import snapshot_download; print(snapshot_download("bodhan-ai/indic-transcribe-flex"))')

python "$MODEL_DIR/nemo/test_nemo.py" audio.wav hi          # check the install
python "$MODEL_DIR/nemo/inference_nemo.py" audio.wav --lang hi
python "$MODEL_DIR/nemo/inference_nemo.py" long_call.wav --lang ta   # chunked automatically
python "$MODEL_DIR/nemo/inference_nemo.py" *.wav --lang bn --batch-size 8

Audio over 30 s is cut at natural pauses into pieces of at most 30 s and decoded piece by piece -- the same splitter, cap and repetition guard the Hugging Face model uses, so both paths cut audio identically. inference_nemo.py does it automatically; in code:

from long_form_nemo import transcribe_long_nemo

print(transcribe_long_nemo(model, "long_audio.wav", lang="hi", batch_size=8))

Batching the pieces makes this path the faster one for long audio: a 10-minute file takes 8 s at batch_size=8 against 24 s at 1, and an hour of audio runs in 48 s (77x realtime, 9.2 GiB of GPU memory). Pass lang -- this path has no language identification of its own, and a wrong language gives you the wrong script rather than an error.


FieldDetails
Input Type(s)Audio, Language ID
Input Format(s).wav, .flac, .mp3; string language code
Input ParametersOne-dimensional (1D) audio; one-dimensional (1D) language ID
Other Properties16 kHz mono; audio is resampled automatically if it differs. Single speaker.

FieldDetails
Output Type(s)Text string in the input language
Output Format(s)String
Output ParametersOne-dimensional (1D)
Other PropertiesSelectable native-script, mixed-script, or romanized rendering; optional detected-language tag.

Pass these to source_lang. Use "auto" for automatic language identification.

ExampleValue
Hindisource_lang="hi"
Tamilsource_lang="ta"
Bengalisource_lang="bn"
Indian Englishsource_lang="en"
Auto-detectsource_lang="auto"

All 27 languages use standard ISO 639-1 / 639-3 codes (also listed in the language: field at the top of this card).

LanguageCodeScriptGroup
English (Indian)enLatinIndian-accented English
AssameseasBengali–AssameseScheduled
BengalibnBengaliScheduled
BodobrxDevanagariScheduled
DogridoiDevanagariScheduled
GujaratiguGujaratiScheduled
HindihiDevanagariScheduled
KannadaknKannadaScheduled
KashmiriksPerso-Arabic / DevanagariScheduled
KonkanikokDevanagariScheduled
MaithilimaiDevanagariScheduled
MalayalammlMalayalamScheduled
ManipurimniBengali / Meetei MayekScheduled
MarathimrDevanagariScheduled
NepalineDevanagariScheduled
OdiaorOdiaScheduled
PunjabipaGurmukhiScheduled
SanskritsaDevanagariScheduled
SantalisatOl ChikiScheduled
SindhisdPerso-Arabic / DevanagariScheduled
TamiltaTamilScheduled
TeluguteTeluguScheduled
UrduurPerso-ArabicScheduled
BhojpuribhoDevanagariHindi dialect
ChhattisgarhihneDevanagariHindi dialect
HaryanvibgcDevanagariHindi dialect
BhilibhbDevanagariLow resource

  • 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.
  • Mixed-script (ITN) mode can be wrong. Inverse text normalization is genuinely ambiguous in places, so mixed-script mode will occasionally get it wrong. For production, native-script mode is recommended, applying your own ITN downstream if you need it.
  • Romanization is not standardized. There is no single canonical romanization for most Indian languages. Romanized output follows the model's learned convention, which may not match your existing transliteration scheme.
  • Streaming is not available in pro. Use Indic-Transcribe-lite for real-time use.
  • Low-resource languages are weaker. Bhili in particular has very little training data. 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.

Released under Indic Open Model License v1.0.

The base model, nvidia/canary-1b-v2, carries its own license terms — ensure your use complies with both.


If you find the license difficult to understand, here is a plain-language guide to the Indic Open Model License.

Broad, no-cost access for research, government, nonprofit, and commercial use — with a few conditions attached.

This deed is a human-readable summary of the license, not a substitute for it. Where the two disagree, the full Indic Open Model License governs.


You're free to

No cost, no royalty, worldwide — for research, government, nonprofit, and commercial use, at any scale.

  • ✅ Run it — for inference, in a product, in research, however you like.
  • ✅ Change it — fine-tune, distill, quantize, merge, or otherwise build on it.
  • ✅ Self-host it — power your own product or service with it, commercial or not.
  • ✅ Share it — pass on copies of the model or your own version of it.

As long as you

Five conditions cover almost everything. The rest of the license is these, spelled out in legal detail.

1. Give credit

Wherever you ship the model or a derivative to anyone else, say where it came from — and don't strip out existing notices.

"Built with [Model Name] from Bodhan AI / AI4Bharat."

2. Pass it on the same way

If you give your fine-tuned or derived version to anyone else — hand it over, or run it as a service for them — it carries this exact license. You can't relicense it on different terms.

3. Ask before hosting it for others

Self-hosting is free. But if you're going to run it as an API or hosted service that other people or companies call directly, that needs Bodhan AI's written sign-off first — unless you're a nonprofit, government, or academic user, or you publicly release an equally capable open version within 90 days.

4. Don't use it to cause harm

No exceptions — not even for nonprofit or research use. That means no:

  • child sexual abuse material, or content that sexualizes minors
  • weapons development, including chemical, biological, radiological, or nuclear
  • mass surveillance or social-scoring systems
  • disinformation campaigns, including election manipulation
  • automated decisions that affect someone's legal rights without human oversight
  • deepfakes or voice clones of real people without their consent
  • robocalls, auto-dialers, or voice-phishing scams
  • AI companion products designed to simulate romance or foster emotional dependency

5. Talk to us if your product gets huge

If your product, built for your own use rather than hosting for others, crosses either threshold, you will need a separate commercial license. This does not apply to nonprofit, government, or academic users.

Threshold
500M+monthly active users
or
$250M+annual revenue

Good to know

  • No warranty. The model is provided as-is. It isn't tested or certified for safety-critical use — medical, aviation, nuclear, or similar so test thoroughly before relying on it in high-stakes settings.
  • You handle your own compliance. Export controls, sanctions, and data-protection law (including India's DPDP Act, where it applies) are on you, not Bodhan AI.
  • This deed doesn't replace the license. It leaves out most of the legal detail — termination, dispute resolution, confidentiality, and more all live in the full text. Read that before you rely on anything here.

Transcription of multilingual and code-mixed Indian-language audio, including native-script, mixed-script, and romanized output, plus language identification.


Global


@misc{indictranscribe2026,
  title  = {Indic-Transcribe: Built for the way India actually speaks},
  author = {Bodhan AI, AI4Bharat},
  year   = {2026},
  url    = {https://bodhan.ai/research/blogs/indic-transcribe}
}

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.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · nemo

Нельзя запустить

Доступ к модели ограничен автором; у платформы нет доступа к весам.

Ревизия весов
ecba9ba

0 моделей