sarvamai/skills

speech-to-text

>- Write correct Sarvam Saaras STT code for 23 Indic languages — REST modes, Batch API with diarization, and WebSocket streaming gotchas. Use this skill when building transcription or voice apps in Python or JS/TS. For live transcription in chat via MCP, use sarvam-mcp instead.

Hot #1734 First seen Feb 12, 2026

Installation

$ npx skills add sarvamai/skills --skill speech-to-text

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from sarvamai/skills.

npx skills add sarvamai/skills

Browse all from sarvamai/skills

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 71
License LICENSE
Default branch main
Open issues 2
Status Active

Skill metadata

Parsed from SKILL.md frontmatter.

Version3.3
LicenseApache-2.0
More metadata
author
sarvam-ai
version
3.3

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 4,351 B
  • docs SUMMARY.md 299 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 302 installs

SKILL.md

Speech-to-Text — Saaras

Live in-chat transcription → [sarvam-mcp](../sarvam-mcp) (sarvamtoolsstt_*). This skill = SDK code.

[!IMPORTANT]
Auth: api-subscription-key header — NOT Authorization: Bearer. Base URL: https://api.sarvam.ai (NOT /v1 — that prefix is only for the OpenAI-compatible chat endpoint)

Model

saaras:v3 — 23 languages, 5 output modes (transcribe, translate, verbatim, translit, codemix), auto language detection.

Quick Start (Python)

from sarvamai import SarvamAI
client = SarvamAI()

response = client.speech_to_text.transcribe(
    file=open("audio.wav", "rb"),
    model="saaras:v3",
    mode="transcribe"
)
print(response.transcript)

Quick Start (JavaScript/TypeScript)

import { SarvamAIClient } from "sarvamai";
import * as fs from "fs";

const client = new SarvamAIClient({ apiSubscriptionKey: "YOUR_SARVAM_API_KEY" });

const response = await client.speechToText.transcribe({
    file: fs.createReadStream("audio.wav"),
    model: "saaras:v3",
    mode: "transcribe"
});
console.log(response.transcript);

Batch API (Long Audio + Diarization)

job = client.speech_to_text_job.create_job(
    model="saaras:v3",
    mode="transcribe",
    language_code="hi-IN",
    with_diarization=True,
    num_speakers=2
)
job.upload_files(file_paths=["meeting.mp3"])
job.start()
job.wait_until_complete()
job.download_outputs(output_dir="./output")

Supports audio up to 2 hours per file, up to 20 files per job, up to 20 speakers (num_speakers), all 5 output modes.

WebSocket Streaming

import asyncio, base64
from sarvamai import AsyncSarvamAI

async def stream_audio():
    client = AsyncSarvamAI()
    async with client.speech_to_text_streaming.connect(
        model="saaras:v3",
        high_vad_sensitivity=True,
        flush_signal=True
    ) as ws:
        with open("audio.wav", "rb") as f:
            audio_base64 = base64.b64encode(f.read()).decode("utf-8")
        await ws.transcribe(audio=audio_base64, encoding="audio/wav", sample_rate=16000)
        await ws.flush()
        response = await ws.recv()
        print(response)

asyncio.run(stream_audio())

No fixed session duration limit — but the connection closes after 60 seconds of inactivity. Use sample_rate=8000 for telephony audio.

Gotchas

Gotcha Detail
REST: 30s limit Audio >30s fails. Use Batch API or WebSocket for longer files.
JS method name client.speechToText.transcribe({...}) — camelCase, NOT speechtotext. File via fs.createReadStream().
WebSocket codecs Only wav, pcms16le, pcml16, pcm_raw. MP3/AAC/OGG NOT supported for streaming. PCM input is 16kHz only.
WebSocket audio Must be base64-encoded. Use sample_rate=8000 for telephony audio.
WebSocket idle timeout Connection closes after 60s of inactivity. For long-running sessions, send periodic silent (near-zero amplitude) audio chunks as keep-alive.
Flush signal flush_signal=True + await ws.flush() forces immediate transcription boundary.
VAD events vadsignals=True emits STARTSPEECH/ENDSPEECH events alongside transcripts. highvad_sensitivity=True for automatic end-of-speech detection.
Short audio detection Set language_code explicitly for audio <3 seconds — auto-detection needs more signal.

Full Docs

Fetch streaming protocol, batch API SDK examples, and codec details from: