LiveKit-Integration
LiveKit-Integration
Verbinden Sie einen LiveKit-Raum über einen LiveKit-Agents-Worker mit Speech Engine.
Dieser Leitfaden zeigt, wie Sie ElevenLabs Speech Engine als Sprachschicht für einen LiveKit-Raum verwenden. Ein LiveKit-Agents-Worker tritt dem Raum als Teilnehmer bei, abonniert die Audiospur des Benutzers, öffnet einen WebSocket zu Speech Engine und veröffentlicht die synthetisierten Audiodaten von Speech Engine als eigene Spur zurück im Raum.
Architektur
Speech Engine akzeptiert zwei Arten von WebSocket-Verbindungen:
- Den Brain-WebSocket, mit dem sich die ElevenLabs API verbindet. Ihr Server führt diesen mit dem Speech Engine SDK (
engine.serve()/engine.attach()) aus und erhält Transkripte, auf die er reagieren kann. - Den Konversations-WebSocket, mit dem sich Clients verbinden. Browser verbinden sich über ein WebRTC-Token; Nicht-Browser-Clients (wie ein LiveKit-Agents-Worker) verbinden sich über eine signierte URL und streamen rohe PCM-Audiodaten in beide Richtungen.
Der LiveKit-Worker verwendet die zweite Verbindung. Er fungiert im Namen der Teilnehmer im LiveKit-Raum als „Client“ von Speech Engine.
Der Brain-Server bleibt gegenüber dem Speech Engine Quickstart unverändert – der LiveKit-Worker ersetzt den Browser als Audioquelle, die LLM-Logik bleibt jedoch gleich.
Wann Sie dieses Muster verwenden sollten
Nutzen Sie die LiveKit-Bridge, wenn der Raum selbst Teil der Erfahrung ist:
- Sitzungen mit mehreren Teilnehmern, in denen Benutzer gemeinsam mit dem Agenten sprechen
- Bestehende LiveKit-Deployments, bei denen ein Wechsel des Transports Clients beeinträchtigen würde
- Sprachagenten, die einen Raum mit Bildschirmfreigabe, Video oder Textchat teilen
- Über SIP an LiveKit weitergeleitete Anrufe, die einen KI-Agenten in der Leitung benötigen
Wenn Sie nur eine Browser-zu-Speech-Engine-Sprachschleife ohne weitere Teilnehmer benötigen, ist der WebRTC-Client im Speech Engine Quickstart einfacher – Speech Engine kommuniziert direkt per WebRTC mit dem Browser, ein LiveKit-Raum ist nicht erforderlich.
Voraussetzungen
- Ein LiveKit-Projekt (LiveKit Cloud oder ein selbst gehosteter Server). Der Worker benötigt
LIVEKIT_URL,LIVEKIT_API_KEYundLIVEKIT_API_SECRET. - Eine ElevenLabs Speech Engine. Folgen Sie dem Speech Engine Quickstart, um eine zu erstellen und den Brain-Server auszuführen.
- Python 3.9+ oder Node.js 18+.
Der Node-Bridge-Worker verwendet
@livekit/rtc-node, das sich derzeit in
der Developer Preview befindet. Für Produktions-Deployments sollten Sie den Python-Worker verwenden.
Audioformate für Speech Engine konfigurieren
LiveKits AudioStream passt eingehende Opus-Spuren an jede von Ihnen angeforderte PCM-Abtastrate an. So können Sie sie direkt auf Speech Engine abstimmen. Aktualisieren Sie Speech Engine, um 16-kHz-PCM für ASR-Eingaben zu akzeptieren und 24-kHz-PCM für TTS-Ausgaben zu erzeugen.
Speech-Engine-PCM ist durchgehend vorzeichenbehaftetes 16-Bit-Little-Endian. Weitere unterstützte Abtastraten finden Sie in der Referenz zu Audioformaten.
Bridge-Worker erstellen
Der Worker ist ein lang laufender Prozess, der sich mit Ihrem LiveKit-Server verbindet, auf Aufträge wartet, zugewiesenen Räumen beitritt und Audiodaten zwischen dem Raum und Speech Engine überträgt.
Eine signierte Speech-Engine-URL erstellen
Der Worker fordert eine kurzlebige signierte URL für den Speech-Engine-Konversations-WebSocket an. Die signierte URL enthält die Engine-ID und eine einmalige Signatur. Dadurch kann der Worker den WebSocket öffnen, ohne Ihren API-Schlüssel preiszugeben.
Worker-Einstiegspunkt definieren
Jedes Mal, wenn der Worker in einen Raum weitergeleitet wird, wird sein Einstiegspunkt ausgeführt. Der Einstiegspunkt verbindet sich mit dem Raum, öffnet einen Speech-Engine-Konversations-WebSocket und startet zwei Audio-Bridges: eine für Anrufer-Audio zu Speech Engine und eine für zurückkommendes synthetisiertes Audio.
Der Worker filtert im track_subscribed-Handler sein eigenes veröffentlichtes Audio heraus, indem er es mit der Identität des lokalen Teilnehmers vergleicht. Ohne diese Prüfung würde der Worker versuchen, sein eigenes synthetisiertes Audio zurück an Speech Engine zu senden.
Zwei Details zur Reihenfolge sind für die korrekte Funktion wichtig:
- Zeitpunkt des Listeners:
TrackSubscribedwird vorctx.connect()registriert. LiveKit abonniert vorhandene Spuren während des Verbindungs-Handshakes automatisch. Ein später registrierter Listener kann das Ereignis verpassen. Die Audioübertragung wartet auf einFuture/Promisefür den Speech-Engine-WebSocket, sodass sie sich sofort anmelden und Audio weiterleiten kann, sobald die Verbindung geöffnet ist. - Nur TypeScript – Serialisierung der Aufnahme:
AudioSource.captureFramevon@livekit/rtc-nodelöst bei gleichzeitigen AufrufenInvalidStateaus. Der TypeScript-Handler serialisiert Aufnahmen mit einer Promise-Kette. Die einzelne Python-Schleifeasync for el_to_roomläuft von Natur aus sequenziell und benötigt dies nicht.
Worker an einen Raum weiterleiten
Da der Worker einen agent_name hat, verwendet er eine explizite Weiterleitung – er tritt Räumen nur bei, wenn Ihr Backend ihn dazu auffordert. Das einfachste Muster besteht darin, einen RoomAgentDispatch in das LiveKit-Zugriffstoken aufzunehmen, das der Browser für die Verbindung verwendet.
Wenn ein Browser dieses Token verwendet, um einen Raum zu erstellen oder ihm beizutreten, leitet LiveKit den Bridge-Worker automatisch in denselben Raum weiter.
Verbindung über den Browser herstellen
Der Browser benötigt nur den Standard-LiveKit-Client – er interagiert nicht direkt mit Speech Engine.
Wenn auf die Schaltfläche geklickt wird, ruft der Browser ein LiveKit-Token ab, tritt dem Raum mit aktiviertem Mikrofon bei und beginnt, die Audiospur des Agenten zu empfangen. Der Worker wird weitergeleitet, öffnet seine Speech-Engine-Sitzung und überträgt Audio in beide Richtungen.
Referenz für Audioformate
Speech Engine unterstützt die folgenden Audioformate. Konfigurieren Sie diese in der Engine über asr.user_input_audio_format und tts.agent_output_audio_format.
AudioStream und AudioSource in LiveKit übernehmen das Resampling für Sie — Sie können von AudioStream jede Abtastrate anfordern, und das SDK konvertiert sie aus dem zugrunde liegenden Opus-Track mit 48 kHz.
Hinweise für den Produktionseinsatz
- Explizite Zuweisung: Setzen Sie auf
WorkerOptionsimmeragent_name/agentName. Bei der automatischen Zuweisung wird der Worker für jeden Raum gestartet, der in Ihrem LiveKit-Projekt erstellt wird. Das ist selten erwünscht. - Authentifizierung des Brain-Servers: Legen Sie ein gemeinsames Secret für die Speech Engine fest und prüfen Sie es in Ihrem Brain-Server, damit nur die Speech Engine Ihren Endpunkt erreichen kann:
Der Brain-Server prüft dann
request.headers["x-api-key"], bevor er das WebSocket-Upgrade akzeptiert. - Token-Server: Erstellen Sie LiveKit- und Speech-Engine-Tokens serverseitig. Geben Sie
LIVEKIT_API_SECREToderELEVENLABS_API_KEYniemals im Browser preis. - Saubere Event Loop-Nutzung: Halten Sie CPU-intensive Aufgaben vom Event Loop des Workers fern.
AudioSource.capture_frameund die Iteration vonAudioStreamsind zeitkritisch. Lange synchrone Aufrufe verzögern oder verwerfen Unterbrechungsereignisse. Verwenden Sie für blockierende Aufgabenasyncio.to_thread()(Python) oderworker_threads(Node). - Herunterfahren: Registrieren Sie
ctx.add_shutdown_callback/ctx.addShutdownCallback, um den ElevenLabs-WebSocket sauber zu schließen. Standardmäßig wird der Raum (und der Job) beendet, wenn der letzte Teilnehmer, der kein Agent ist, den Raum verlässt.