LiveKit-integration
Koppla ett LiveKit-rum till Speech Engine med en LiveKit Agents-arbetare.
Den här guiden visar hur du använder ElevenLabs Speech Engine som röstlager för ett LiveKit-rum. En LiveKit Agents-arbetare ansluter till rummet som deltagare, prenumererar på användarens ljudspår, öppnar en WebSocket till Speech Engine och publicerar Speech Engines syntetiserade ljud tillbaka till rummet som ett eget spår.
Arkitektur
Speech Engine accepterar två typer av WebSocket-anslutningar:
- Brain WebSocket som ElevenLabs API ansluter till. Din server kör detta med Speech Engine SDK (
engine.serve()/engine.attach()) och tar emot transkriptioner att svara på. - Conversation WebSocket som klienter ansluter till. Webbläsare ansluter via en WebRTC-token; klienter som inte är webbläsare (till exempel en LiveKit Agents-arbetare) ansluter via en signerad URL och strömmar rått PCM-ljud i båda riktningarna.
LiveKit-arbetaren använder den andra anslutningen. Den fungerar som en “klient” till Speech Engine för deltagarna i LiveKit-rummet.
Brain-servern är oförändrad från snabbstarten för Speech Engine — LiveKit-arbetaren ersätter webbläsaren som ljudkälla, men LLM-logiken är densamma.
När du ska använda det här mönstret
Använd LiveKit-bryggan när själva rummet är en del av upplevelsen:
- Sessioner med flera deltagare där användare talar med agenten tillsammans
- Befintliga LiveKit-distributioner där ett byte av transport skulle störa klienter
- Röstagenter som delar rum med skärmdelning, video eller textchatt
- SIP-till-LiveKit-dirigerade samtal som behöver en AI-agent i samtalet
Om du bara behöver en röstloop från webbläsare till Speech Engine utan andra deltagare är WebRTC-klienten i snabbstarten för Speech Engine enklare — Speech Engine kommunicerar direkt med webbläsaren via WebRTC och inget LiveKit-rum behövs.
Förutsättningar
- Ett LiveKit-projekt (antingen LiveKit Cloud eller en server som du hostar själv). Arbetaren behöver
LIVEKIT_URL,LIVEKIT_API_KEYochLIVEKIT_API_SECRET. - En ElevenLabs Speech Engine. Följ snabbstarten för Speech Engine för att skapa en och köra brain-servern.
- Python 3.9+ eller Node.js 18+.
Node-bryggarbetaren använder
@livekit/rtc-node, som för närvarande är i
Developer Preview. För produktionsdistributioner rekommenderar vi Python-arbetaren.
Konfigurera ljudformat för Speech Engine
LiveKits AudioStream omsamplar inkommande Opus-spår till den PCM-samplingsfrekvens du begär, så du kan matcha Speech Engines indata direkt. Uppdatera Speech Engine så att den accepterar 16 kHz PCM för ASR-indata och skickar ut 24 kHz PCM för TTS-utdata.
PCM i Speech Engine är genomgående signerad 16-bitars little-endian. Se referensen för ljudformat för andra samplingsfrekvenser som stöds.
Bygg bryggarbetaren
Arbetaren är en långvarig process som ansluter till din LiveKit-server, väntar på jobb, ansluter till tilldelade rum och bryggar ljud mellan rummet och Speech Engine.
Skapa en signerad URL för Speech Engine
Arbetaren begär en kortlivad signerad URL för Speech Engines Conversation WebSocket. Den signerade URL:en innehåller engine-ID:t och en engångssignatur, så att arbetaren kan öppna WebSocket-anslutningen utan att exponera din API-nyckel.
Definiera arbetarens startpunkt
Varje gång arbetaren skickas till ett rum körs dess startpunkt. Startpunkten ansluter till rummet, öppnar en Conversation WebSocket för Speech Engine och startar två ljudbryggor: en för samtalsljud som går till Speech Engine och en för syntetiserat ljud som kommer tillbaka.
Arbetaren filtrerar bort sitt eget publicerade ljud i hanteraren track_subscribed genom att jämföra med den lokala deltagarens identitet. Utan denna kontroll skulle arbetaren försöka skicka sitt eget syntetiserade ljud tillbaka till Speech Engine.
Två detaljer kring ordningen är viktiga för korrekt funktion:
- Tidpunkt för lyssnaren:
TrackSubscribedregistreras förectx.connect(). LiveKit prenumererar automatiskt på befintliga spår under anslutningshandskakningen, och en lyssnare som registreras senare kan missa händelsen. Ljudpumpen väntar på ettFuture/Promiseför Speech Engine WebSocket så att den kan prenumerera direkt och vidarebefordra ljud så snart anslutningen är öppen. - Endast TypeScript — serialisering av inspelning:
AudioSource.captureFramei@livekit/rtc-nodekastarInvalidStateom det anropas samtidigt. TypeScript-hanteraren serialiserar inspelningar med en promise-kedja. Pythons endaasync for el_to_room-loop är naturligt sekventiell och behöver inte detta.
Skicka arbetaren till ett rum
Eftersom arbetaren har ett agent_name använder den explicit dirigering — den ansluter bara till rum när din backend säger åt den att göra det. Det enklaste mönstret är att inkludera en RoomAgentDispatch i LiveKit-åtkomsttoken som webbläsaren använder för att ansluta.
När en webbläsare använder denna token för att skapa eller ansluta till ett rum skickar LiveKit automatiskt bryggarbetaren till samma rum.
Anslut från webbläsaren
Webbläsaren behöver bara standardklienten för LiveKit — den interagerar inte direkt med Speech Engine.
När knappen klickas hämtar webbläsaren en LiveKit-token, ansluter till rummet med mikrofonen aktiverad och börjar ta emot agentens ljudspår. Arbetaren skickas dit, öppnar sin Speech Engine-session och bryggar ljud i båda riktningarna.
Referens för ljudformat
Speech Engine har stöd för följande ljudformat. Konfigurera dem på motorn via asr.user_input_audio_format och tts.agent_output_audio_format.
AudioStream och AudioSource i LiveKit hanterar omsampling åt dig — du kan begära vilken samplingsfrekvens som helst från AudioStream och SDK:n konverterar från det underliggande Opus-spåret på 48 kHz.
Att tänka på i produktion
- Explicit dirigering: Ange alltid
agent_name/agentNameiWorkerOptions. Automatisk dirigering aktiverar arbetaren för varje rum som skapas i ditt LiveKit-projekt, vilket sällan är vad du vill. - Autentisering av brain-servern: Ange en delad hemlighet i Speech Engine och verifiera den i din brain-server, så att endast Speech Engine kan nå din slutpunkt:
Brain-servern kontrollerar sedan
request.headers["x-api-key"]innan den accepterar WebSocket-uppgraderingen. - Tokenserver: Skapa LiveKit- och Speech Engine-token på serversidan. Exponera aldrig
LIVEKIT_API_SECRETellerELEVENLABS_API_KEYför webbläsaren. - Hygien för händelseloopen: Håll CPU-bundet arbete borta från arbetarens händelseloop.
AudioSource.capture_frameoch iteration överAudioStreamär tidskänsliga; långa synkrona anrop fördröjer eller tappar avbrottshändelser. Användasyncio.to_thread()(Python) ellerworker_threads(Node) för blockerande arbete. - Avstängning: Registrera
ctx.add_shutdown_callback/ctx.addShutdownCallbackför att stänga ElevenLabs WebSocket-anslutningen korrekt. Som standard avslutas rummet (och jobbet) när den sista deltagaren som inte är en agent lämnar.