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 Dieser Service mountet drei zusätzliche Pfade im Vergleich zu
livekit-agent-2 mit Docker Compose: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, dasAvatarSession erwartet. Verwende diese Werte exakt, wenn du deinen eigenen Sender baust:
Token-Anforderungen
Der Sender-Teilnehmer musswith_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.