livekit-plugins-lokutor, is part of the livekit/agents repository (merged on 2026-11-12 in livekit/agents#7256). It adds two services to an AgentSession:
lokutor.STT: Conv 2.0 speech to text, streaming over/ws/stt.lokutor.TTS: Versa 2.0 text to speech, streaming over/ws/tts.
Installation
The plugin is published to PyPI with the first LiveKit Agents release after 1.8.11. Until that release, install it from GitHub:
GIT_LFS_SKIP_SMUDGE=1 skips the example media files that the LiveKit repository keeps in Git LFS; without it the clone can fail.Authentication
Create an API key in the dashboard and set it asLOKUTOR_API_KEY, or pass api_key= to lokutor.STT and lokutor.TTS.
A voice agent
pip install "livekit-agents[openai,silero]~=1.8" python-dotenv and an OPENAI_API_KEY; any LiveKit LLM plugin works in its place. Run python agent.py console to talk to the agent in your terminal, or python agent.py dev to connect it to a LiveKit server (LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET).
Keep language the same on both services: it chooses how the recogniser writes the text and which native speaker the voice slot uses.
Speech to text
- Streaming: interim transcripts while the user speaks, then a final transcript when the utterance ends, after about 0.7 s without speech (how utterances end). The text comes back written out, with punctuation, casing and digits.
- Audio: frames at any sample rate; the plugin resamples to the 16 kHz the API takes.
- One clip:
await stt.recognize(frames)transcribes a list ofrtc.AudioFramewith onePOST /stt/transcriberequest. - Not exposed: custom vocabulary (
keyterms) and word timings.
Text to speech
- Audio: 16-bit PCM, 44.1 kHz, mono. LiveKit resamples it if the room needs another rate.
- Sentences: the first sentence is sent as soon as the tokenizer completes it, so the agent starts speaking before the LLM has finished the reply.
- Pronunciation: your account’s default pronunciation dictionary applies to every sentence.
- Server defaults:
temperature(0.3) and the other/ws/ttsfields the plugin does not send keep their defaults.
Outside an agent
Inside an agent job, LiveKit supplies the HTTP session. In a script or a test, pass your own:Concurrency and billing
- Two sessions per agent. While an
AgentSessionruns it holds one/ws/sttstream and one/ws/ttssocket, and each counts as one of your account’s concurrent sessions (Limits): 3 before the first top-up, 10 after. An account carries one LiveKit agent at a time before its first top-up and five after; past that, the next connection is refused (429/auth.rate_limited). Higher limits on request. - Billing. The same prices as calling the API directly, from your prepaid balance: speech to text per minute of audio, text to speech per million characters (rate card). The LLM and LiveKit itself are billed by their providers.
When to use Lokutor’s own agent instead
The plugin brings Lokutor’s voices and recognition into a LiveKit pipeline. To run the whole conversation on Lokutor (LLM, turn-taking, tools, phone numbers, call recording), use a Lokutor agent and the Voice Agent API instead.Resources
- Source: https://github.com/livekit/agents/tree/main/livekit-plugins/livekit-plugins-lokutor
- Pull request: https://github.com/livekit/agents/pull/7256
- PyPI: https://pypi.org/project/livekit-plugins-lokutor/ (from the next LiveKit Agents release)
- LiveKit Agents docs: https://docs.livekit.io/agents/