Files

LemonSlice Avatar

A voice agent with a talking-head avatar you can swap mid-conversation. Pick a persona from the dropdown — Leila, Jess, a software engineer, a cat, a fox — and the agent's face, voice, and personality all change without dropping the call.

Try it in the LiveKit Playground.

What's in here

  • 9 personas to choose from — each has its own face, voice, system prompt, and idle/speaking body-language hints.
  • Live persona switching — the dropdown fires a set_avatar RPC; a short hold tone plays while the avatar reconnects with the new face and voice.
  • Hero motions — for Leila, Jess, and Mr Fox, the LLM can trigger wave, dance, or turn via tool calls (one motion at a time, ~6 seconds each). They wave automatically when the session starts.
  • LiveKit Inference for STT + LLM (Deepgram Nova-3 + Gemini 3.5 Flash), Cartesia for TTS, LemonSlice for the avatar video.

Running it locally

You'll need:

  • A LiveKit Cloud project (LIVEKIT_API_KEY, LIVEKIT_API_SECRET, LIVEKIT_URL).
  • A LemonSlice API key — get one from lemonslice.com. Export it as LEMONSLICE_API_KEY.

Then:

pip install -r requirements.txt
python agent.py dev

Connect from any LiveKit client. The agent reads the starting persona from the job metadata; if no metadata is sent it defaults to Leila.

Adding or editing personas

Everything lives in personas.py. Each entry has:

  • image_url — the picture LemonSlice will animate.
  • voice_id — a Cartesia voice id.
  • system_prompt — who the persona is. Keep it tight; the shared COMMON_INSTRUCTIONS block already covers global rules (be brief, no markdown, etc.).
  • speaking_prompt / idle_prompt — short body-language cues sent to LemonSlice (agent_prompt / agent_idle_prompt).

To add a persona, append a new Persona(...) to the PERSONAS dict. The playground UI auto-discovers it once examples/playground.yaml is updated too.

How persona switching works

When the playground dropdown changes, the frontend calls the agent's set_avatar RPC. The agent:

  1. Plays a short hold tone in the background.
  2. Closes the current avatar session.
  3. Opens a fresh one with the new face + body-language prompts.
  4. Swaps the TTS voice + system prompt.
  5. Greets you as the new persona.

No reconnect, no page refresh — the same call, with a different face.

Files

agent.py        entry point + the set_avatar RPC
actions.py      pose controller (opening wave + LLM tool motions)
personas.py     the 9 personas and the shared prompt rules
hold_music.py   the soft three-note "please wait" tone
Dockerfile      for cloud deploys