- Maya 2 Native
Maya 2 Native
Open speech. Native voices.
Streaming text-to-speech for 11 Indic languages and English.
12 languages · 20 voices · Voice cloning · Apache-2.0
Listen · Get started · Explore voices · Benchmarks · Evaluation · Code
Maya 2 Native brings streaming speech generation to the languages people use every day. Built by Maya Research, it generates 24 kHz speech in 12 languages, with 20 built-in voices and zero-shot voice cloning from 3–10 seconds of reference audio. A voice can speak across languages: a Hindi reference can become Tamil speech.
Use it to give a voice agent its next turn, read a story in a familiar language, or build a multilingual interface you can host yourself. The release includes open weights and inference code, with a Python API, an OpenAI-compatible speech endpoint, and WebSocket streaming. Continuous batching and CUDA graphs support concurrent generation.
Watch Maya in action
Open the video · View on Google Drive
VoiceArena benchmark
Ranked #2 for Hindi among real-time TTS models on VoiceArena, with the category set to All. Checked October 27, 2026.
| Displayed rank | Creator | Model | Bradley–Terry Elo | 95% CI | Samples |
|---|---|---|---|---|---|
| 1 | Cartesia | Sonic-3.6 | 1094 | ±13 | 1,289 |
| 2 (2–4) | Maya Research | Maya-2-Native | 1047 | ±11 | 2,268 |
| 3 (2–5) | Cartesia | Sonic-3.5 | 1035 | ±12 | 1,802 |
| 4 (2–5) | Smallest AI | Lightning 3.1 Pro | 1024 | ±12 | 1,870 |
| 5 (3–5) | Murf AI | Falcon 2 | 1021 | ±14 | 1,352 |
| 6 (6–7) | Cartesia | Sonic-3 | 961 | ±9 | 4,256 |
| 7 (6–7) | Sarvam AI | Bulbul-V3 | 957 | ±9 | 3,882 |
| 8 | xAI | Grok TTS | 890 | ±9 | 3,689 |
| 9 | Microsoft Azure | Dragon HD Omni | 855 | ±9 | 3,611 |
Source: VoiceArena Hindi TTS leaderboard · Filters: Hindi / All / Real-time only · Methodology.
Parentheses reproduce the published rank intervals. Scores and ranks change as samples are added, and overlapping intervals should be considered when comparing nearby models. This result is scoped to the selected Hindi leaderboard. VoiceArena dates the Maya-2-Native entry to July 2026 and does not identify an exact checkpoint revision on the page.
View the supplied leaderboard snapshot
The supplied screenshot shows #2, Elo 1049 ±10, 2,171 samples, and rank interval 2–3. It is preserved here as a snapshot; its capture date is not shown. The table above records the live check on October 27, 2026.
At a glance
| Model at a glance | |
|---|---|
| Languages | Assamese, Bengali, English, Gujarati, Hindi, Kannada, Malayalam, Marathi, Odia, Punjabi, Tamil, Telugu |
| Model size | 2.50B unique parameters; approximately 5.0 GB of BF16 weights |
| Audio | 24 kHz, mono; streaming in 80 ms audio frames |
| Voices | 20 built-in voices; zero-shot and cross-lingual voice cloning |
| Interfaces | Python, OpenAI-compatible speech endpoint, WebSocket streaming |
| License | Apache-2.0; see component licenses |
| Checkpoint release | 1.0 · October 25, 2026 |
For developers: the model is Maya 2 Native. The existing package, Python class, and configuration filename remain
maya3,Maya3TTS, andmaya3_config.json. Use the identifiers shown in the examples.
Listen in 12 languages
Listen to one example in each supported language. These are existing, unedited outputs from the release benchmark, generated with text normalization enabled and sampled decoding. The displayed text is the original input, before normalization.
Selection: these twelve clips were chosen from outputs with character error rate below 2% under all three ASR judges. They illustrate the model's capabilities; the full benchmark results describe average performance and harder cases.
| Language, voice, and input | Audio |
|---|---|
| Hindi · Ritvik क्या आपका वर्तमान पता 45, एमजी रोड, अंधेरी ईस्ट, मुंबई 400069 है? यदि हाँ, तो 1 दबाएं। |
Open WAV |
| Assamese · Nakul এন ই এফ টি লেনদেনটো সম্পূৰ্ণ হ'বলৈ প্ৰায় 2 ঘণ্টা 30 মিনিট সময় লাগিব পাৰে। |
Open WAV |
| Bengali · Jahnavi 12/08/2023 তারিখে আপনার 1,500 টাকার refund process হয়ে গেছে, status update চেক করুন। |
Open WAV |
| English · Siddhant The EMI for your home loan is due by 12-10-24; please ensure your account has sufficient funds. |
Open WAV |
| Gujarati · Vaidehi જી બિલકુલ, મને સિસ્ટમમાં દેખાય છે કે તમારું ₹2,500 નું પેમેન્ટ 15મી તારીખે સક્સેસફુલ થઈ ગયું છે. |
Open WAV |
| Kannada · Satvik ಹೌದಾ... ಅದು ನಿಜಕ್ಕೂ ಕಷ್ಟ. ನಿಮ್ಮ ಅಂತಿಮ ಬಿಲ್ ₹45,000 ಆಗಿದೆ, ಅದರಲ್ಲಿ ಇನ್ಶೂರೆನ್ಸ್ ಕವರ್ ಆಗಿದೆಯಾ ಅಂತ ಚೆಕ್ ಮಾಡ್ತೀನಿ. |
Open WAV |
| Malayalam · Anirban റദ്ദാക്കിയ ടിക്കറ്റിന്റെ റീഫണ്ട് തുകയായ ₹1,800 മൂന്ന് ദിവസത്തിനുള്ളിൽ ലഭിക്കും. |
Open WAV |
| Marathi · Charvi मला 98765 43210 या नंबरवर OTP आला नाही, कृपया पुन्हा resend करा. |
Open WAV |
| Odia · Ahana ଦୟାକରି ମନେରଖନ୍ତୁ ଯେ EMI ପ୍ରତ୍ୟେକ ମାସର 5 ତାରିଖରେ କଟିବ ଏବଂ ଏହା ଆପଣଙ୍କର 3ୟ କିସ୍ତି। |
Open WAV |
| Punjabi · Malini NEFT ਰਾਹੀਂ ਫੰਡ ਟ੍ਰਾਂਸਫਰ 00:30 ਤੋਂ 23:30 ਤੱਕ ਉਪਲਬਧ ਹਨ। |
Open WAV |
| Tamil · Abhay கடந்த நிதியாண்டில் வங்கியின் மொத்த லாபம் ₹3.5 கோடி, இதில் ₹45 லட்சம் முதலீட்டாளர்களுக்கு வழங்கப்பட்டது. |
Open WAV |
| Telugu · Nivedita సేవింగ్స్ తో పోలిస్తే ఫిక్స్డ్ డిపాజిట్ వడ్డీ నిష్పత్తి 3:2 గా ఉండి, 7.25% ఇస్తుంది. |
Open WAV |
The Tamil sample uses Abhay, whose listed training languages are English and Hindi. The Telugu sample uses Nivedita, also trained on English and Hindi. Both demonstrate cross-lingual synthesis. Assamese is cross-lingual for every built-in voice; see limitations.
Quickstart
Use Linux, Python 3.10–3.12, and an NVIDIA GPU with a driver supporting CUDA 12.8. Start with max_seats=1. The documented single-seat loading peak is approximately 9.2 GB plus CUDA context; a 12 GB or larger GPU provides more room. See hardware and memory before increasing concurrency.
python -m venv .venv
source .venv/bin/activate
pip install "maya3[server] @ git+https://github.com/MayaResearch/maya2-native" \
--extra-index-url https://download.pytorch.org/whl/cu128
Generate speech
import soundfile as sf
from maya3 import Maya3TTS
tts = Maya3TTS.from_pretrained("maya-research/maya2-native", max_seats=1)
audio = tts.generate(
"नमस्ते, आपका ऑर्डर कल पहुँच जाएगा।",
lang="hi",
voice="Ahana",
normalize=True,
)
sf.write("speech.wav", audio, 24000)
tts.close()
generate() returns a mono NumPy waveform in float32. Model weights, the Mimi codec, and the ECAPA speaker encoder are downloaded on first use. For offline inference, cache all three first, then set HF_HUB_OFFLINE=1.
Normalization differs by interface: the HTTP and WebSocket servers enable it by default. The Python API requires normalize=True. It expands numbers, currency, dates, times, URLs, email addresses, and other written forms into spoken text. Check the output for unusual formats.
Stream audio as it is generated
Stream speech
from maya3 import Maya3TTS
tts = Maya3TTS.from_pretrained("maya-research/maya2-native", max_seats=1)
try:
with open("speech.pcm", "wb") as output:
for chunk in tts.stream(
"Your order has shipped and will arrive tomorrow.",
lang="en",
voice="Siddhant",
normalize=True,
):
output.write(chunk.astype("<i2", copy=False).tobytes())
finally:
tts.close()
stream() yields signed 16-bit PCM arrays at 24 kHz, mono. astream() provides the asynchronous interface. Concurrent requests are batched by the engine; size max_seats to your hardware.
Clone a voice across languages
Use a clean, single-speaker reference clip and its exact transcript. Obtain the speaker's permission before cloning their voice. The reference language and the output language can differ.
import soundfile as sf
from maya3 import Maya3TTS
tts = Maya3TTS.from_pretrained("maya-research/maya2-native", max_seats=1)
tts.register_voice(
"my_voice",
ref_audio="reference.wav", # 3–10 seconds recommended
ref_text="<exact transcript of reference.wav>",
lang="hi", # reference language
)
audio = tts.generate(
"வணக்கம், எப்படி இருக்கிறீர்கள்?",
lang="ta", # output language
voice="my_voice",
normalize=True,
)
sf.write("cloned_voice_tamil.wav", audio, 24000)
tts.close()
The default cloning mode, icl_spk, combines the reference audio with an ECAPA speaker embedding. Clones approximate the reference voice; similarity and accent vary. A dedicated cloning benchmark is not included in this release's reported results.
Run a local HTTP and WebSocket server
Serve over HTTP or WebSocket
python -m maya3.server \
--ckpt maya-research/maya2-native \
--host 127.0.0.1 --port 8080 --max-seats 1
After GET /health reports ready, generate speech:
curl --fail-with-body -sS http://127.0.0.1:8080/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"input":"Your order has shipped.","language":"en","voice":"Ahana","response_format":"wav"}' \
--output speech.wav
The server provides POST /v1/audio/speech, WS /v1/tts/stream, and voice registration endpoints. It has no built-in authentication; add authentication and access controls before exposing it beyond a trusted environment. See the GitHub README for clients and protocol details.
Voices
Select a built-in voice by name, for example voice="Vaidehi". Names are case-insensitive, and no reference audio is needed. All 20 names describe synthetic voice personas.
The training-language column lists languages with at least one hour of training audio for that voice. A voice can be requested in any supported language, but performance outside its listed languages is cross-lingual and may sound less native.
| Voice | Profile | Training languages, ≥1 hour |
|---|---|---|
| Ahana | Young female voice, bright, youthful | bn en gu hi kn ml mr or pa ta te |
| Vaidehi | Adult female voice, calm, gentle | bn en gu hi kn ml mr or pa ta te |
| Malini | Mature female voice, steady narrator | bn en gu hi kn ml mr or pa ta te |
| Charvi | Young female voice, energetic, upbeat | bn en gu hi kn ml mr or pa ta te |
| Jahnavi | Adult female voice, warm, friendly | bn en gu hi kn ml mr or ta te |
| Anirban | Adult male voice, steady narrator | bn en gu hi kn ml mr or pa ta te |
| Nakul | Young male voice, bright, youthful | bn en gu hi kn ml mr or pa ta te |
| Vasant | Mature male voice, steady narrator | bn en gu hi kn ml mr or ta te |
| Siddhant | Adult male voice, clear, professional | bn en gu hi kn ml mr or pa ta te |
| Satvik | Young male voice, warm, friendly | bn en gu hi kn ml mr or pa ta te |
| Abhay | Adult male voice, natural conversational style | en hi |
| Nivedita | Adult female voice, natural conversational style | en hi |
| Ishwari | Adult female voice, natural conversational style | hi |
| Ritvik | Adult male voice, natural conversational style | hi |
| Vrinda | Young female voice, natural conversational style | hi |
| Sreekar | Adult male voice, natural conversational style | en hi te |
| Kayal | Adult female voice, natural conversational style | en ta |
| Shaunak | Young male voice, natural conversational style | en hi |
| Akshat | Adult male voice, natural conversational style | en hi |
| Tanushree | Adult female voice, natural conversational style | en hi |
Language codes: as Assamese · bn Bengali · en English · gu Gujarati · hi Hindi · kn Kannada · ml Malayalam · mr Marathi · or Odia · pa Punjabi · ta Tamil · te Telugu.
Pass only the speech text and the voice name to the API. The engine constructs the voice prompt internally; adding Ahana: to your text is unnecessary. Use either a built-in voice or your own reference audio for a request, rather than combining them.
Evaluation
The release was evaluated on 6,000 held-out texts across 12 languages, producing 20.3 hours of speech. Three ASR judges measured intelligibility; a speaker-embedding classifier measured consistency among the 20 built-in voices.
These are Maya Research's release measurements. ASR error rates and embedding similarity capture specific aspects of quality; they do not replace human listening or measure every aspect of naturalness. Serving measurements below describe the tested hardware and workload.
Benchmark design
The release benchmark, bench6k, contains 6,000 held-out texts: 500 per language across 31 content categories, including conversation, names, numbers, dates, currency, addresses, URLs, code-mixed text, tongue twisters, and prompts of 1–50 words. The release documentation states that these evaluation texts were excluded from training.
The benchmark produced 20.3 hours of speech through the server, with normalization and engine guards enabled, sampled decoding, and one seed per row. Voices were distributed across languages and categories; long inputs used the serving stack's text chunking.
Three ASR systems transcribed the generated speech:
- ASR-1: Maya's in-house Indic ASR and primary judge.
- Qwen3-ASR: a third ASR judge.
- ASR-2: a second in-house Indic ASR, held out from training, reward generation, and checkpoint selection.
Character error rate (CER) compares ASR transcripts with spoken-form references. Scorer v1 uses the benchmark's normalization and script harmonization. Scorer v2 additionally harmonizes Latin and native-script spellings in code-mixed spans. The two scorers evaluate the same generated audio; lower v2 scores reflect a scoring change.
| Overall CER ↓ | ASR-1 | Qwen3-ASR | ASR-2, held out |
|---|---|---|---|
| Scorer v1 | 3.49% | 3.40% | 2.86% |
| Scorer v2, additional code-mix harmonization | 2.35% | 2.22% | 1.73% |
Results by language
CER below uses scorer v1. Voice identity is nearest-centroid classification among the 20 built-in voices, using ECAPA embeddings from clips of at least one second. It is a closed-set identity metric, separate from zero-shot clone similarity.
| Language | Code | CER ASR-1 ↓ | CER Qwen3-ASR ↓ | CER ASR-2 ↓ | Voice identity ↑ |
|---|---|---|---|---|---|
| Assamese | as |
5.41% | 6.59% | 5.54% | 96.4% |
| Bengali | bn |
2.60% | 2.83% | 2.68% | 98.5% |
| English | en |
9.69% | 1.74% | 1.43% | 99.6% |
| Gujarati | gu |
2.25% | 3.76% | 2.26% | 98.9% |
| Hindi | hi |
1.52% | 2.05% | 1.57% | 99.6% |
| Kannada | kn |
2.28% | 2.72% | 2.23% | 97.9% |
| Malayalam | ml |
3.75% | 4.20% | 4.03% | 99.4% |
| Marathi | mr |
1.66% | 2.09% | 1.54% | 99.1% |
| Odia | or |
3.45% | 4.33% | 3.54% | 97.4% |
| Punjabi | pa |
2.51% | 3.32% | 2.66% | 99.1% |
| Tamil | ta |
4.42% | 4.55% | 4.33% | 98.1% |
| Telugu | te |
2.29% | 2.64% | 2.53% | 99.4% |
ASR-1's English CER is substantially higher than the other two judges. The release analysis attributes part of this difference to ASR-1 looping on spoken URLs such as “W W W.” All three results are retained to show judge disagreement.
Failures and voice consistency
The benchmark's consensus failure rate requires agreement between ASR-1 and Qwen3-ASR under the release's failure rules, covering looping, substantial insertions, very high CER, and duration-limit events.
| Release measurement | Result |
|---|---|
| Consensus failure rate, scorer v1 | 0.15% |
| Consensus failure rate, scorer v2 | 0.03% |
| Outputs reaching the absolute length cap | 0.00% |
| Loops / truncations | 0.02% / 0.13% |
| Built-in voice name spoken aloud | 0.00% |
| Voice identity, nearest of 20 centroids | 98.6% |
| Mean ECAPA similarity | 0.778 |
Zero observed events apply to this finite benchmark. A consensus failure rate does not count every pronunciation error or one-judge disagreement.
A separate 1,248-row named-voice evaluation reports 98.9% identity in trained languages and 98.8% cross-lingual identity. The same classifier scored 98.0% on held-out recordings of the source voices. These are task-specific measurements, rather than evidence that generated speech is more natural than recorded speech.
Harder inputs
| Category | ASR-1 CER, v1 | ASR-1 CER, v2 |
|---|---|---|
| Web addresses | 29.06% | 20.34% |
| Heavy code-mix | 16.74% | 4.11% |
| Code-mix | 10.60% | 3.51% |
| Symbols | 6.34% | 2.49% |
The code-mix gap illustrates the effect of script spelling on ASR-based scoring. Pronunciation and intelligibility still need listening evaluation, especially for names, URLs, and critical numbers.
Streaming performance
The reported release serving run used one H100 NVL with 95 GB reported memory, 224 concurrent WebSocket streams, a BF16 backbone, and an FP16 depth decoder.
| Metric | Reported result |
|---|---|
| Concurrent streams | 224 |
| Aggregate throughput | 323 seconds of audio per wall-clock second |
| Time to first audio, steady state, p50 / p90 / p99 | 111 / 134 / 242 ms |
| Time to first audio, complete run including ramp and drain, p50 / p99 | 115 / 774 ms |
| Per-stream real-time factor at full load, p50 | 0.68 |
| Observed playback stalls / serving errors | 0 / 0 |
A separate single-stream H100 measurement reports approximately 14 ms to first audio and 0.13 real-time factor. It uses a different load condition from the 224-stream run. Real-time factor is generation time divided by audio duration; lower is faster.
The release analysis attributes the complete-run latency tail partly to admission queuing during the drain phase. Latency depends on hardware, load, input length, cached state, and the serving environment; these measurements do not establish public internet or telephone latency.
Hardware and memory
The engine documentation reports the following GPU allocator measurements with a BF16 backbone, FP16 depth decoder, and 2,048 KV-cache tokens per seat. Add approximately 0.5 GB for the CUDA context and allow additional deployment headroom.
| Concurrent seats | Steady GPU memory | Peak during loading |
|---|---|---|
| 1 | 7.7 GB | 9.2 GB |
| 8 | 9.7 GB | 10.9 GB |
| 16 | 11.7 GB | 12.8 GB |
| 32 | 15.8 GB | 16.5 GB |
max_seats controls allocated serving capacity and memory, even before every seat is busy. These figures describe this configuration; a checkpoint's download size is smaller than its total runtime memory requirement. See engine documentation for configuration and hardware-specific measurements.
Architecture and audio generation
Architecture
Maya 2 Native generates discrete audio tokens autoregressively, then decodes them into speech with Mimi.
| Component | Description |
|---|---|
| Text and audio backbone | Initialized from Qwen3-1.7B-Base; 28 layers, hidden size 2,048, 16 attention heads and 8 KV heads; extended vocabulary for language and audio tokens |
| Depth decoder | Approximately 555M parameters; predicts codebooks 1–31 after the backbone predicts codebook 0 |
| Audio codec | Kyutai Mimi; 32 codebooks with 2,048 entries each, at 12.5 frames per second |
| Speaker conditioning | 192-dimensional SpeechBrain ECAPA-TDNN embedding projected into the backbone; reference-audio conditioning for cloning |
| Output | 24 kHz mono speech, 80 ms per audio frame |
At each step, the backbone predicts the first codebook, the depth decoder fills the remaining codebooks, and Mimi decodes an audio frame. The engine can emit that frame while generation continues. An end-of-audio token controls normal stopping; duration and loop guards provide additional controls.
Training data and procedure
The release documentation describes a mixture of licensed and synthetic speech with transcripts across the 12 languages, plus text-only data used to adapt the backbone to the languages. The built-in voice personas use synthetic and licensed voice data prepared for this purpose.
The preference-optimization stage used direct preference optimization (DPO) on model-generated candidates ranked by ASR agreement and speaker similarity. Benchmark texts were excluded from training, according to the release documentation.
Dataset identities, total training hours, detailed per-language composition, and the full training configuration are not disclosed in this release. Automated scores should be considered alongside these disclosure limits.
Limitations
- Uneven language coverage. Assamese is the most challenging Indic language in the release benchmark. No built-in voice has at least one hour of Assamese training data; some outputs drift toward a Bengali-like timbre. Other cross-lingual combinations can also carry the voice's training-language accent.
- Very short turns. One- or two-word prompts are less stable in voice identity, and speaker-embedding evaluation is less reliable on very short clips. A slightly longer phrase may help short agent responses.
- Code-mixed and written-form inputs. English words inside Indic sentences vary by voice. URLs, symbols, dates, and long digit sequences remain difficult, even with normalization. Listen to application-specific examples before relying on them.
- Voice cloning. Similarity is approximate. Noise, multiple speakers, short references, and inaccurate transcripts can degrade results. Dedicated zero-shot cloning scores are not reported here.
- Emotion and events. Tags such as
[laughs],[sighs],[whispers],[sad], and[excited]are best effort and were not the focus of this release. - Generation and guards. Sampling can produce errors. The same seed is reproducible for an isolated request, but batching changes the random stream. Loop and duration guards can end genuinely repetitive text early. No benchmark clip spoke a built-in voice name aloud, but this remains a possible failure mode.
- Evaluation scope. Results use automated ASR and speaker-embedding judges. This card does not report a human naturalness study, comprehensive dialect or demographic evaluation, confidence intervals, or a controlled comparison with other TTS models.
Intended use and responsible deployment
Maya 2 Native is intended for voice interfaces and agents, accessibility, reading and narration, IVR, notifications, and research on multilingual speech generation.
Clone only voices you own or have explicit permission to use. Disclose synthetic speech to listeners, especially in calls and media. Do not use the model for deceptive impersonation, fraud, harassment, non-consensual content, disinformation, or attempts to defeat voice authentication. Built-in voice names identify synthetic personas and should not be presented as real people.
This release does not add an audio watermark. Applications should implement the consent, disclosure, access controls, and abuse monitoring appropriate to their use. Consult the repository's security guidance for deployment considerations.
Files in this repository
Files in this repository
| Path | Contents |
|---|---|
model-00001-of-00002.safetensors, model-00002-of-00002.safetensors |
BF16 model weight shards |
model.safetensors.index.json |
Weight-to-shard mapping |
maya3_config.json |
Resolved model configuration and serialization metadata |
backbone/ |
Backbone configuration and tokenizer; backbone weights are included in the main model shards |
voices/voices.json |
Built-in voice metadata and conditioning modes |
samples/ |
The twelve WAV examples above |
Tied weights are stored once and represented through aliases. Mimi and the ECAPA speaker encoder are resolved from their own repositories on first use.
License
The model weights are released under Apache-2.0, as specified in this repository's license metadata. The inference code is also Apache-2.0.
The upstream components retain their own licenses: Qwen3-1.7B-Base (Apache-2.0), Kyutai Mimi (CC-BY-4.0), and SpeechBrain ECAPA-TDNN (Apache-2.0). Preserve their notices and attribution when redistributing or using these components.
Citation
@misc{maya2native2026,
title = {Maya 2 Native: Streaming Multilingual Text-to-Speech},
author = {{Maya Research}},
year = {2026},
url = {https://huggingface.co/maya-research/maya2-native},
note = {Release 1.0}
}
Credits and acknowledgments
Created by Maya Research.
Maya Research team
- Dheemanth Reddy BS
- Bharath Kumar Kakumani
- Sai Charan Thippareddy
- Prahalad Boreddy
Maya 2 Native builds on the work of the open research community. We thank:
- The Qwen team for Qwen3-1.7B-Base, which initializes the text and audio backbone.
- Kyutai for Mimi, the neural audio codec used to represent and decode speech.
- The SpeechBrain team for ECAPA-TDNN, used for speaker conditioning and voice-identity evaluation.
- The Hugging Face community for the tools and infrastructure that make sharing models and building on them easier.
Please cite Maya 2 Native and acknowledge the upstream work relevant to your use.