File size: 6,032 Bytes
2f7fd48 33d4a47 2f7fd48 f1f3958 2f7fd48 1107ab3 2f7fd48 1107ab3 33d4a47 2f7fd48 33d4a47 2f7fd48 33d4a47 2f7fd48 d11b342 1107ab3 33d4a47 2f7fd48 33d4a47 2f7fd48 d11b342 2f7fd48 d11b342 33d4a47 2f7fd48 d11b342 2f7fd48 1107ab3 33d4a47 2f7fd48 d11b342 33d4a47 1107ab3 2f7fd48 1107ab3 33d4a47 2f7fd48 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | ---
language:
- sa
- hi
- kn
- ta
- te
- ml
license: mit
library_name: onnx
pipeline_tag: text-to-speech
datasets:
- ai4bharat/Rasa
tags:
- text-to-speech
- streaming-tts
- ninada
- sanskrit
- vedic
- indic
- kannada
- tamil
- telugu
- malayalam
- vits
- hifi-gan
- onnxruntime-web
- wasm
---
# `Ninada` (निनाद) v4.0 — 24,000 Hz Native Per-Language Studio VITS Specialists
`Ninada` (*Nināda* — Sanskrit `निनाद`, deep resonant sound) v4.0 is a **24,000 Hz Native Per-Language Studio Neural TTS** suite (**`~27.9 MB` active W8A32+FP16 ONNX per language, `372.7 ms` native CPU median TTFA, `0.197x` RTF**) with **6 dedicated Studio Male + 6 dedicated Studio Female specialists** (`Sanskrit [sa]`, `Kannada [kn]`, `Hindi [hi]`, `Tamil [ta]`, `Telugu [te]`, `Malayalam [ml]`) trained end-to-end on each language's own native single-speaker `24,000 Hz` studio recordings (`ai4bharat/Rasa`) and native Unicode script tokens.
- **Live Off-Main-Thread Browser `AudioWorklet` Studio**: [https://hemanth.github.io/ninada/](https://hemanth.github.io/ninada/)
- **GitHub Repository & Streaming SDKs (JS + Python)**: [https://github.com/hemanth/ninada](https://github.com/hemanth/ninada)
- **Curated 24 kHz Studio Split Manifests**: [https://huggingface.co/datasets/gnumanth/ninada-sanskrit-indic](https://huggingface.co/datasets/gnumanth/ninada-sanskrit-indic)
## Architecture & Native Dataset-Matched Training
- **Zero Cross-Language Accent Bleed**: Every language (`sa`, `kn`, `hi`, `ta`, `te`, `ml`) has its own dedicated `24,000 Hz` `StudioVitsModel` (`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 `ai4bharat/Rasa` single-speaker `24 kHz` studio recordings (`13700` total studio training clips across Male & Female speakers).
- **100% Native Script Orthography (`vocabs.json`)**:
- `kn`: Native Kannada script (`85` tokens) trained on `ai4bharat/Rasa` Kannada (`SYSPIN/vits_Kannada_{Male,Female}` frozen 500k-step `TextEncoder` + `24 kHz` studio vocoder adaptation).
- `sa`: Classical Sanskrit Devanagari (`144` tokens including `ऋ`, `ॠ`, `ऌ`, `ळ`, `ऽ`, `ः`, `।`, `॥`, `ॐ`) trained exclusively on `ai4bharat/Rasa` Sanskrit (`SYSPIN/vits_Marathi_{Male,Female}` warm-start — zero Hindi dataset or Hindi voice sharing).
- `te`: Native Telugu script (`110` tokens) trained on `ai4bharat/Rasa` Telugu (`SYSPIN/vits_Telugu_{Male,Female}` warm-start).
- `hi`: Native Hindi Devanagari (`120` tokens) trained on `ai4bharat/Rasa` Hindi (`SYSPIN/vits_Hindi_{Male,Female}` warm-start).
- `ta`: Native Tamil script (`61` tokens including `ழ`, `ற`, `ன`) trained on `ai4bharat/Rasa` Tamil (`SYSPIN/vits_Kannada_{Male,Female}` Brahmic `+0x0100` embedding isomorphism).
- `ml`: Native Malayalam script (`101` tokens including atomic chillus `ൺ ൻ ർ ൽ ൾ ൿ`) trained on `ai4bharat/Rasa` Malayalam (`SYSPIN/vits_Kannada_{Male,Female}` Brahmic `-0x0080` embedding isomorphism).
- **`~27.9 MB` Browser W8A32+FP16 ONNX + Offline `CacheStorage`**: Each exported `onnx/{sa,kn,hi,ta,te,ml}.onnx` and `onnx/{sa,kn,hi,ta,te,ml}_female.onnx` is `~27.9 MB` (`0.61 dB` deterministic MCD parity vs PyTorch FP32), persisted in `CacheStorage` + `IndexedDB` (`0` network refetches on reload or tab revisit) and streamed via `24 kHz` `AudioWorklet` ring buffer with `0` underruns.
## Held-Out 24 kHz Studio Test Leaderboard (`N = 240` 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 | 35.0% | 1.0 | 0.030x | `7.97 [7.69, 8.24]` | `66.24 [65.48, 66.95]` | `1018.47 [987.17, 1050.48]` | `3.21 [2.89, 3.54]` |
| Meta MMS 5-Specialist Fleet (`5x` VITS) | 694.0 MB | 16 kHz | 100.0% | 60.2 | 0.024x | `5.09 [5.03, 5.15]` | `65.90 [65.49, 66.33]` | `676.29 [661.53, 690.29]` | `1.34 [1.21, 1.48]` |
| `Ninada` Tier-2 Zero-Dep Klatt Fallback | 0.0 MB | 24 kHz | 100.0% | 104.0 | 0.0305x | `10.38 [10.26, 10.50]` | `41.94 [41.27, 42.56]` | `613.77 [597.33, 630.07]` | `0.98 [0.88, 1.08]` |
| `Ninada` v4.0 Untuned Warm-Start (`step=0`) | 112.0 MB | 24 kHz | 100.0% | 189.2 | 0.047x | `4.60 [4.54, 4.65]` | `11.01 [10.68, 11.35]` | `639.61 [626.39, 653.49]` | `0.95 [0.86, 1.04]` |
| **`Ninada` v4.0 Native Studio PyTorch (FP32)** | 112.0 MB | **24 kHz** | **100.0%** | **45.3** | **0.040x** | **`3.40 [3.37, 3.43]`** | **`6.34 [6.16, 6.52]`** | **`529.20 [514.68, 542.48]`** | **`0.57 [0.50, 0.63]`** |
| **`Ninada` v4.0 Native W8A32+FP16 ONNX (Browser)** | **27.9 MB** | **24 kHz** | **100.0%** | **372.7** | **0.197x** | **`3.39 [3.36, 3.43]`** | **`6.37 [6.19, 6.57]`** | **`530.38 [517.00, 543.32]`** | **`0.56 [0.50, 0.62]`** |
## 24 kHz Streaming Quickstart
```js
import ninada from 'ninada';
const voice = await ninada('kannada', {
models: {
kn: 'https://huggingface.co/gnumanth/ninada/resolve/main/onnx/kn.onnx',
sa: 'https://huggingface.co/gnumanth/ninada/resolve/main/onnx/sa.onnx',
},
});
for await (const chunk of voice.stream('ನಮಸ್ಕಾರ, ಇಂದು ಬೆಂಗಳೂರಿನಲ್ಲಿ ಹವಾಮಾನ ತುಂಬಾ ಚೆನ್ನಾಗಿದೆ.')) {
playPcm24k(chunk.pcm, chunk.sampleRate); // 24,000 Hz native Kannada studio stream!
}
```
```python
from ninada import Ninada
tts = Ninada(lang="sa")
for chunk in tts.stream("प्रज्ञापूर्वकव्यापारवत्त्वं जीवत्वम् । यथार्थज्ञानं प्रमाणम् ॥"):
play(chunk["pcm"], chunk["sample_rate"]) # 24,000 Hz float32 native Sanskrit PCM
```
|