---
extra_gated_prompt: "Please provide your details and agree to the [LICENSE](https://github.com/Bodhan-AI/bodhan-model-info/blob/main/licenses/indic-open-model-license/v1/Indic_Open_Model_License.md) [[simpler version](https://github.com/Bodhan-AI/bodhan-model-info/blob/main/licenses/indic-open-model-license/v1/Indic_Open_Model_License_Deed.md)] to request access."
extra_gated_fields:
Company / Organization: text
Country: country
Intended Use Case:
type: select
options:
- Research
- Commercial
- Education
- label: Other
value: other
I agree to the license terms: checkbox
base_model: meta-llama/Llama-3.2-3B
language:
- en
- hi
- bn
- mr
- te
- ta
- gu
- kn
- ml
- or
- pa
- as
- ur
- brx
- doi
- kok
- ks
- mai
- ne
- mni
- sa
- sat
- sd
library_name: transformers
pipeline_tag: text-to-speech
tags:
- text-to-speech
- tts
- speech
- audio
- indic
- multilingual
- code-switching
- code-mixing
- stem
- education
- indic-speak
metrics:
- wer
- cer
- mos
license: other
---
[](#what-is-indic-speak)
[](#languages-supported)
[](#languages-supported)
[](#quality--performance)
[](#license--terms-of-use)
**Natural-sounding text-to-speech for 22 Indian languages and English — built for the classroom first.**
---
What is Indic-Speak?
Indic-Speak turns written text into natural-sounding speech across 22 Indian languages and English. It is a general-purpose voice engine — you can use it for an app, a helpline, an audiobook, or anything else that needs to talk. But it was built with one audience in mind first: students.
Most of the effort went into two problems that matter enormously in Indian education and that almost every other voice system handles badly — reading STEM content correctly, and reading sentences that mix an Indian language with English. The result is a voice that sounds like a teacher explaining something, rather than a machine reading a list. That difference is subtle in a single sentence and very obvious across a ten-minute lesson.
---
Key Features
Built for students first
- **STEM content that is actually correct.** Equations, units, fractions, exponents, and chemical formulae are read the way a teacher reads them in a classroom.
- **Code-mixed speech, read naturally.** Indian teaching is rarely in one language; Indic-Speak reads mixed sentences in one continuous voice.
- **Paced for comprehension.** The default delivery is explanatory and unhurried rather than brisk and announcement-like.
Capabilities and use cases
Indic-Speak provides several voices per production language, spanning gender, age, and region. English terms, acronyms, and numerals sitting inside an Indic sentence are read in the surrounding voice and accent. Beyond education, the engine serves:
- **Audiobooks and long-form narration.** Quality and pacing stay consistent across chapter-length material.
- **Apps and product voice.** Notifications, walkthroughs, and in-app guidance.
- **Conversational agents and helplines.** Fast response times for back-and-forth conversation.
- **Accessibility.** Screen reading for users who cannot or prefer not to read.
Voices and data integrity
- **Professionally recorded voices.** Every voice comes from a contracted voice artist who consented to its use.
- **Curriculum-aligned content.** Training material spans mathematics, science, and technical explanation.
---
| Measure | What it tells you | Result |
| --- | --- | --- |
| Intelligibility (WER / CER) | How reliably a listener can make out every word | 26.49 / 17.86 |
| Voice consistency | Whether the voice stays the same across a long passage | 96.47 ± 1.64 |
| Overall quality (NORESQA MOS) | A standard automated quality score | 4.46 ± 0.26 |
| Response time | Delay before audio starts | ~200 ms |
> For WER / CER, lower is better. For voice consistency and MOS, higher is better.
---
Languages Supported
| Tier | Languages |
| --- | --- |
| **Production (13)** | English, Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Kannada, Malayalam, Odia, Punjabi, Assamese, Urdu |
| **Preview (10)** | Bodo, Dogri, Konkani, Kashmiri, Maithili, Nepali, Manipuri, Sanskrit, Santali, Sindhi |
Language codes
| Language | Code | Tier |
| --- | --- | --- |
| English | `en` | Production |
| Hindi | `hi` | Production |
| Bengali | `bn` | Production |
| Marathi | `mr` | Production |
| Telugu | `te` | Production |
| Tamil | `ta` | Production |
| Gujarati | `gu` | Production |
| Kannada | `kn` | Production |
| Malayalam | `ml` | Production |
| Odia | `or` | Production |
| Punjabi | `pa` | Production |
| Assamese | `as` | Production |
| Urdu | `ur` | Production |
| Bodo | `brx` | Preview |
| Dogri | `doi` | Preview |
| Konkani | `kok` | Preview |
| Kashmiri | `ks` | Preview |
| Maithili | `mai` | Preview |
| Nepali | `ne` | Preview |
| Manipuri | `mni` | Preview |
| Sanskrit | `sa` | Preview |
| Santali | `sat` | Preview |
| Sindhi | `sd` | Preview |
---
How to Use
```
pip install "transformers>=5" torch snac soundfile
```
In a script
```python
from inference import TTS
tts = TTS("bodhan-ai/indic-speak-preview-v2") # or a local dir; loads once
wav = tts("प्रकाश की चाल लगभग तीन लाख किलोमीटर प्रति सेकंड होती है।", speaker="Amit")
tts.save("output.wav", wav) # float32 numpy @ 24 kHz
```
```python
wav = tts(text, speaker="Amit", style="ANGER",
temperature=0.6, top_p=0.9, top_k=50,
max_new_tokens=2520, seed=None, stock=False)
```
From the command line
```
python inference.py --text "..." --speaker Amit --style ANGER
```
Voices
`speaker` must be a name the model saw in training — an unseen name does not error, it just
gives an averaged, worse voice.
All 95 voices by language
| Language | Code | N | Speakers |
|---|---|---|---|
| Assamese | `as` | 2 | `Ankur`, `Prastuti` |
| Bengali | `bn` | 2 | `Ishita`, `Sourav` |
| Bhili | `bhb` | 7 | `Bhima`, `Dhulji`, `Govind`, `Jhamku`, `Kanku`, `Sarju`, `Tantya` |
| Bodo | `brx` | 2 | `Gwrbw`, `Sansuma` |
| Dogri | `doi` | 2 | `Preeti`, `Sham` |
| English | `en` | 44 | `Adarsh`, `Akash`, `Amit`, `Anagha`, `Anitha`, `Anjali`, `Ankur`, `Arun`, `Aryaman`, `Bharati`, `Chaoba`, `Chinmay`, `Deepika`, `Dhara`, `Gwrbw`, `Ishfaq`, `Ishita`, `Itishree`, `Kaur`, `Kavya`, `Kiran`, `Lakshmi`, `Madhukar`, `Manpreet`, `Moomal`, `Parth`, `Phulmani`, `Prastuti`, `Preeti`, `Rano`, `Saba`, `Sagar`, `Sandeep`, `Sansuma`, `Sham`, `Sibu`, `Sourav`, `Sravani`, `Srijana`, `Thoibi`, `Vaidehi`, `Vamsi`, `Zaid`, `Zoon` |
| Gujarati | `gu` | 2 | `Dhara`, `Parth` |
| Hindi | `hi` | 2 | `Amit`, `Kavya` |
| Kannada | `kn` | 2 | `Adarsh`, `Deepika` |
| Kashmiri | `ks` | 2 | `Ishfaq`, `Zoon` |
| Konkani | `kok` | 2 | `Anjali`, `Sandeep` |
| Maithili | `mai` | 2 | `Madhukar`, `Vaidehi` |
| Malayalam | `ml` | 2 | `Kiran`, `Lakshmi` |
| Manipuri | `mni` | 2 | `Chaoba`, `Thoibi` |
| Marathi | `mr` | 2 | `Anagha`, `Chinmay` |
| Nepali | `ne` | 2 | `Sagar`, `Srijana` |
| Odia | `or` | 2 | `Akash`, `Itishree` |
| Punjabi | `pa` | 2 | `Kaur`, `Manpreet` |
| Sanskrit | `sa` | 2 | `Aryaman`, `Bharati` |
| Santali | `sat` | 2 | `Phulmani`, `Sibu` |
| Sindhi | `sd` | 2 | `Moomal`, `Rano` |
| Tamil | `ta` | 2 | `Anitha`, `Arun` |
| Telugu | `te` | 2 | `Sravani`, `Vamsi` |
| Urdu | `ur` | 2 | `Saba`, `Zaid` |
Most languages have one male and one female voice. The English list is largely the same
artists recording English, so a name like `Amit` or `Kavya` serves both its own language
and English — which is what makes code-mixed text work.
Technical details — pipeline, prompt format, files
```
text -> prompt -> LM -> SNAC codes -> quantizer.from_codes -> z_q [B,768,L] -> Vocos -> 24 kHz
```
A Llama-3.2-3B speech LM emits SNAC audio codes; a fine-tuned Vocos decoder converts them to
waveform. SNAC is pulled from `hubertsiuzdak/snac_24khz`, but only its **quantizer**
(0.56 MB of 79 MB) is used — Vocos replaces SNAC's decoder entirely, and SNAC's encoder is unused.
Prompt (both metadata blocks optional):
```
<|start_of_human|><|begin_of_text|><|speaker>Amit\n<|style>ANGER