Svara TTS v1 is a 3.3B-parameter autoregressive text-to-speech model built on the LLaMA architecture, fine-tuned to generate natural-sounding speech across
19 Indic languages and
Indian English . It uses the
SNAC neural audio codec with 7-band interleaved codes to produce high-fidelity 24 kHz audio.
1 from optimum . intel import OVModelForCausalLM
2 from transformers import AutoTokenizer
3
4 model_id = "kenpath/svara-tts-v1-openvino-int4"
5
6 # Load model -- choose your Intel device
7 model = OVModelForCausalLM . from_pretrained ( model_id , device = "CPU" ) # or "GPU", "NPU"
8 tokenizer = AutoTokenizer . from_pretrained ( model_id )
1 import torch
2 import numpy as np
3 import soundfile as sf
4 from snac import SNAC
5
6 # ── Special tokens ──
7 BOS_TOKEN = 128000
8 END_OF_TURN = 128009
9 START_OF_SPEECH = 128257
10 END_OF_SPEECH = 128258
11 START_OF_HUMAN = 128259
12 END_OF_HUMAN = 128260
13 START_OF_AI = 128261
14 AUDIO_TOKEN = 156939
15 AUDIO_TOKENS_START = 128266
16 BAND_OFFSETS = [ 128266 , 132362 , 136458 , 140554 , 144650 , 148746 , 152842 ]
17
18 # ── Build input ──
19 speaker = "hi_female" # format: {lang_code}_{male|female}
20 text = "नमस्ते, आज का मौसम बहुत अच्छा है।"
21
22 prompt_text = f" { speaker } : { text } "
23 text_ids = tokenizer . encode ( prompt_text , add_special_tokens = False )
24 input_ids = torch . tensor ( [ [
25 BOS_TOKEN , START_OF_HUMAN , AUDIO_TOKEN ,
26 * text_ids ,
27 END_OF_HUMAN , END_OF_TURN , START_OF_AI , START_OF_SPEECH
28 ] ] )
29
30 # ── Generate audio tokens ──
31 output = model . generate (
32 input_ids = input_ids ,
33 max_new_tokens = 4096 ,
34 do_sample = True ,
35 temperature = 0.7 ,
36 top_p = 0.95 ,
37 repetition_penalty = 1.1 ,
38 )
39
40 # ── Decode with SNAC ──
41 generated = output [ 0 ] [ input_ids . shape [ 1 ] : ]
42 audio_tokens = [ t . item ( ) for t in generated if t . item ( ) >= AUDIO_TOKENS_START ]
43 audio_tokens = audio_tokens [ : len ( audio_tokens ) // 7 * 7 ] # align to 7-band frames
44
45 codes_0 , codes_1 , codes_2 = [ ] , [ ] , [ ]
46 for i in range ( 0 , len ( audio_tokens ) , 7 ) :
47 frame = audio_tokens [ i : i + 7 ]
48 codes_0 . append ( frame [ 0 ] - BAND_OFFSETS [ 0 ] )
49 codes_1 . extend ( [ frame [ 1 ] - BAND_OFFSETS [ 1 ] , frame [ 4 ] - BAND_OFFSETS [ 4 ] ] )
50 codes_2 . extend ( [
51 frame [ 2 ] - BAND_OFFSETS [ 2 ] , frame [ 3 ] - BAND_OFFSETS [ 3 ] ,
52 frame [ 5 ] - BAND_OFFSETS [ 5 ] , frame [ 6 ] - BAND_OFFSETS [ 6 ] ,
53 ] )
54
55 snac = SNAC . from_pretrained ( "hubertsiuzdak/snac_24khz" ) . eval ( )
56 with torch . no_grad ( ) :
57 audio = snac . decode ( torch . tensor ( [ codes_0 , codes_1 , codes_2 ] ) )
58 audio_np = audio . squeeze ( ) . cpu ( ) . numpy ( )
59
60 sf . write ( "output.wav" , audio_np , 24000 )
61 print ( f"Saved output.wav ( { len ( audio_np ) / 24000 : .1f } s)" )
hi_female # Hindi female
ta_male # Tamil male
en_female # Indian English female
bn_male # Bengali male
LlamaForCausalLM (Modified for TTS)
├── Embedding: 156,940 tokens (text + 28,674 audio tokens)
├── 28 x Transformer Blocks
│ ├── Grouped-Query Attention (24 heads, 8 KV heads, dim 128)
│ ├── RMSNorm (eps=1e-5)
│ └── SwiGLU MLP (3072 → 8192 → 3072)
├── RoPE (LLaMA3-style, θ=500K, 128K context)
└── Tied LM Head → 156,940 logits
↓
SNAC Decoder (24 kHz, 7-band, 4096 codebook)
↓
Waveform
1 @misc{svara-tts-v1-openvino-int4,
2 title = {Svara TTS v1 -- OpenVINO INT4},
3 author = {kenpath},
4 year = {2026},
5 url = {https://huggingface.co/kenpath/svara-tts-v1-openvino-int4},
6 note = {INT4 quantized OpenVINO conversion of kenpath/svara-tts-v1}
7 }