ninada 4.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ninada/__init__.py ADDED
@@ -0,0 +1,76 @@
1
+ """ninada (निनाद): Streaming Pan-Indic & Classical Sanskrit Neural Text-to-Speech."""
2
+ from .engine import (
3
+ HOP_LENGTH,
4
+ SAMPLE_RATE,
5
+ Ninada,
6
+ encode_wav_bytes,
7
+ speak,
8
+ split_prosodic_clauses,
9
+ stream,
10
+ synthesize_klatt_pcm,
11
+ )
12
+ from .g2p import (
13
+ BLANK_ID,
14
+ ID_TO_LANGUAGE,
15
+ ID_TO_TOKEN,
16
+ IPA_ID_TO_TOKEN,
17
+ IPA_VOCAB,
18
+ LANGUAGE_IDS,
19
+ RETROFLEX_LATERAL_ID,
20
+ TOKEN_TO_ID,
21
+ UNK_ID,
22
+ VOCAB_TOKENS,
23
+ WARMSTART_DONOR_MAP,
24
+ apply_phonological_rules,
25
+ brahmic_to_devanagari,
26
+ detect_script_and_lang,
27
+ iast_to_devanagari,
28
+ ipa_to_ids,
29
+ segment_aksharas,
30
+ text_to_ids,
31
+ text_to_ipa,
32
+ )
33
+
34
+ from .studio_g2p import (
35
+ STUDIO_HOP_LENGTH,
36
+ STUDIO_VOCABS,
37
+ clean_studio_text,
38
+ studio_text_to_ids,
39
+ )
40
+
41
+ __version__ = "4.0.0"
42
+
43
+ __all__ = [
44
+ "__version__",
45
+ "SAMPLE_RATE",
46
+ "HOP_LENGTH",
47
+ "STUDIO_HOP_LENGTH",
48
+ "STUDIO_VOCABS",
49
+ "clean_studio_text",
50
+ "studio_text_to_ids",
51
+ "Ninada",
52
+ "speak",
53
+ "stream",
54
+ "split_prosodic_clauses",
55
+ "encode_wav_bytes",
56
+ "synthesize_klatt_pcm",
57
+ "VOCAB_TOKENS",
58
+ "TOKEN_TO_ID",
59
+ "ID_TO_TOKEN",
60
+ "IPA_VOCAB",
61
+ "IPA_ID_TO_TOKEN",
62
+ "RETROFLEX_LATERAL_ID",
63
+ "BLANK_ID",
64
+ "UNK_ID",
65
+ "LANGUAGE_IDS",
66
+ "ID_TO_LANGUAGE",
67
+ "WARMSTART_DONOR_MAP",
68
+ "detect_script_and_lang",
69
+ "iast_to_devanagari",
70
+ "brahmic_to_devanagari",
71
+ "apply_phonological_rules",
72
+ "segment_aksharas",
73
+ "text_to_ipa",
74
+ "ipa_to_ids",
75
+ "text_to_ids",
76
+ ]
ninada/cli.py ADDED
@@ -0,0 +1,43 @@
1
+ """Command-line interface for Ninada (Pan-Indic & Classical Sanskrit TTS)."""
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ import json
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ from .engine import SAMPLE_RATE, Ninada
10
+
11
+
12
+ def main() -> None:
13
+ parser = argparse.ArgumentParser(
14
+ prog="ninada",
15
+ description="Ninada — Pan-Indic & Classical Sanskrit Neural TTS (24 kHz Studio WAV)",
16
+ )
17
+ parser.add_argument("text", nargs="?", help="Input text in Devanagari, Kannada, Tamil, Telugu, Malayalam, or IAST")
18
+ parser.add_argument("-l", "--lang", default=None, help="Language code: sa | hi | kn | ta | te | ml")
19
+ parser.add_argument("-o", "--output", type=Path, default=Path("ninada_out.wav"), help="Output WAV file path")
20
+ parser.add_argument("-r", "--rate", type=float, default=1.0, help="Speaking rate multiplier (default: 1.0)")
21
+ parser.add_argument("--tier", choices=["auto", "neural", "klatt"], default="auto", help="Synthesis engine tier")
22
+ parser.add_argument("--inspect", action="store_true", help="Print Pan-Indic G2P & akshara prosody JSON")
23
+ args = parser.parse_args()
24
+
25
+ txt = args.text if args.text else sys.stdin.read().strip()
26
+ if not txt:
27
+ parser.error("Provide input text as an argument or via stdin.")
28
+
29
+ engine = Ninada(lang=args.lang or "sa")
30
+ pcm, meta = engine.synthesize(txt, lang=args.lang, rate=args.rate, tier=args.tier)
31
+ if args.inspect:
32
+ print(json.dumps({k: v for k, v in meta.items() if k != "durations"}, ensure_ascii=False, indent=2))
33
+ return
34
+
35
+ from .engine import encode_wav_bytes
36
+
37
+ wav = encode_wav_bytes(pcm, sr=SAMPLE_RATE)
38
+ args.output.write_bytes(wav)
39
+ print(f"Wrote {len(wav)} bytes ({len(pcm)/float(SAMPLE_RATE):.2f}s, tier={meta['tier']}, lang={meta['lang']}) -> {args.output}")
40
+
41
+
42
+ if __name__ == "__main__":
43
+ main()