In partnership with

SnackOnAI Engineering | Senior AI Systems Researcher | Technical Deep Dive | November 10, 2026

The teacher, Maya2-native, generates speech the way a language model writes text: about 2,800 audio-token predictions for a 7-second sentence. Mithi makes roughly one decision per phoneme, a few dozen for the same sentence, and leaves the waveform to a decoder that renders every sample in parallel. Moving the slow, step-by-step part from audio frames to phonemes is the architectural bet. The distillation only supplies the data.

The promise: by the end you'll know exactly which 99.1M parameters Mithi kept, replaced and added, why its voices file is precisely 522 kB, and what "sounds flatter than its teacher" means in architectural terms.

The fence: we read the Mithi v1 Flash model card and file listing (14 commits, published around November 7, 2026, Apache 2.0), the Maya2-native and IndicBERT cards, and the Kokoro and misaki source code. We instantiated Kokoro's modules locally to count parameters. Mithi's own Python package and config couldn't be fetched raw, so its internals beyond the card are inferred from Kokoro's interface and labeled as such. We didn't run Mithi or listen to it. Mithi has no published evaluation: no CER, no MOS, no speed data beyond one CPU timing.

What It Actually Does

Mithi v1 Flash is a text-to-speech model for 11 languages: Hindi, English, Bengali, Gujarati, Kannada, Malayalam, Marathi, Odia, Punjabi, Tamil and Telugu. It has two voices, Satvik (male) and Charvi (female), and outputs 24 kHz mono audio.

Component

Parameters

File

Origin

IndicBERT word encoder

21.3M

indic_encoder/

AI4Bharat ALBERT, vocabulary trimmed to these languages (MIT)

Prosody writer

18.8M

writer.safetensors (37.7 MB)

New: reads the sentence, writes prosody one phoneme at a time. Checkpoint labeled "writer v2, GRPO step 2400"

Kokoro text encoder + iSTFTNet decoder

58.9M

decoder.safetensors (118 MB)

Kokoro-82M, fine-tuned to step 62,000 (Apache 2.0)

Voices

n/a

voices.safetensors (522 kB)

Two voice style tables

Total

99.1M

197 MB bf16

The training speech came entirely from Maya2-native, Maya Research's 2.50B-parameter open TTS model built on Qwen3-1.7B and Kyutai's Mimi codec. Mithi is about 25x smaller in parameters and on disk.

Maya2-native (teacher)

Mithi v1 Flash (student)

Parameters

2.50B

99.1M

Weights

~5.0 GB

197 MB

Voices

20 + zero-shot cloning

2

Languages

12 (incl. Assamese)

11

Hardware

NVIDIA GPU, CUDA 12.8, ~7.7 GB per seat

CPU or GPU

Speed

RTF 0.13 on one H100 stream

~8 s per 7 s sentence on 1 EPYC thread, ~3 s on 4

Published eval

CER ~3.4% (ASR judges), voice ID 98.6%

None

Expressiveness

Emotion tags (best effort)

"Flatter intonation and emotion"

Think of a pianist who records every note as audio versus one who writes sheet music and hands it to a player piano. Maya2 performs the audio note by note. Mithi writes the score, meaning timing, pitch and loudness for each sound, and a fast decoder plays it all at once.

The Architecture, Unpacked

What to notice: the only step-by-step stage runs once per phoneme, over a few dozen steps. Everything that touches audio samples runs in parallel. That's why a laptop CPU is enough.

Three decisions define the model.

Keep Kokoro's renderer, replace its brain. We instantiated Kokoro-82M's modules: PL-BERT 6.29M, its projection 0.39M, prosody predictor 16.20M, text encoder 5.61M, decoder 53.31M. The text encoder plus decoder comes to 58.92M, which matches Mithi's 58.9M exactly. Mithi kept 72% of Kokoro and replaced the English-centric 22.9M front end with 40.1M of Indic-aware parts.

Make prosody autoregressive. Kokoro's predictor is non-autoregressive: an LSTM predicts all durations at once, then the F0 and energy curves. Mithi's writer generates prosody phoneme by phoneme, sampled at temperature 0.7, so each choice can depend on the ones before it. A fixed seed of 0 makes the same text produce the same audio.

Get word meaning from IndicBERT. Kokoro's PL-BERT reads phonemes. Mithi adds a word-level encoder pretrained on about 9 billion tokens of Indian-language text, so the writer knows which word carries the emphasis, not just which sounds follow which.

The Code, Annotated

Snippet one: the seam Mithi cut. This is Kokoro's own forward pass, from kokoro/model.py, annotated to show what Mithi replaced. The replacement code itself isn't public in readable form; the boundary follows from the parameter match.

def forward_with_tokens(self, input_ids, ref_s, speed=1):
    # ---------- REPLACED IN MITHI: PL-BERT + prosody predictor (22.9M) ----------
    bert_dur = self.bert(input_ids, attention_mask=(~text_mask).int())   # SnackOnAI: phoneme-level BERT
    d_en = self.bert_encoder(bert_dur).transpose(-1, -2)
    s = ref_s[:, 128:]                                  # SnackOnAI: second half of the voice vector → predictor
    d = self.predictor.text_encoder(d_en, s, input_lengths, text_mask)
    x, _ = self.predictor.lstm(d)
    duration = self.predictor.duration_proj(x)          # SnackOnAI: all durations at once, non-autoregressive
    duration = torch.sigmoid(duration).sum(axis=-1) / speed
    pred_dur = torch.round(duration).clamp(min=1).long().squeeze()
    # ---------- KEPT: expand phonemes by duration into a hard alignment ----------
    indices = torch.repeat_interleave(torch.arange(input_ids.shape[1], device=self.device), pred_dur)
    pred_aln_trg = torch.zeros((input_ids.shape[1], indices.shape[0]), device=self.device)
    pred_aln_trg[indices, torch.arange(indices.shape[0])] = 1    # ← THIS is the interface: durations become
                                                                 #   a 0/1 matrix; any prosody model can feed it
    F0_pred, N_pred = self.predictor.F0Ntrain(en, s)    # SnackOnAI: REPLACED, the writer supplies pitch + loudness
    # ---------- KEPT IN MITHI: text encoder + iSTFTNet decoder (58.9M) ----------
    t_en = self.text_encoder(input_ids, input_lengths, text_mask)
    asr = t_en @ pred_aln_trg
    audio = self.decoder(asr, F0_pred, N_pred, ref_s[:, :128]).squeeze()   # SnackOnAI: first half → decoder
    return audio, pred_dur

Kokoro's decoder only needs four things: aligned text features, a pitch curve, an energy curve and a 128-dim voice style. That narrow interface is what let Mithi swap the whole front end.

Snippet two: our verification arithmetic. These reproduce the parameter split and the voices file size from first principles.

# Kokoro-82M module sizes, instantiated from kokoro.modules / kokoro.istftnet with the published config
kokoro = {"plbert": 6.29, "bert_proj": 0.39, "predictor": 16.20, "text_encoder": 5.61, "decoder": 53.31}
kept = kokoro["text_encoder"] + kokoro["decoder"]
print(f"kept from Kokoro: {kept:.2f}M")                          # 58.92M == Mithi's 58.9M ✓
print(f"replaced: {kokoro['plbert'] + kokoro['bert_proj'] + kokoro['predictor']:.1f}M "
      f"→ added: {21.3 + 18.8:.1f}M")                             # 22.9M → 40.1M

# Kokoro voicepacks are [510, 1, 256]: one style vector per phoneme count (1..510)
voices, max_len, style_dim, bytes_bf16 = 2, 510, 256, 2
print(voices * max_len * style_dim * bytes_bf16)                  # 522,240 bytes == the 522 kB file ✓

# Autoregressive steps for ~7 s of speech
mimi_fps, codebooks = 12.5, 32
print("teacher token predictions:", int(7 * mimi_fps * codebooks))    # 2,800 (87.5 frames × 32 codebooks)
print("student alignment frames (25 ms):", 7 * 40)                    # 280, rendered in parallel

The voices file is byte-for-byte a Kokoro voicepack. A Mithi "voice" is a lookup table of 510 style vectors indexed by sentence length, not a speaker embedding computed from audio.

Snippet three: using it. This follows the card's documented API. The exact voice string casing is our assumption.

import torch
from mithi_tts import Mithi

torch.set_num_threads(4)                 # card: ~3 s per 7 s sentence on 4 EPYC threads vs ~8 s on 1
tts = Mithi(".")                         # folder from `hf download Oomni/mithi-v1-flash`
audio = tts.synthesize(
    "मीटिंग कल 3:30 बजे है",   # ① the normaliser must expand "3:30" before G2P ever sees it
    lang="hi", voice="charvi",           # 11 language codes, 2 voices
)                                        # ← THIS is deterministic: seed 0 per sentence, writer T=0.7
tts.save(audio, "meeting.wav")           # 24 kHz mono

Determinism by fixed seed is a product decision: identical text always sounds identical, which suits IVR prompts and audiobooks and rules out natural variation between takes.

It In Action

Input: a 15-word Hindi sentence, Charvi voice, CPU inference on an AMD EPYC 9554 (the card's benchmark machine).

Step one, normalise and phonemise. Digits, times and currency become words. espeak-ng via misaki converts them to phonemes. A 15-word sentence produces a few dozen to around a hundred phonemes, well under the 400-phoneme cap per piece.

Step two, encode. IndicBERT produces one vector per word (21.3M parameters, run once). Kokoro's text encoder produces one vector per phoneme.

Step three, write prosody. The writer reads the whole sentence, then steps through it phoneme by phoneme, assigning duration, voicing, pitch, loudness and breath. For about 7 seconds of speech the durations add up to roughly 280 alignment frames of 25 ms (our arithmetic from Kokoro's 24 kHz, 600-sample frame).

Step four, render. The iSTFTNet decoder upsamples by 10 and then 6, and an inverse STFT with hop 5 produces 168,000 samples in parallel.

Output (card, single sentence):

Setting

Time

Real-time factor (our calc)

1 CPU thread

~8 s

~1.14, slower than real time

4 CPU threads

~3 s

~0.43

Teacher on 1 H100 stream (for scale)

n/a

0.13

sequential predictions to make ~7 s of speech
 Maya2-native  ████████████████████████████████████████  2,800 audio tokens (87.5 frames × 32 codebooks)
 Mithi writer  █                                         ~dozens of phoneme steps

Single-threaded, Mithi is still slower than real time. Its advantage is needing no GPU at all, not raw speed.

Why This Design Works (and what it trades away)

It works because StyleTTS 2's decoder is already very good. Kokoro inherits StyleTTS 2's style-conditioned decoder and iSTFTNet's trick of replacing the last upsampling layers with an inverse Fourier transform, which keeps the vocoder small and fast. Reusing 53.3M parameters of a proven renderer means Mithi spent its effort on what Indian languages need: prosody and pronunciation.

It works because synthetic data is perfectly labeled. Every training clip came from Maya2-native, so the text is exactly what was said and there are no transcription errors.

It trades away expressiveness. The card says so: intonation and emotion are flatter than Maya2's. A per-phoneme scalar for pitch and loudness is a compressed description of speech, and the student learns the average of what the teacher did.

It trades away anything beyond one sentence. Each sentence's prosody is written without seeing its neighbours, then joined with 0.15 s of silence. Paragraph-level rhythm, questions answered in the next sentence and contrastive emphasis across sentences are out of reach.

It trades away pronunciation control. Mithi inherits every espeak-ng G2P error and every normaliser gap, with no learned pronunciation to correct them. The card also flags Kannada, Malayalam, Marathi and Odia as slightly too fast.

It trades away voices. The teacher has 20 voices and zero-shot cloning. Mithi has two, baked into a decoder fine-tuned for 62,000 steps on their speech. A new voice means new teacher audio and more fine-tuning, not a reference clip.

Technical Moats

  • Thin in code, real in recipe. Every component except the writer is public: Kokoro, IndicBERT, espeak-ng, misaki and Maya2-native are all open. Anyone can rebuild the pipeline.

  • The writer is the asset. An 18.8M autoregressive prosody model with a GRPO-tuned checkpoint is the one piece that isn't off the shelf, and its training recipe and reward aren't published.

  • The synthetic corpus. Generating clean, multilingual, two-voice speech at scale requires running a 2.5B GPU model for many hours. The card doesn't say how many.

  • Licensing is clean. Apache 2.0 for Mithi, Kokoro and Maya2-native, MIT for IndicBERT. Unlike many open speech models, nothing here blocks commercial use.

Contrarian Insights

One: this is a pipeline, not a breakthrough model, and that's its strength. Mithi is a teacher's data, AI4Bharat's word encoder, Kokoro's renderer and espeak-ng's phonemes around one new 18.8M component. That's not a criticism. It's the most practical way to get eleven languages into 197 MB, and it shows that open speech components now compose like software libraries. The genuinely new idea is narrow: autoregressive prosody, refined with RL, feeding a non-autoregressive renderer.

Two: "no published evaluation" should block production use, and the tooling to fix it already exists. Maya2-native shipped character error rates per language from automated speech recognition judges and a voice identity score. Mithi shipped none, so the only quality statement is the authors' own "flatter." A student distilled from synthetic speech can't exceed its teacher, and the teacher itself has no human naturalness study. Running Maya2's own CER harness on Mithi would take an afternoon. Until someone does, treat Mithi as a demo for anything user-facing.

Surprising Takeaway

Mithi's two voices fit in exactly 522,240 bytes: 2 voices × 510 × 256 values in bf16, Kokoro's voicepack format to the byte. A "voice" here is a table of 510 style vectors, one for each possible phoneme count, and Kokoro sends half of each vector to the decoder and half to the prosody predictor. Mithi removed that predictor, so half of every voice vector fed a module that no longer exists. Whether the new writer reads it isn't documented. The file layout preserves an interface the model may no longer use.

TL;DR For Engineers

  • Mithi v1 Flash is a 99.1M, 197 MB TTS for 11 Indian languages and 2 voices, distilled from Maya2-native's 2.50B model using only synthetic speech.

  • It keeps Kokoro's text encoder and iSTFTNet decoder (58.92M, an exact match) and replaces its 22.9M front end with IndicBERT (21.3M) and an autoregressive, GRPO-tuned prosody writer (18.8M).

  • Autoregression runs per phoneme, not per audio token: dozens of steps against the teacher's ~2,800 for 7 s. That's why it runs on CPU, at RTF ~0.43 on 4 threads and ~1.14 on one.

  • There is no published CER, MOS or voice evaluation. Expect flatter prosody, sentence-level context only and inherited G2P errors.

  • Apache 2.0 throughout, but new voices require teacher audio and decoder fine-tuning.

Explain It Like I'm New

Most people in India don't read or type in English, so software that speaks their language out loud matters for phone menus, reading apps, accessibility tools and customer service. The best speech models are large and need expensive graphics cards, which puts them out of reach for many products and devices.

Mithi takes a different route. A large, high-quality speech model generated lots of example recordings in eleven languages and two voices. Then a much smaller model was trained to imitate those recordings.

The small model splits the work in two. First it plans how each sound in a sentence should be said: how long, how high, how loud. That's like writing sheet music. Then a separate part turns the plan into actual audio all at once, like a player piano reading the sheet. Because the slow planning step only happens once per sound, not thousands of times per second of audio, an ordinary laptop processor can run it.

The cost is personality. The small model sounds flatter than its teacher, and it only knows two voices.

This pattern of a big model teaching a small one that runs anywhere is how a lot of AI will reach phones and low-cost devices.

See It In Action

  • Mithi v1 Flash demo, hugging-apps on Hugging Face Spaces. Try it in your browser. Type text in any of the 11 languages, pick a voice and hear the flattening for yourself.

  • Mithi sample clips, Oomni. Listen to the samples. The card ships example clips with a sentences.tsv, the fastest way to compare languages side by side.

  • KokoroTTS now supports Hindi and French, YouTube. Watch the walkthrough. Shows Kokoro's original Hindi support, the baseline Mithi extended to ten more Indian languages.

We found no talk or independent listening test of Mithi as of November 8. The model is about two days old.

Community Conversation

  • Maya Research, Maya2-native card. The teacher's own caveats apply downstream: its results rely on automated ASR and speaker-embedding judges, with no human naturalness study, and no built-in voice has an hour of Assamese audio, which likely explains why Mithi has eleven languages, not twelve.

  • Oomni, Mithi limitations. An unusually candid card: flatter intonation, four languages slightly too fast, G2P and normaliser errors pass through, and "no published evaluation yet."

  • hexgrad (Kokoro), Kokoro repository. Kokoro's credits name yl4579, the StyleTTS 2 author, as the architect. Mithi is the latest model built on that line, which runs from StyleTTS 2 through Kokoro to Indian languages.

  • AI4Bharat, IndicBERT. A compact ALBERT pretrained on about 9 billion tokens across 12 Indian languages. Its small footprint is why a word-level encoder fits in a 197 MB TTS at all.

Conclusion: The Right Architecture, Shipped Before Anyone Measured It

Mithi v1 Flash makes a smart architectural choice: autoregressive prosody per phoneme feeding Kokoro's parallel decoder, with a GRPO-tuned writer and IndicBERT for word meaning. It turns a 2.5B GPU model's output into a 197 MB model that runs on a CPU, under a clean Apache license. The parameter accounting checks out to the decimal, and the voices file matches Kokoro's format to the byte. What's missing is evidence. There's no CER, no MOS, and only one CPU timing, and the authors' own description of the quality is "flatter." Use it for prototypes, accessibility tools and offline demos. Run Maya2's CER harness on your own sentences before you put it in front of users.

References

Summary

Mithi v1 Flash is a 99.1M-parameter TTS for 11 Indian languages that keeps Kokoro's 58.9M renderer and adds IndicBERT plus an autoregressive, GRPO-tuned prosody writer, trained entirely on Maya2-native speech. Moving autoregression from audio tokens to phonemes is what makes it CPU-friendly. It has no published evaluation, and its own card says it sounds flatter than its teacher.

Sponsored Ad If you enjoy practical AI insights, check out SnackOnAI and support the newsletter by subscribing, sharing, and exploring our sponsored ad—it helps us keep building and delivering value 🚀

Want to get the most out of ChatGPT?

ChatGPT is a superpower if you know how to use it correctly.

Discover how HubSpot's guide to AI can elevate both your productivity and creativity to get more things done.

Learn to automate tasks, enhance decision-making, and foster innovation with the power of AI.

Recommended for you

View all
caret-right