Integrations

KugelAudio text to speech for LiveKit Agents

KugelAudio ships an official TTS plugin for LiveKit Agents in Python and TypeScript. Pass it to AgentSession as the tts provider and your agent speaks with a KugelAudio voice.

How it works

What the integration does

  • One warm connection per agent

    The plugin keeps one WebSocket open per agent, so every turn streams over a connection that is already up.

  • Prewarm during call setup

    Call prewarm() while the call connects, and the first response does not wait for the connection.

  • Word timestamps and noise removal

    Optional word timestamps for barge-in and transcript sync, and KugelAudio speech enhancement on the input audio (Python).

Code

A complete voice agent

Install with pip install "kugelaudio[livekit]" or npm install kugelaudio. The worker reads KUGELAUDIO_API_KEY and the LiveKit credentials from the environment.

Python
from livekit.agents import Agent, AgentSession, JobContext
from livekit.agents import WorkerOptions, cli
from livekit.plugins import deepgram, openai, silero
from kugelaudio.livekit import TTS as KugelAudioTTS

async def entrypoint(ctx: JobContext):
    await ctx.connect()

    tts = KugelAudioTTS(model="kugel-3.5", voice_id=1071, language="en")
    tts.prewarm()

    session = AgentSession(
        stt=deepgram.STT(),
        llm=openai.LLM(model="gpt-4o-mini"),
        tts=tts,
        vad=silero.VAD.load(),
    )
    await session.start(
        room=ctx.room,
        agent=Agent(instructions="You are a helpful voice assistant."),
    )
    await session.say("Hello! How can I help you?")

if __name__ == "__main__":
    cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))
TypeScript
import { fileURLToPath } from 'node:url';
import { WorkerOptions, cli, defineAgent, voice } from '@livekit/agents';
import * as deepgram from '@livekit/agents-plugin-deepgram';
import * as openai from '@livekit/agents-plugin-openai';
import * as silero from '@livekit/agents-plugin-silero';
import { TTS as KugelAudioTTS } from 'kugelaudio/livekit';

export default defineAgent({
  entry: async (ctx) => {
    await ctx.connect();

    const tts = new KugelAudioTTS({
      model: 'kugel-3.5',
      voiceId: 1071,
      language: 'en',
    });
    tts.prewarm();

    const session = new voice.AgentSession({
      stt: new deepgram.STT(),
      llm: new openai.LLM({ model: 'gpt-4o-mini' }),
      tts,
      vad: await silero.VAD.load(),
    });
    await session.start({
      agent: new voice.Agent({
        instructions: 'You are a helpful voice assistant.',
      }),
      room: ctx.room,
    });
    await session.say('Hello! How can I help you?');
  },
});

cli.runApp(new WorkerOptions({ agent: fileURLToPath(import.meta.url) }));

Copied from the documentation at docs.kugelaudio.com/integrations/livekit. Read the full guide

Give your agent a KugelAudio voice

Create an account, copy an API key from the dashboard and pick a voice. Every integration on this page runs on the same API.