Indic Tiny TTS: Marathi
A tiny Marathi text-to-speech model: 22.5 million parameters, a female and a male voice, reads Devanagari script. On FLORES-200 news sentences it makes fewer recognition errors (1.8 % CER) than 4 other open Marathi models tested. It runs 38× faster than real time on one Apple M1 CPU thread and 7× on one x86 CPU thread, with PyTorch or ONNX Runtime; no GPU needed.
Part of the INDIC TINY TTS MODELS collection: 12 tiny open models, one per language, for 11 Indian languages and Indian English, with the datasets they were trained on.
Training data: sulabhkatiyar/indic-tts-mini-24k: the Marathi female voice (AI4Bharat Rasa, derived from the full-resolution sulabhkatiyar/indic-tts-multilingual-prepared) and the Marathi male voice (LIMMITS / SYSPIN corpus), 24 kHz.
Other open Marathi models, same test
FLORES-200 news sentences (100)
Fewer recognition errors than these 4 open Marathi models; the same as 3 larger models.
| Model | Size | CER, % | Extra errors vs this model, points (95 % CI) | Result |
|---|---|---|---|---|
| This model | 22.5 M | 1.79 | ||
ai4bharat/IndicF5 |
350.6 M | 1.40 | -0.39 [-0.65, -0.15] | theirs better |
github.com/AI4Bharat/Indic-TTS (mr.zip) |
65.6 M | 1.54 | -0.26 [-0.61, +0.08] | same |
ai4bharat/vits_rasa_13 |
31.3 M | 1.99 | +0.20 [-0.14, +0.55] | same |
ai4bharat/indic-parler-tts |
937.8 M | 2.37 | +0.58 [-0.37, +2.13] | same |
SYSPIN/vits_Marathi_Female + SYSPIN/vits_Marathi_Male |
29.1 M | 2.48 | +0.68 [+0.28, +1.11] | ours better |
rhasspy/piper-voices (mr_IN-google-medium) |
19.2 M | 3.44 | +1.64 [+1.14, +2.17] | ours better |
facebook/mms-tts-mar |
29.1 M | 5.41 | +3.62 [+2.87, +4.48] | ours better |
multilingual-tts/VITS-OpenBible-Marathi |
29.1 M | 9.37 | +7.58 [+6.38, +8.91] | ours better |
Held-out test sentences (300)
Fewer recognition errors than these 3 open Marathi models.
| Model | Size | CER, % | Extra errors vs this model, points (95 % CI) | Result |
|---|---|---|---|---|
| This model | 22.5 M | 4.04 | ||
github.com/AI4Bharat/Indic-TTS (mr.zip) |
65.6 M | 6.94 | +2.90 [+1.35, +4.80] | ours better |
rhasspy/piper-voices (mr_IN-google-medium) |
19.2 M | 8.45 | +4.41 [+3.29, +5.67] | ours better |
facebook/mms-tts-mar |
29.1 M | 12.81 | +8.78 [+7.04, +10.63] | ours better |
| Also trained on same speaker voices: | ||||
ai4bharat/vits_rasa_13 |
31.3 M | 3.83 | -0.21 [-1.24, +0.76] | same |
SYSPIN/vits_Marathi_Female + SYSPIN/vits_Marathi_Male |
29.1 M | 6.28 | +2.25 [+1.18, +3.42] | ours better |
Larger models, same held-out sentences
- Same error rate as
ai4bharat/indic-parler-ttsat 1/42 the size, ~113× faster on T4 - Same error rate as
ai4bharat/IndicF5at 1/16 the size, ~150× faster on T4
| Model | Size | Sentences | CER, % | This model, same sentences, % | Extra errors vs this model, points (95 % CI) | Result |
|---|---|---|---|---|---|---|
| Also trained on same speaker voices: | ||||||
ai4bharat/IndicF5 |
350.6 M | 40 | 2.70 | 5.01 | -2.31 [-6.35, +1.32] | same |
ai4bharat/indic-parler-tts |
937.8 M | 40 | 6.00 | 5.01 | +0.99 [-3.50, +5.51] | same |
CER = character error rate, lower is better; size = parameters. Method: see the Appendix.
Speed
| Hardware | Setting | Faster than real time | Real-time factor |
|---|---|---|---|
| x86 CPU (Kaggle notebook, Intel Xeon @ 2.20GHz, 4 vCPU) | PyTorch, 1 thread | 7× | 0.136 |
| Apple M1 laptop, CPU | PyTorch, 1 thread | 38× | 0.026 |
| NVIDIA T4 GPU | PyTorch | 62× | 0.016 |
Real-time factor = total synthesis time ÷ total audio length over 30 held-out sentences (lower is faster).
Listen
Clips made by this model for sentences from the held-out evaluation set; never used in training.
Female voice (voice="female")
कोरडे नेसून पुन्हा आम्ही गाडीत बसलो. गाडी घरी आली, तो बारा वाजावयास आले होते
Transliteration: Korade nesun punha amhi gadit basalo. Gadi ghari ali, to bara vajavayas ale hote
Translation (approx.): We put on dry clothes and got back into the cart. By the time the cart reached home, it was nearly twelve o'clock.
एक जून रोजी बाल संरक्षण दिन साजरा केला जातो.
Transliteration: Ek jun roji bal sanrakshan din sajara kela jato.
Translation (approx.): Child Protection Day is celebrated on 1 June.
शिवाय तिकडे घरी तरी कोण आहे. पुष्कळ वर्षांनी दोघी भेटलो, हेच पुष्कळ झाले
Transliteration: Shivay tikade ghari tari kon ahe. Pushkal varshanni doghi bhetalo, hech pushkal jhale
Translation (approx.): Besides, who is there at home anyway? We two met after many years; that itself is plenty.
हॅलो! वैष्णोदेवी श्राईन बोर्ड ग्राहक सेवेतून बोलताय का?
Transliteration: Helo! Vaishnodevi shrain bord grahak sevetun bolatay ka?
Translation (approx.): Hello! Is this Vaishno Devi Shrine Board customer service?
Male voice (voice="male")
ज्याचे मन, मेंदू व मनगट बळकट असेल,तेच राष्ट्राच्या विकासाचा आधार होऊ शकतील
Transliteration: Jyache man, mendu va managat balakat asel, tech rashtrachya vikasacha adhar hou shakatil
Translation (approx.): Only those whose mind, brain and wrist are strong can become the foundation of the nation's progress.
त्यात आत मटार दाणे आणि कणसाचे दाणे घातल्यामुळे कटलेट्स खाताना ते दाताखाली येतात आणि चव वाढते
Transliteration: Tyat at matar dane ani kanasache dane ghatalyamule katalets khatana te datakhali yetat ani chav vadhate
Translation (approx.): Because green peas and corn kernels are added inside, you bite on them while eating the cutlets, and it adds to the taste.
यासंदर्भात विविध बोर्डांच्या शाळांच्या संस्था प्रमुखांशी चर्चा करण्यात आल्यानंतर संबंधित शाळांनी मराठी विषय शिकवण्यास होकार दिला आहे
Transliteration: Yasandarbhat vividh bordanchya shalanchya sanstha pramukhanshi charcha karanyat alyanantar sambandhit shalanni marathi vishay shikavanyas hokar dila ahe
Translation (approx.): After discussions in this regard with the heads of schools of various boards, the schools concerned have agreed to teach Marathi as a subject.
या ख्रिसमसला तुमच्या सांताक्लॉजला त्याचे सुंदर सुंदर गिफ्ट्स घेऊन थेट कलकत्ताच गाठायला सांगा.
Transliteration: Ya khrisamasala tumachya santaklojala tyache sundar sundar giphts gheun thet kalakattach gathayala sanga.
Translation (approx.): This Christmas, tell your Santa Claus to bring his lovely gifts and head straight to Calcutta.
If the players do not show, the files are in samples/.
Quick start
pip install torch numpy safetensors huggingface_hub
import sys
from huggingface_hub import snapshot_download
sys.path.insert(0, snapshot_download("sulabhkatiyar/indic-tiny-tts-marathi", ignore_patterns=["onnx/*"])) # model + its small Python package
from indic_tiny_tts import TinyTTS
tts = TinyTTS.from_pretrained("sulabhkatiyar/indic-tiny-tts-marathi") # uses the NVIDIA GPU if there is one, else the CPU
wav = tts.synthesize("नमस्कार! आज हवामान खूप छान आहे.", voice="female")
tts.save_wav(wav, "hello.wav")
wav is a NumPy array of 24 kHz audio. voice is "female" or "male". Optional: speed=1.2 speaks faster, and seed=0 gives the same output every time.
Choose where it runs
tts = TinyTTS.from_pretrained("sulabhkatiyar/indic-tiny-tts-marathi", device="cpu") # any computer
tts = TinyTTS.from_pretrained("sulabhkatiyar/indic-tiny-tts-marathi", device="cuda") # NVIDIA GPU
tts = TinyTTS.from_pretrained("sulabhkatiyar/indic-tiny-tts-marathi", device="cpu", threads=1) # Mac with Apple silicon (fastest there)
On a Mac, device="mps" (the Apple GPU) also works, but for a model this small the CPU with one thread is faster.
Without PyTorch (ONNX Runtime)
The onnx/ folder holds the same model as three ONNX graphs. This path needs only NumPy and ONNX Runtime:
pip install onnxruntime numpy huggingface_hub
import sys
from huggingface_hub import snapshot_download
folder = snapshot_download("sulabhkatiyar/indic-tiny-tts-marathi", ignore_patterns=["*.safetensors"])
sys.path.insert(0, folder)
from indic_tiny_tts import TinyTTSOnnx
tts = TinyTTSOnnx.from_pretrained(folder)
wav = tts.synthesize("नमस्कार! आज हवामान खूप छान आहे.", voice="male")
tts.save_wav(wav, "hello.wav")
Install as a package (optional)
This adds an indic-tiny-tts command:
hf download sulabhkatiyar/indic-tiny-tts-marathi --local-dir indic-tiny-tts-marathi
pip install ./indic-tiny-tts-marathi
indic-tiny-tts "नमस्कार! आज हवामान खूप छान आहे." --model ./indic-tiny-tts-marathi --voice male -o hello.wav
Measure the speed
Inside the downloaded folder:
python -m indic_tiny_tts.latency --model . --device cpu --threads 1
python -m indic_tiny_tts.latency --model . --backend onnx --threads 4 # the ONNX version
Details
| Language | Marathi (Devanagari script) |
| Voices | female (Rasa, AI4Bharat), male (LIMMITS 2024, IISc SYSPIN) |
| Audio | 24 kHz, mono |
| Size | 22.5 million parameters (about 90 MB per format: PyTorch or ONNX) |
| Runs on | CPU (Windows, Linux, Mac), NVIDIA GPU (CUDA), Apple silicon |
| Needs | Python 3.9+ and PyTorch, or ONNX Runtime. No eSpeak or other system packages. |
How good is it?
On held-out sentences a speech recogniser misheard 4.04 % of this model's characters, close to the 2.66 % of the real recordings.
Good to know
- Devanagari script only. English words in Latin letters (
hello) are skipped with a warning. Write them in Devanagari script. - Whole numbers are read out in Marathi:
25becomes पंचवीस and2024becomes दोन हजार चोवीस. Decimals, percentages and currency (3.5%,₹500) are not converted yet and are skipped, so write them in words. Times such as10:30and phone numbers are not read correctly yet, so write them out in words if that matters. - Long text is fine. It is split into sentences at
।,?,!and., which are spoken one after another. - Style: a calm reading voice. The model learned from about 38 hours of recorded speech by two speakers.
- The female voice is the weaker one. It makes more recognition errors (5.70 % against 3.06 % for that speaker's recordings; male voice 2.37 % against 2.27 %), skips or repeats a word more often, and sometimes holds a sound too long. A better female voice is planned for the next version.
- Speaker consent: the male voice comes from the LIMMITS 2024 corpus. Speaker consent for voice-model release is not documented by the source; the corpus is released under CC-BY-4.0 by its organisers.
- Speaking rate: each voice has a default speed matched to its speaker on held-out data (
length_scaleinconfig.json: mr_F 1.034, mr_lim_M 1.004).speed=scales it further. - Please use it responsibly. Do not use it to pass yourself off as the original speakers or to mislead people.
Training data and credits
- Rasa dataset by AI4Bharat (ai4bharat/Rasa), licence CC-BY-4.0: the Marathi female speaker (18.1 h), the read, conversation and command recordings, leaving out the emotional ones. Our changes: audio resampled from 48 kHz to 24 kHz; clips shorter than 0.5 s or longer than 20 s left out; text normalised (for example, numbers written out in words); training clips that a speech recogniser could not match to their text (character error rate above 25 %, or a length mismatch) left out: 1.55 % of the female clips.
- LIMMITS 2024 challenge corpus (SYSPIN project, © Indian Institute of Science, Bangalore, SPIRE Lab), licence CC-BY-4.0 through the SYSPIN Dataset Terms of Use, obtained from the Hugging Face mirror iAkashPaul/limmits-2024 (revision
9ee2415a): the Marathi male speaker (19.4 h used). Our changes: audio resampled to 24 kHz mono; written/spoken transcript pairs resolved to the spoken form; text normalised; clips shorter than 0.5 s or longer than 20 s and exact duplicates left out; held-out sentences removed from training; training capped at 20 h; leading silence longer than 0.3 s shortened to 0.15 s (4,853 of 8,211 clips); training clips failing the speech recogniser check left out: 0.16 %. The organisers note that the release contains some audio and text errors. - Prepared data: sulabhkatiyar/indic-tts-mini-24k (revision
8fe16c93). - Vocoder: Vocos, with the pretrained charactr/vocos-mel-24khz weights used unchanged (MIT licence; trained by its authors on LibriTTS).
- Model design: based on Matcha-TTS (MIT licence). The acoustic model (8.9 million parameters) reads characters directly (no phonemiser) and was trained from scratch on the data above for 129,459 steps (batch 32, about 10 hours on one NVIDIA T4); the released weights are the averaged (EMA) weights at that step.
- Number reading: word tables adapted from AI4Bharat's indic-numtowords (MIT licence).
- Evaluation tools: AI4Bharat IndicConformer (speech recognition) and SpeechBrain ECAPA (speaker similarity).
Licence
- Acoustic model weights (
model.safetensors,onnx/text_encoder.onnx,onnx/flow_decoder.onnx): CC-BY-4.0. You may use them, also commercially, if you give credit to this model and to the training data (the Rasa dataset and the LIMMITS 2024 corpus; see Citation and LICENSE.md). - Vocoder weights (
vocoder.safetensors,onnx/vocoder.onnx): the unchanged pretrained Vocos weights, MIT licence by their authors. - Code (
indic_tiny_tts/): MIT. - Details and third-party notices: LICENSE.md.
Citation
If you use this model, please cite it:
@misc{katiyar2026indictinyttsmarathi,
author = {Sulabh Katiyar},
title = {Indic Tiny TTS: Marathi},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/sulabhkatiyar/indic-tiny-tts-marathi}}
}
Please also cite the data and the work it builds on (for the LIMMITS 2024 voice, credit the SYSPIN project and IISc SPIRE Lab as in its terms of use):
@inproceedings{ai4bharat2024rasa,
author = {Praveen Srinivasa Varadhan and Ashwin Sankar and Giri Raju and Mitesh M. Khapra},
title = {{Rasa: Building Expressive Speech Synthesis Systems for Indian Languages in Low-resource Settings}},
booktitle = {Proc. INTERSPEECH 2024},
year = {2024}
}
@inproceedings{mehta2024matcha,
author = {Shivam Mehta and Ruibo Tu and Jonas Beskow and {\'E}va Sz{\'e}kely and Gustav Eje Henter},
title = {{Matcha-TTS}: A fast {TTS} architecture with conditional flow matching},
booktitle = {Proc. ICASSP 2024},
year = {2024}
}
@inproceedings{siuzdak2024vocos,
author = {Hubert Siuzdak},
title = {Vocos: Closing the gap between time-domain and Fourier-based neural vocoders for high-quality audio synthesis},
booktitle = {Proc. ICLR 2024},
year = {2024}
}
Appendix: how we evaluated
Every model spoke the same text: 300 held-out test sentences from both voices, never used in training, and 100 FLORES-200 news sentences. A speech recognition model (AI4Bharat IndicConformer-600M) transcribed each clip, and the score is its character error rate (CER). A paired bootstrap 95 % confidence interval of the CER difference over the same sentences decides each result: better when the whole interval favours this model, the same when it includes zero, worse when it favours the other model. The larger models read the first 40 of the held-out sentences (20 per voice) unless the table shows a larger number, and all 100 FLORES-200 sentences.
- Downloads last month
- 21


