Skip to main content

livekit-plugins-gnani

PyPI License

LiveKit Agents plugin for Gnani — high-accuracy Speech-to-Text (Prisma) and low-latency Text-to-Speech (Timbre) for Indian languages.

Gnani is a production-ready speech AI platform supporting 10+ Indian languages, real-time streaming, and multilingual transcription.

This integration is maintained by Gnani.ai.

Installation

pip install livekit-plugins-gnani

Or with uv:

uv add livekit-plugins-gnani

This will also install the websockets and livekit-agents packages as dependencies.

Install with the LiveKit Agents Gnani extra:

uv add "livekit-agents[gnani]"

Prerequisites

You need a Gnani API key. Gnani APIs have this.

Set your credentials as environment variables:

export GNANI_API_KEY="your-api-key"

Or pass the key in the constructor:

stt = STT(api_key="your-api-key", language="hi-IN")
tts = TTS(api_key="your-api-key")

Environment variables

Variable Purpose
GNANI_API_KEY API key for Gnani Vachana STT and TTS

Quick Start — AgentSession snippet

The snippet below shows core AgentSession wiring with Gnani WebSocket STT/TTS.

from livekit.agents import AgentSession, room_io
from livekit.plugins import gnani, groq, silero

session = AgentSession(
    stt=gnani.STT(
        language="en-IN",
        use_streaming=True,
    ),
    llm=groq.LLM(model="llama-3.1-8b-instant"),
    tts=gnani.TTS(
        voice="Nalini",
        model="timbre-v2.5",
        language="en-IN",
        synthesize_method="websocket",
    ),
    vad=silero.VAD.load(),
)

await session.start(
    agent=MyAgent(),
    room=ctx.room,
    room_options=room_io.RoomOptions(
        audio_input=room_io.AudioInputOptions(sample_rate=16000),
        audio_output=room_io.AudioOutputOptions(sample_rate=16000),
    ),
)

Set use_streaming=False (STT) or swap synthesize_method (TTS) for REST variants — see below. WebSocket STT + TTS is the default for lowest latency.

Service Construction

Speech-to-Text (REST)

from livekit.plugins.gnani import STT

stt = STT(
    language="hi-IN",
    use_streaming=False,
)

REST mode requires a VAD in the pipeline. LiveKit wraps the STT with stt.StreamAdapter automatically when use_streaming=False.

Speech-to-Text (Streaming WebSocket)

from livekit.plugins.gnani import STT

stt = STT(
    language="hi-IN",
    use_streaming=True,
    sample_rate=16000,
)

Text-to-Speech (REST)

from livekit.plugins.gnani import TTS

tts = TTS(
    voice="Pranav",
    model="timbre-v2.0",
    synthesize_method="rest",
)

Text-to-Speech (SSE Streaming)

from livekit.plugins.gnani import TTS

tts = TTS(
    voice="Pranav",
    synthesize_method="sse",
)

Text-to-Speech (WebSocket Streaming)

from livekit.plugins.gnani import TTS

tts = TTS(
    voice="Nalini",
    model="timbre-v2.5",
    language="hi-IN",
    synthesize_method="websocket",
)

The stream() method always uses WebSocket regardless of synthesize_method.

Services

STT

Mode Parameter Transport Description
REST use_streaming=False POST /stt/v3 File/buffer transcription. Requires VAD.
WebSocket use_streaming=True wss://api.vachana.ai/stt/v3/stream Real-time streaming with VAD. Default.

Streaming PCM Specification

All streaming audio must be sent as raw PCM binary frames — no container format (WAV, MP3) mid-stream.

Property 16 kHz 8 kHz
Encoding PCM signed 16-bit little-endian PCM signed 16-bit little-endian
Sample Rate 16,000 Hz 8,000 Hz
Channels 1 (mono) 1 (mono)
Samples per chunk 512 512
Bytes per frame 1,024 bytes (512 samples × 2 bytes) 1,024 bytes (512 samples × 2 bytes)
Frame duration 32 ms 64 ms

Frames must be sent at real-time cadence. See STT Realtime — PCM Specification for full details.

TTS

Mode Parameter Transport Description
REST synthesize_method="rest" POST /api/v1/tts/inference Single-request batch synthesis. Default for synthesize().
SSE synthesize_method="sse" POST /api/v1/tts/sse Chunked synthesis via Server-Sent Events.
WebSocket synthesize_method="websocket" or stream() wss://api.vachana.ai/api/v1/tts Lowest latency; stream() always uses WebSocket.

Full Constructor Reference

STT — All parameters

from livekit.plugins.gnani import STT

stt = STT(
    language="en-IN",              # Default: "en-IN"
    sample_rate=16000,             # Default: 16000 (also: 8000, 44100, 48000)
    format="verbatim",             # Default: "verbatim" (also: "transcribe" for ITN)
    itn_native_numerals=False,     # Default: False
    use_streaming=True,            # Default: True (WebSocket); False = REST + VAD
    api_key=None,                  # Default: None (reads GNANI_API_KEY env var)
    base_url="https://api.vachana.ai",
)

