ai4bharat/Rasa
Viewer • Updated • 1.28M • 6.8k • 67
Ninada (निनाद) v5.0 — 24,000 Hz Native Studio VITS Specialists (Indian English + 11 Indian Languages)
Ninada (Nināda — Sanskrit निनाद, deep resonant sound) v5.0 is a 24,000 Hz Native Per-Language Studio Neural TTS suite (~27.9 MB active W8A32+FP16 ONNX per specialist, 382.4 ms native CPU median TTFA, 0.202x RTF) featuring 12 dedicated Studio Male + 12 dedicated Studio Female specialists (24 models total) across Classical Sanskrit (sa), Indian English (en), Hindi (hi), Kannada (kn), Marathi (mr), Bengali (bn), Tamil (ta), Telugu (te), Malayalam (ml), Gujarati (gu), Punjabi (pa), and Odia (or) — fine-tuned end-to-end on Cloud GPU from IISc SPIRE Lab SYSPIN VITS donors onto single-speaker 24,000 Hz studio recordings (ai4bharat/Rasa + SPRINGLab/IndicTTS-English).
AudioWorklet Studio: https://hemanth.github.io/ninada/24 Dedicated Specialists): Every language (sa, en, kn, hi, mr, bn, ta, te, ml, gu, pa, or) has dedicated Male (onnx/{lang}.onnx) and Female (onnx/{lang}_female.onnx) 24,000 Hz StudioVitsModel checkpoints (RelativePositionTransformer + StochasticDurationPredictor Rational-Quadratic Spline + ResidualCouplingBlock normalizing flow + HiFi-GAN v1 [8, 8, 2, 2] upsampling generator, HOP_LENGTH = 256) trained strictly on that language's own native single-speaker 24 kHz studio recordings (26700 studio training clips).vocabs.json):sa (144 Devanagari tokens), en (102 Latin tokens), kn (85 Kannada tokens), hi (120 Devanagari tokens), mr (144 Devanagari tokens including ळ/ऱ), bn (100 Bengali tokens including ৎ/ড়/ঢ়), ta (61 Tamil tokens including ழ/ற/ன), te (110 Telugu tokens), ml (101 Malayalam tokens including atomic chillus ൺ ൻ ർ ൽ ൾ ൿ), gu (124 Gujarati tokens), pa (85 Gurmukhi tokens including ੰ/ੱ via -0x0100 Brahmic isomorphism), and or (94 Odia tokens including ଡ଼/ଢ଼/ୟ via -0x0180 Brahmic isomorphism).~27.9 MB Browser W8A32+FP16 ONNX + Sub-Clause Latent Streaming: Each specialist exports to ~27.9 MB (0.58 dB deterministic MCD parity vs PyTorch FP32), splits dynamically in-browser at the latent tensor boundary for sub-clause HiFi-GAN window streaming, and persists in CacheStorage + IndexedDB with 0 AudioWorklet underruns.N = 480 Utterances; B = 1,000 Bootstrap 95% CIs)
| System | Active Footprint (↓) | Sample Rate | Coverage (↑) | TTFA p50 (ms, ↓) | Mean RTF (↓) | MCD 0–8k (dB, ↓) | Studio 8–12k HF Err (dB, ↓) | Log-F0 RMSE (c, ↓) | Dur MAE (s, ↓) |
|---|---|---|---|---|---|---|---|---|---|
Base facebook/mms-tts-hin (Raw) |
138.8 MB | 16 kHz | 29.4% | 0.9 | 0.029x | 7.98 [7.81, 8.16] |
65.16 [64.53, 65.70] |
1048.31 [1027.26, 1070.91] |
3.49 [3.26, 3.72] |
Meta MMS 11-Model Fleet (11x VITS) |
1526.8 MB | 16 kHz | 100.0% | 204.2 | 0.034x | 5.17 [5.12, 5.22] |
64.97 [64.59, 65.36] |
679.43 [667.31, 692.57] |
1.04 [0.95, 1.12] |
Ninada Tier-2 Zero-Dep Klatt Fallback |
0.0 MB | 24 kHz | 100.0% | 112.8 | 0.0318x | 10.53 [10.43, 10.64] |
42.38 [41.89, 42.84] |
624.08 [612.91, 635.06] |
0.88 [0.81, 0.94] |
Ninada v5.0 Untuned Warm-Start (step=0) |
112.0 MB | 24 kHz | 100.0% | 196.1 | 0.044x | 4.58 [4.54, 4.62] |
10.93 [10.64, 11.20] |
643.79 [633.04, 654.14] |
0.93 [0.87, 1.01] |
Ninada v5.0 Native Studio PyTorch (FP32) |
112.0 MB | 24 kHz | 100.0% | 45.0 | 0.041x | 3.27 [3.24, 3.30] |
6.07 [5.94, 6.21] |
505.60 [495.73, 515.78] |
0.60 [0.55, 0.65] |
Ninada v5.0 Native W8A32+FP16 ONNX (Browser) |
27.9 MB | 24 kHz | 100.0% | 382.4 | 0.202x | 3.27 [3.24, 3.29] |
6.03 [5.90, 6.16] |
506.27 [496.56, 515.54] |
0.60 [0.56, 0.65] |
MCD 0–8 kHz (dB, ↓)
| Language | Ninada v5.0 Browser ONNX (27.9 MB, 24 kHz) |
Meta MMS Reference (138.8 MB, 16 kHz) |
|---|
import ninada from 'ninada';
import { detectDevice } from 'webml-kit';
const { backend } = await detectDevice();
const voice = await ninada('gnumanth/ninada', {
lang: 'en',
voice: 'female',
device: backend,
});
for await (const chunk of voice.stream('Welcome to Ninada, streaming twenty-four kilohertz studio speech in real time.')) {
playPcm24k(chunk.pcm, chunk.sampleRate);
}
from ninada import Ninada
tts = Ninada(lang="mr", voice="female")
for chunk in tts.stream("नमस्कार, निनाद मराठी ध्वनी संश्लेषण प्रणालीमध्ये आपले स्वागत आहे."):
play(chunk["pcm"], chunk["sample_rate"]) # 24,000 Hz float32 PCM