Skip to main content
agent-2 zeigt, wie du einen Avaluma-Avatar aus einer externen Audioquelle steuerst und dabei die LiveKit-Agents-Sprach-Pipeline vollständig umgehst. Statt durch STT, LLM und TTS zu leiten, verbindest du dich als unabhängiger Teilnehmer mit dem LiveKit-Raum und streamst rohe PCM-Audio-Bytes direkt über das DataStream-Topic lk.audio_stream an den Avatar. Dieses Muster gibt dir volle Kontrolle über den Audioinhalt — nutze deinen eigenen TTS-Dienst, spiele vorab aufgenommene Dateien ab oder leite eine beliebige Audioquelle ein.

Wann dieses Muster verwenden

Nutze das Muster für externes Audio, wenn:
  • Du einen bestehenden TTS- oder Audio-Generierungsdienst behalten möchtest
  • Du vorab aufgenommene Audiosegmente über den Avatar abspielen musst
  • Du den Avatar unabhängig von einer AgentSession-Pipeline steuern willst
  • Du Avaluma in ein System integrierst, das sein eigenes Audio-Routing verwaltet

Pipeline

Setup

1

Avatar-ID setzen

Öffne agents/2-agent-with-external-audio/agent-2.py und setze avatar_id auf den Namen deiner .hvia-Datei ohne Endung:
agent-2.py
2

Agent starten

Starte livekit-agent-2 mit Docker Compose:
Dieser Service mountet drei zusätzliche Pfade im Vergleich zu livekit-agent-1: das Agent-Skript, das externe Sender-Modul und das assets/-Verzeichnis mit Beispiel-WAV-Dateien.

Agent-Code

agent-2.py richtet AvatarSession und AgentSession ein und startet dann den externen Audio-Sender als asyncio-Task für die lokale Simulation:
agent-2.py

Externer Audio-Sender

external_audio_sender.py ist das Herzstück des Musters. Er verbindet sich als unabhängiger Teilnehmer mit dem LiveKit-Raum und streamt alle paar Sekunden eine WAV-Datei per DataStream an den Avatar:
external_audio_sender.py

DataStream-Audio-Protokoll

Der externe Sender kommuniziert mit dem Avatar über LiveKit-DataStream nach dem Protokoll, das AvatarSession erwartet. Verwende diese Werte exakt, wenn du deinen eigenen Sender baust:

Token-Anforderungen

Der Sender-Teilnehmer muss with_kind("agent") beim Erstellen seines LiveKit-Access-Tokens verwenden. Der Avatar akzeptiert nur Audio-Streams von Teilnehmern mit Agent-Art — Streams von anderen Teilnehmertypen werden ignoriert.

Auf den Avatar-Teilnehmer warten

Vor dem Streamen musst du die Teilnehmer-Identität des Avatars auflösen. Der Helfer _wait_for_avatar() deckt beide Fälle ab — der Avatar ist bereits beigetreten oder tritt erst bei, nachdem dein Sender verbunden hat:
Im agent-2-Beispiel wird external_audio_sender.run() der Einfachheit halber während der lokalen Entwicklung als asyncio-Task innerhalb des Agent-Prozesses gestartet. In der Produktion betreibst du den externen Sender als völlig separaten Dienst mit eigenem LiveKit-Token — er benötigt keinen Zugriff auf den Agent-Prozess oder die AgentSession. Er braucht nur den Raumnamen und gültige LiveKit-Zugangsdaten.