TTS — All parameters

from livekit.plugins.gnani import TTS

tts = TTS(
    voice="Pranav",                # Default: "Pranav" (timbre-v2.0: Kaveri, Shubhra, Deepak)
    model="timbre-v2.0",           # Default: "timbre-v2.0" (also: "timbre-v2.5" with 42 voices)
    language=None,                 # timbre-v2.5 only — e.g. "hi-IN", "en-IN"
    sample_rate=16000,             # Default: 16000 (also: 8000, 22050, 44100)
    encoding="linear_pcm",         # Default: "linear_pcm" (also: "oggopus")
    container="wav",               # Default: "wav" (also: "raw", "mp3", "ogg")
    num_channels=1,                # Default: 1
    bitrate=None,                  # Default: None (also: "96k", "128k", "192k")
    synthesize_method="rest",      # Default: "rest" (also: "sse", "websocket")
    api_key=None,                  # Default: None (reads GNANI_API_KEY env var)
    base_url="https://api.vachana.ai",
)

Supported Languages

STT Languages (Prisma)

STT uses BCP-47 locale codes (e.g. hi-IN, bn-IN).

For the full list of supported languages, see:

TTS Languages (Timbre)

The optional language parameter is supported for timbre-v2.5 only. For the full list, see TTS — Supported Languages.

Migration: The former model name vachana-voice-v3 has been renamed to timbre-v2.0. Update any model="vachana-voice-v3" calls to model="timbre-v2.0" (or omit model to use the default).

Available Voices

See the official voice list for the latest supported voices.

timbre-v2.0 (4 voices)

Voice ID Gender Description
Pranav Pranav Male Bold, Trustworthy
Kaveri Kaveri Female Confident, Bright
Shubhra Shubhra Female Gentle, Expressive
Deepak Deepak Male Grounded, Conversational

timbre-v2.5 (42 voices)

The expanded catalog includes voices across Hindi, English, Tamil, Telugu, Kannada, Malayalam, Marathi, Bengali, Gujarati, Punjabi, and Hinglish. Use model="timbre-v2.5" with an optional language parameter (e.g. language="hi-IN").

from livekit.plugins.gnani import TTS

tts = TTS(model="timbre-v2.5", voice="Nalini", language="hi-IN")

Architecture

livekit-plugins-gnani    ← This package (LiveKit Agents adapter)
  ├── STT: REST + WebSocket
  └── TTS: REST + SSE + WebSocket

This plugin directly implements the Gnani REST and WebSocket APIs using aiohttp (for REST STT/TTS) and websockets (for streaming STT/TTS), adapting them into LiveKit's stt.STT and tts.TTS base classes. It uses the Prisma model for speech-to-text and the Timbre model for text-to-speech. No external SDK is required — all connection logic, authentication, and audio format handling is self-contained. Authentication uses a single api_key passed via the X-API-Key-ID header.

Documentation

LiveKit Compatibility

Tested with LiveKit Agents v1.6.x.

License

Apache 2.0 — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

livekit_plugins_gnani-1.7.0.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

livekit_plugins_gnani-1.7.0-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

Details for the file livekit_plugins_gnani-1.7.0.tar.gz.

File metadata

  • Download URL: livekit_plugins_gnani-1.7.0.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for livekit_plugins_gnani-1.7.0.tar.gz
Algorithm Hash digest
SHA256 efc20d86abcc06568fed322b7f990541de066cf3d287c12ae8b4d8ec4d95a78e
MD5 725fbd62be6f67139bfd0f431650abc7
BLAKE2b-256 584ee00fe2650db50f737787d8fdfa41f8a8c44328b0183359ed7a22e971860b

See more details on using hashes here.

Provenance

The following attestation bundles were made for livekit_plugins_gnani-1.7.0.tar.gz:

Publisher: publish.yml on livekit/agents

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file livekit_plugins_gnani-1.7.0-py3-none-any.whl.

File metadata

File hashes

Hashes for livekit_plugins_gnani-1.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a1f038c294676a7c08d31eb8dd0ee5c80325447a55106d2883eaa2d3348e6b71
MD5 a7f7ec583a25fe32f01e9e9451cc5a69
BLAKE2b-256 5c4f453d20bbbac236ab1478b65baa5d59c7154d8afa0b1711f62b8dc6564aee

See more details on using hashes here.

Provenance

The following attestation bundles were made for livekit_plugins_gnani-1.7.0-py3-none-any.whl:

Publisher: publish.yml on livekit/agents

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.7.0 This release

2 files

1.6.10

2 files

1.6.9

2 files

1.6.8

2 files

1.6.7

2 files

1.6.6

2 files

1.6.5

2 files

1.6.4

2 files

1.6.3

2 files

1.6.2

2 files

1.6.1

2 files

1.6.0

2 files

1.5.18

2 files

1.5.17

2 files

1.5.16

2 files

1.5.15

2 files

1.5.14

2 files

1.5.13

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.5

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page