LiveKit-integratie
Koppel een LiveKit-room aan Speech Engine met een LiveKit Agents-worker.
Deze handleiding laat zien hoe je ElevenLabs Speech Engine gebruikt als spraaklaag voor een LiveKit-room. Een LiveKit Agents-worker neemt als deelnemer deel aan de room, abonneert zich op de audiotrack van de gebruiker, opent een WebSocket naar Speech Engine en publiceert de gesynthetiseerde audio van Speech Engine als eigen track terug naar de room.
Architectuur
Speech Engine accepteert twee soorten WebSocket-verbindingen:
- De brain WebSocket waarmee de ElevenLabs API verbinding maakt. Je server voert deze uit met de Speech Engine SDK (
engine.serve()/engine.attach()) en ontvangt transcripts waarop je kunt reageren. - De conversation WebSocket waarmee clients verbinding maken. Browsers maken verbinding via een WebRTC-token; clients die geen browser zijn (zoals een LiveKit Agents-worker) maken verbinding via een ondertekende URL en streamen onbewerkte PCM-audio in beide richtingen.
De LiveKit-worker gebruikt de tweede verbinding. Deze werkt namens de deelnemers in de LiveKit-room als een “client” van Speech Engine.
De brain-server is ongewijzigd ten opzichte van de snelle start voor Speech Engine — de LiveKit-worker vervangt de browser als audiobron, maar de LLM-logica blijft hetzelfde.
Wanneer je dit patroon gebruikt
Gebruik de LiveKit-bridge wanneer de room zelf onderdeel is van de ervaring:
- Sessies met meerdere deelnemers waarin gebruikers naast elkaar met de agent spreken
- Bestaande LiveKit-implementaties waarbij het wisselen van transport clients zou verstoren
- Spraakagenten die een room delen met schermdeling, video of tekstchat
- Via SIP naar LiveKit doorgestuurde gesprekken die een AI-agent in het gesprek nodig hebben
Als je alleen een spraaklus van browser naar Speech Engine nodig hebt zonder andere deelnemers, is de WebRTC-client in de snelle start voor Speech Engine eenvoudiger — Speech Engine spreekt rechtstreeks WebRTC met de browser, zonder LiveKit-room.
Vereisten
- Een LiveKit-project (LiveKit Cloud of een zelfgehoste server). De worker heeft
LIVEKIT_URL,LIVEKIT_API_KEYenLIVEKIT_API_SECRETnodig. - Een ElevenLabs Speech Engine. Volg de snelle start voor Speech Engine om er een te maken en de brain-server uit te voeren.
- Python 3.9+ of Node.js 18+.
De Node bridge-worker gebruikt
@livekit/rtc-node, dat momenteel in
Developer Preview is. Gebruik voor productie-implementaties bij voorkeur de Python-worker.
Audio-indelingen voor Speech Engine configureren
De AudioStream van LiveKit resampelt binnenkomende Opus-tracks naar elke gewenste PCM-samplerate, zodat je deze rechtstreeks kunt afstemmen op de invoer van Speech Engine. Werk Speech Engine bij om PCM van 16 kHz voor ASR-invoer te accepteren en PCM van 24 kHz voor TTS-uitvoer te leveren.
De PCM van Speech Engine is overal signed 16-bit little-endian. Raadpleeg de referentie voor audio-indelingen voor andere ondersteunde rates.
De bridge-worker bouwen
De worker is een langlopend proces dat verbinding maakt met je LiveKit-server, op taken wacht, toegewezen rooms betreedt en audio overbrugt tussen de room en Speech Engine.
Een ondertekende Speech Engine-URL maken
De worker vraagt een ondertekende URL met een korte geldigheidsduur aan voor de conversation WebSocket van Speech Engine. De ondertekende URL bevat de engine-ID en een eenmalige handtekening, zodat de worker de WebSocket kan openen zonder je API-sleutel bloot te geven.
Het entrypoint van de worker definiëren
Elke keer dat de worker naar een room wordt gestuurd, wordt het entrypoint uitgevoerd. Het entrypoint maakt verbinding met de room, opent een conversation WebSocket van Speech Engine en start twee audio-bridges: één voor audio van de beller naar Speech Engine en één voor gesynthetiseerde audio die terugkomt.
De worker filtert zijn eigen gepubliceerde audio uit in de handler track_subscribed door deze te vergelijken met de identiteit van de lokale deelnemer. Zonder deze controle zou de worker proberen zijn eigen gesynthetiseerde audio terug te sturen naar Speech Engine.
Twee details over de volgorde zijn belangrijk voor de juiste werking:
- Timing van listener:
TrackSubscribedwordt geregistreerd vóórctx.connect(). LiveKit abonneert zich tijdens de verbindingshandshake automatisch op bestaande tracks en een listener die daarna wordt geregistreerd, kan het event missen. De audiopomp wacht op eenFuture/Promisevoor de Speech Engine WebSocket, zodat deze zich onmiddellijk kan abonneren en audio kan doorsturen zodra de verbinding open is. - Alleen TypeScript — serialisatie van capture:
AudioSource.captureFramevan@livekit/rtc-nodegenereertInvalidStatewanneer deze gelijktijdig wordt aangeroepen. De TypeScript-handler serializeert captures met een promise-keten. De enkeleasync for el_to_room-lus van Python is van nature sequentieel en heeft dit niet nodig.
De worker naar een room sturen
Omdat de worker een agent_name heeft, gebruikt deze expliciete dispatch — hij treedt alleen rooms binnen wanneer je backend hem dat opdraagt. Het eenvoudigste patroon is een RoomAgentDispatch op te nemen in het LiveKit-toegangstoken dat de browser gebruikt om verbinding te maken.
Wanneer een browser dit token gebruikt om een room te maken of te betreden, stuurt LiveKit de bridge-worker automatisch naar dezelfde room.
Verbinden vanuit de browser
De browser heeft alleen de standaard LiveKit-client nodig — deze communiceert niet rechtstreeks met Speech Engine.
Wanneer er op de knop wordt geklikt, haalt de browser een LiveKit-token op, treedt de room binnen met de microfoon ingeschakeld en begint de audiotrack van de agent te ontvangen. De worker wordt aangestuurd, opent de Speech Engine-sessie en overbrugt audio in beide richtingen.
Referentie voor audio-indelingen
Speech Engine ondersteunt de volgende audio-indelingen. Configureer ze op de engine via asr.user_input_audio_format en tts.agent_output_audio_format.
AudioStream en AudioSource in LiveKit verwerken resampling voor je — je kunt elke samplerate aanvragen bij AudioStream en de SDK converteert vanuit de onderliggende Opus-track van 48 kHz.
Aandachtspunten voor productie
- Expliciete dispatch: Stel altijd
agent_name/agentNamein opWorkerOptions. Auto-dispatch activeert de worker voor elke room die in je LiveKit-project wordt gemaakt, wat je zelden wilt. - Authenticatie van brain-server: Stel een gedeeld geheim in voor Speech Engine en verifieer dit in je brain-server, zodat alleen Speech Engine je endpoint kan bereiken:
De brain-server controleert vervolgens
request.headers["x-api-key"]voordat de WebSocket-upgrade wordt geaccepteerd. - Tokenserver: Maak LiveKit- en Speech Engine-tokens aan de serverzijde. Geef
LIVEKIT_API_SECRETofELEVENLABS_API_KEYnooit bloot aan de browser. - Eventloophygiëne: Houd CPU-gebonden werk buiten de eventloop van de worker.
AudioSource.capture_frameen iteratie vanAudioStreamzijn tijdgevoelig; lange synchrone aanroepen vertragen of laten onderbrekingsevents wegvallen. Gebruikasyncio.to_thread()(Python) ofworker_threads(Node) voor blokkerend werk. - Afsluiten: Registreer
ctx.add_shutdown_callback/ctx.addShutdownCallbackom de ElevenLabs WebSocket netjes te sluiten. Standaard wordt de room (en de taak) beëindigd wanneer de laatste deelnemer die geen agent is vertrekt.