livekit-plugins-openai plugin handles STT and the LLM when you point it at the Venice base URL. For TTS, a short VeniceTTS class calls Venice’s /audio/speech endpoint directly.
Venice fits the STT-LLM-TTS pipeline architecture in LiveKit Agents. Venice does not expose an OpenAI Realtime (speech-to-speech) WebSocket API, so the
RealtimeModel / multimodal path is not available. Use the componentized pipeline shown below — it gives you full control over each model and keeps inference on Venice’s private infrastructure.How Venice maps to LiveKit Agents
Setup
Install the framework and the plugins used below:The OpenAI plugin falls back to
OPENAI_API_KEY when api_key is omitted. Because you are pointing it at Venice, always pass api_key explicitly (or the key would be read from the wrong variable). The examples below read VENICE_API_KEY.Venice TTS class
Don’t use the plugin’sopenai.TTS class with Venice. Current livekit-plugins-openai releases send a stream_format field with every speech request, and Venice’s /audio/speech endpoint rejects it with 400. Instead, save this class as venice_tts.py next to your agent. It calls /audio/speech with only the fields Venice accepts and hands the audio to LiveKit as it arrives.
venice_tts.py
response_format must be a format the model supports. Check model_spec.supported_formats in GET /models?type=tts. Use pcm with tts-kokoro, which LiveKit plays without a decode step. For other models, pass mp3 or wav and LiveKit decodes the audio.
Full Voice Agent
This is a complete voice agent that transcribes with Venice STT, thinks with a Venice LLM, and speaks with Venice TTS through theVeniceTTS class above. Silero provides local voice-activity detection so the batch STT knows when a turn is complete.
agent.py
Configuring Each Component
LLM
The LLM is the cleanest mapping — Venice/chat/completions supports SSE streaming, tool calling, and vision, all of which LiveKit uses directly. venice-uncensored-1-2 keeps inference private and uncensored while feeding the TTS pipeline; reach for a flash-class model only if you need lower time-to-first-token.
extra_body:
Speech-to-Text
LiveKit’s OpenAI STT calls/audio/transcriptions per speech segment, so it needs a VAD (Silero above) to detect when a turn ends. Override the default model with a Venice STT model. nvidia/parakeet-tdt-0.6b-v3 is the smallest/lowest-latency option; stt-xai-v1 and elevenlabs/scribe-v2 are newer alternatives if you want higher accuracy.
Text-to-Speech
VeniceTTS calls /audio/speech. Voices are model-specific in Venice — pass a model/voice pair from the same model. tts-kokoro keeps the voice stage private and uncensored so it can speak the LLM’s output verbatim, and its pcm output avoids an MP3 decode step and shaves a little latency. Faster provider-backed voices (e.g. Gemini) may apply content filtering, so avoid them if you need uncensored speech.
Recommended Models
Model IDs change over time — discover current options at runtime withGET /models?type=... and GET /models/traits rather than hardcoding. For voice agents, prioritize low-latency tiers (models named flash, turbo, mini, or small parameter counts) since perceived responsiveness depends on time-to-first-token and TTS speed. Good starting points from the current catalog:
Browse all models
Filter by text, speech-to-text, and text-to-speech with live pricing and capabilities.
Latency & Production Tips
Voice-agent quality is dominated by turn-taking latency — the time between the user finishing their sentence and the agent starting to speak. With the all-Venice pipeline, budget roughly:
Expect ~0.8–1.5 s to first audio — great for assistant-style, measured turn-taking. For highly interruptible, overlapping conversation you’ll feel the gap versus a native speech-to-speech model.
Reduce latency
- Use
tts-kokorowithresponse_format="pcm", theVeniceTTSdefault, to skip the MP3 decode step. - Tune Silero VAD (
silero.VAD.load(min_silence_duration=0.4)) to shorten endpointing without clipping speech. - Prefer low-latency tiers for STT/TTS (e.g.
tts-kokoroTTS,nvidia/parakeet-tdt-0.6b-v3STT). Keepvenice-uncensored-1-2for the LLM to stay private and uncensored; switch to aflash-class LLM only if you need faster time-to-first-token. - Keep replies concise — the first sentence is what gates perceived responsiveness.
Mixing providers
LiveKit lets you choose each component independently, so you can keep Venice where its privacy and uncensored models matter most and swap in a streaming provider where latency is critical. A common high-interactivity setup keeps the Venice LLM (and optionally STT) and pairs it with a dedicated streaming TTS:Limitations & Notes
- No speech-to-speech / Realtime API. Venice has no OpenAI Realtime WebSocket, so
openai.realtime.RealtimeModeland the multimodal agent path are unavailable. Use the STT-LLM-TTS pipeline shown above. - STT is batch, not streaming. Venice transcription is request/response, so a VAD (Silero) is required for endpointing. This adds a small amount of latency versus a streaming STT socket.
- TTS uses the
VeniceTTSclass, notopenai.TTS. Currentlivekit-plugins-openaireleases sendstream_formaton speech requests, which Venice rejects with 400.VeniceTTSreportsstreaming=False, so LiveKit synthesizes the reply a sentence or so at a time, and it does not use Venice’sstreamingflag. Latency is still fine for most agents; useresponse_format="pcm"to minimize decode overhead. - Match voice to model. TTS
voiceIDs are only valid for their matchingmodel. See Text-to-Speech Models. - Don’t hardcode model lists. Venice model IDs are deprecated and replaced regularly — query
GET /models/GET /models/traitsat runtime. See Deprecations.