Sarvam AI has launched Saaras V4, the most recent era of its speech recognition mannequin. It covers all 22 scheduled Indian languages plus English, now together with international English accents. Sarvam stories state-of-the-art accuracy throughout all 22 languages.
Is it deployable? Sure, by means of Sarvam’s API at this time, utilizing mannequin="saaras:v4". Weights aren’t public, and Sarvam’s SageMaker self-hosting docs presently cowl Saaras v3 solely.
What’s Inside Saaras V4
Saaras V4 is an encoder-decoder system. An audio encoder converts the waveform into embeddings that carry phonetic and acoustic element. A temporal-downsampling adapter then shortens that sequence and initiatives it into the language mannequin’s embedding area. This retains lengthy recordings contained in the decoder’s context funds.
The decoder is Sarvam-3B, a 3B-parameter hybrid state-space language mannequin skilled from scratch in-house. It reads the audio options alongside a textual content immediate. It then emits the transcript autoregressively, feeding every token again as enter for the following.
Benchmark Outcomes
- English: Sarvam evaluated 7 English datasets. Six come from Hugging Face’s Open ASR Leaderboard: AMI, GigaSpeech, LibriSpeech clear, LibriSpeech different, SPGISpeech and VoxPopuli. The seventh is AI4Bharat’s Indian-accented Svarah. Scoring follows the leaderboard’s normalization code. Saaras V4 posts the bottom common WER among the many fashions Sarvam benchmarked.
- Indic: On Vistaar, Sarvam stories outcomes throughout 10 Indian languages utilizing each WER and LLM-WER. LLM-WER provides a semantic examine. It separates actual which means errors from innocent spelling or formatting variants frequent in Indic scripts.
- Noisy audio: On Kathbath Noisy, measured with LLM-WER, Sarvam says Saaras V4’s error fee is underneath half that of Deepgram Nova-3 and GPT-4o Transcribe. The set consists of compressed, clipped and background-heavy recordings.
- Language ID: On verified IndicVoices utterances, language identification error is 2.9% throughout the highest 10 Indian languages. It’s 5.22% throughout all 22.
It is very important be aware that all numbers above are vendor-reported. Impartial copy has not been printed but.
5 Output Modes From 1 Mannequin
The identical audio can return 5 representations, chosen by means of the mode parameter:
- transcribe (default): native script with numbers and dates normalized.
- verbatim: each phrase as spoken, fillers and spoken numbers saved.
- codemix: native script, with English phrases left in English.
- translit: the complete utterance in Latin script.
- translate: an English translation with numbers normalized.
Sarvam’s argument is easy. Dealing with these contained in the mannequin removes post-processing steps that may compound errors.
Keyterm Prompting
Keyterm prompting is new in V4 and works solely with saaras:v4. You go a JSON listing underneath keyterms, with as much as 50 phrases of 64 characters every. Keyterms bias recognition; they don’t assure output. Use codemix mode when a model resembling PhonePe should keep in Latin script.
On IndicContextEval (paper, Interspeech 2026), Saaras V4 stories 16.03% WER within the L5 keyword-prompting setting. Sarvam says that’s the lowest rating on the benchmark.
Streaming, Lengthy Audio and Pricing
- Streaming: WebSocket with partial outcomes and time to first token beneath 150 ms.
- REST: synchronous transcription for clips as much as 30 seconds.
- Batch: asynchronous jobs as much as 2 hours per file, with non-obligatory speaker diarization.
- SDKs: Python 3.9+ and Node.js 18+, plus LiveKit Agents, Pipecat and Vercel AI SDK integrations.
- Worth: Sarvam lists speech-to-text at ₹30 per hour for real-time, streaming and batch, and ₹45 per hour with diarization.
Saaras v3 stays the default model. V4 makes use of the identical request form, so switching is a 1-line change.
/* keyterms */
var kws=[“ડ્રોન”,”સર્વે”,”થ્રીડી”,”મોડેલ”,”જનરેટ”,”રીઅલટાઇમ”,”કાઇનેટિક્સ”,”આર ટી કે”,”સ્કેલેબિલિટી”,”મોડ્યુલારિટી”];
kws.forEach(perform(ok){var c=doc.createElement(‘span’);c.className=”chip”;c.textContent=ok;$(‘#chips’).appendChild(c)});
var kon=false;
perform kt(){$(‘#ktsw’).classList.toggle(‘on’,kon);$(‘#ktlab’).textContent=kon?’Keyterms ON (24 phrases handed)’:’Keyterms OFF’;
$$(‘.chip’).forEach(perform(c,i){setTimeout(perform(){c.classList.toggle(‘on’,kon)},kon?i*70:0)});
$(‘#ktout’).innerHTML=kon?’ડ્રોન માટે આંખનું કામ કરે છે અને દરેક વખતે’:’ઢૂન માટે આંખનું કામ કરે છે અને દરેક વખતે’;
$(‘#ktwhy’).innerHTML=kon?’With the area listing provided, the mannequin appropriately writes ડ્રોન (drone). Chips present 10 of the 24 phrases.’:’With out context, the mannequin mishears “drone” as ઢૂન. Uncommon area phrases are the place ASR often slips.’;
$(‘#kb1′).fashion.borderColor=kon?’#7bbf5f’:’#e7a0a0′;setTimeout(resize,60)}
$(‘#ktsw’).onclick=perform(){kon=!kon;kt()};kt();
/* numbers */
var N=[
{v:22,s:””,l:”Indian languages covered”,p:100,i:”All 22 scheduled Indian languages plus English. V4 adds global English accents on top of Indian English.”},
{v:7,s:””,l:”English benchmarks, lowest avg WER”,p:100,i:”AMI, GigaSpeech, LibriSpeech clean, LibriSpeech other, SPGISpeech, VoxPopuli (Open ASR Leaderboard) and Svarah (Indian English).”},
{v:2.9,s:”%”,l:”Language ID error, top 10 languages”,p:29,i:”Measured on verified IndicVoices utterances. Across all 22 languages the error is 5.22%.”},
{v:16.03,s:”%”,l:”WER on IndicContextEval L5″,p:16,i:”Keyword-prompting setting, entity list supplied in native script with the language. Sarvam reports this as the lowest WER on the benchmark (Interspeech 2026).”},
{v:150,s:” ms”,l:”Streaming TTFT, upper bound”,p:75,pre:”‘+(n.pre||”)+’0‘+n.s+’
‘+n.l+’
‘;d.onclick=function(){$$(‘.num’).forEach(function(x){x.classList.remove(‘on’)});d.classList.add(‘on’);$(‘#ninfo’).textContent=n.i};$(‘#nums’).appendChild(d)});
var done=false;
function animNums(){if(done)return;done=true;$$(‘.num’).forEach(function(d,i){var n=N[i],c=d.querySelector(‘.c’),t0=null,dec=(String(n.v).cut up(‘.’)[1]||”).size;
perform f(ts){if(!t0)t0=ts;var ok=Math.min((ts-t0)/1100,1),e=1-Math.pow(1-k,3);c.textContent=(n.v*e).toFixed(dec);if(ok# pip set up sarvamainfrom sarvamai import SarvamAInclient = SarvamAI(api_subscription_key=“YOUR_KEY”)nnresp = shopper.speech_to_text.transcribe(n file=open(“audio.wav”, “rb”),n mannequin=“saaras:v4”,n mode=“transcribe”,n keyterms=[“Sarvam”, “New Delhi”],n)nprint(resp.transcript)’},
{t:”Long recordings”,s:”Calls, meetings, podcasts”,f:[“Batch API”,”Up to 2 hr per file”,”Diarization option”,”₹45/hr with diarization”],c:’job = shopper.speech_to_text_job.create_job(n mannequin=“saaras:v4”,n mode=“transcribe”,n language_code=“hi-IN”,n with_diarization=True,n keyterms=[“Sarvam”, “Vistaar”],n)njob.upload_files(file_paths=[“interview.wav”])njob.begin()njob.wait_until_complete()njob.download_outputs(output_dir=“./output”)’},
{t:”Voice agents”,s:”Live, low latency”,f:[“WebSocket”,”TTFT under 150 ms”,”LiveKit / Pipecat”,”Keyterms via URL param”],c:’# keyterms go within the connection URL (SDK join() doesn’t expose them but)nparams = urllib.parse.urlencode({n “model”: “saaras:v4”,n “language_code”: “hi-IN”,n “keyterms”: json.dumps([“Sarvam”, “New Delhi”]),n})nurl = f”wss://api.sarvam.ai/speech-to-text/ws?{params}”‘}];
perform dep(i){$$(‘.q’).forEach(perform(q,ok){q.classList.toggle(‘on’,ok===i)});$(‘#information’).innerHTML=D[i].f.map(perform(x){return ‘‘+x+’‘}).be part of(”)+’₹30/hr base‘;$(‘#code’).innerHTML=D[i].c;setTimeout(resize,60)}
D.forEach(perform(d,i){var b=doc.createElement(‘button’);b.className=”q”;b.innerHTML=’‘+d.t+’‘+d.s+’‘;b.onclick=perform(){dep(i)};$(‘#qs’).appendChild(b)});
dep(0);
window.addEventListener(‘load’,resize);window.addEventListener(‘resize’,resize);setTimeout(resize,300);
})();

