Integracja z LiveKit
Połącz pokój LiveKit ze Speech Engine za pomocą workera LiveKit Agents.
Ten przewodnik pokazuje, jak używać ElevenLabs Speech Engine jako warstwy głosowej pokoju LiveKit. Worker LiveKit Agents dołącza do pokoju jako uczestnik, subskrybuje ścieżkę audio użytkownika, otwiera WebSocket ze Speech Engine i publikuje zsyntetyzowane audio Speech Engine z powrotem w pokoju jako własną ścieżkę.
Architektura
Speech Engine obsługuje dwa rodzaje połączeń WebSocket:
- WebSocket mózgu, z którym łączy się API ElevenLabs. Twój serwer uruchamia go za pomocą SDK Speech Engine (
engine.serve()/engine.attach()) i otrzymuje transkrypcje, na które ma odpowiadać. - WebSocket rozmowy, z którym łączą się klienci. Przeglądarki łączą się przez token WebRTC; klienci spoza przeglądarki (np. worker LiveKit Agents) łączą się przez podpisany URL i strumieniują surowe audio PCM w obu kierunkach.
Worker LiveKit używa drugiego połączenia. Działa jako „klient” Speech Engine w imieniu uczestników pokoju LiveKit.
Serwer mózgu pozostaje bez zmian względem krótkiego wprowadzenia do Speech Engine — worker LiveKit zastępuje przeglądarkę jako źródło audio, ale logika LLM pozostaje taka sama.
Kiedy użyć tego wzorca
Skorzystaj z mostu LiveKit, gdy sam pokój jest częścią doświadczenia:
- Sesje z wieloma uczestnikami, podczas których użytkownicy rozmawiają z agentem razem
- Istniejące wdrożenia LiveKit, w których zmiana transportu zepsułaby klientów
- Agenci głosowi współdzielący pokój z udostępnianiem ekranu, wideo lub czatem tekstowym
- Kierowane połączenia SIP-to-LiveKit, które wymagają agenta AI na linii
Jeśli potrzebujesz tylko pętli głosowej przeglądarka–Speech Engine bez innych uczestników, klient WebRTC w krótkim wprowadzeniu do Speech Engine będzie prostszy — Speech Engine komunikuje się z przeglądarką bezpośrednio przez WebRTC, bez pokoju LiveKit.
Wymagania wstępne
- Projekt LiveKit (LiveKit Cloud lub serwer hostowany samodzielnie). Worker potrzebuje
LIVEKIT_URL,LIVEKIT_API_KEYiLIVEKIT_API_SECRET. - ElevenLabs Speech Engine. Postępuj zgodnie z krótkim wprowadzeniem do Speech Engine, aby go utworzyć i uruchomić serwer mózgu.
- Python 3.9+ lub Node.js 18+.
Worker mostu Node używa
@livekit/rtc-node, który jest obecnie w
wersji Developer Preview. W środowiskach produkcyjnych wybierz workera Python.
Skonfiguruj formaty audio Speech Engine
AudioStream LiveKit zmienia częstotliwość próbkowania przychodzących ścieżek Opus na dowolną żądaną częstotliwość PCM, więc możesz bezpośrednio dopasować wejście Speech Engine. Zaktualizuj Speech Engine, aby przyjmował PCM 16 kHz na wejściu ASR i generował PCM 24 kHz na wyjściu TTS.
PCM Speech Engine ma w całym przepływie format 16-bitowy ze znakiem i kolejnością little-endian. Inne obsługiwane częstotliwości znajdziesz w dokumentacji formatów audio.
Zbuduj worker mostka
Worker to długotrwały proces, który łączy się z serwerem LiveKit, czeka na zadania, dołącza do przypisanych pokoi i przekazuje audio między pokojem a Speech Engine.
Utwórz podpisany URL Speech Engine
Worker żąda krótkotrwałego podpisanego URL-a do WebSocketu rozmowy Speech Engine. Podpisany URL zawiera ID silnika i jednorazowy podpis, więc worker może otworzyć WebSocket bez ujawniania klucza API.
Zdefiniuj punkt wejścia workera
Za każdym razem, gdy worker zostaje wysłany do pokoju, uruchamia się jego punkt wejścia. Łączy się on z pokojem, otwiera WebSocket rozmowy Speech Engine i uruchamia dwa mostki audio: jeden dla audio rozmówcy wysyłanego do Speech Engine, a drugi dla syntezowanego audio wracającego z powrotem.
Worker odfiltrowuje własne opublikowane audio w obsłudze track_subscribed, porównując je z tożsamością lokalnego uczestnika. Bez tego sprawdzenia próbowałby wysłać własne syntezowane audio z powrotem do Speech Engine.
Dwa szczegóły kolejności są kluczowe dla poprawności:
- Czas rejestracji nasłuchiwania:
TrackSubscribedjest rejestrowany przedctx.connect(). LiveKit automatycznie subskrybuje istniejące ścieżki podczas uzgadniania połączenia, a nasłuchiwanie zarejestrowane później może pominąć zdarzenie. Pompa audio czeka naFuture/Promisedla WebSocketu Speech Engine, dzięki czemu może subskrybować od razu i przekazywać audio zaraz po otwarciu połączenia. - Tylko TypeScript — serializacja przechwytywania:
AudioSource.captureFramez@livekit/rtc-nodezgłaszaInvalidState, jeśli jest wywoływane równocześnie. Obsługa TypeScript serializuje przechwytywanie za pomocą łańcucha promise. Pętlaasync for el_to_roomw Pythonie jest naturalnie sekwencyjna i tego nie potrzebuje.
Wyślij workera do pokoju
Ponieważ worker ma agent_name, używa jawnego wysyłania — dołącza do pokoi tylko wtedy, gdy nakaże mu to backend. Najprostszy sposób to umieszczenie RoomAgentDispatch w tokenie dostępu LiveKit, którego przeglądarka używa do połączenia.
Gdy przeglądarka użyje tego tokena, aby utworzyć pokój lub do niego dołączyć, LiveKit automatycznie wyśle workera mostka do tego samego pokoju.
Połącz z przeglądarki
Przeglądarka potrzebuje tylko standardowego klienta LiveKit — nie komunikuje się bezpośrednio ze Speech Engine.
Po kliknięciu przycisku przeglądarka pobiera token LiveKit, dołącza do pokoju z włączonym mikrofonem i zaczyna odbierać ścieżkę audio agenta. Worker zostaje wysłany, otwiera sesję Speech Engine i przekazuje audio w obu kierunkach.
Informacje o formatach audio
Speech Engine obsługuje poniższe formaty audio. Skonfiguruj je w silniku za pomocą asr.user_input_audio_format i tts.agent_output_audio_format.
AudioStream i AudioSource w LiveKit obsługują resampling za ciebie — możesz zażądać dowolnej częstotliwości próbkowania od AudioStream, a SDK przekonwertuje ją z bazowej ścieżki Opus 48 kHz.
Kwestie produkcyjne
- Jawne wysyłanie: Zawsze ustawiaj
agent_name/agentNamewWorkerOptions. Automatyczne wysyłanie uruchamia workera dla każdego pokoju utworzonego w projekcie LiveKit, co rzadko jest tym, czego chcesz. - Uwierzytelnianie serwera brain: Ustaw wspólny sekret w Speech Engine i weryfikuj go na serwerze brain, aby tylko Speech Engine mógł dotrzeć do endpointu:
Serwer brain sprawdza następnie
request.headers["x-api-key"]przed zaakceptowaniem przejścia na WebSocket. - Serwer tokenów: Twórz tokeny LiveKit i Speech Engine po stronie serwera. Nigdy nie ujawniaj w przeglądarce
LIVEKIT_API_SECRETaniELEVENLABS_API_KEY. - Higiena pętli zdarzeń: Nie uruchamiaj zadań intensywnie korzystających z CPU w pętli zdarzeń workera.
AudioSource.capture_framei iteracjaAudioStreamsą wrażliwe na czas; długie synchroniczne wywołania opóźnią lub pominą zdarzenia przerwań. Do blokujących zadań używajasyncio.to_thread()(Python) lubworker_threads(Node). - Zamykanie: Zarejestruj
ctx.add_shutdown_callback/ctx.addShutdownCallback, aby poprawnie zamknąć WebSocket ElevenLabs. Domyślnie pokój (i zadanie) jest kończony, gdy wyjdzie ostatni uczestnik niebędący agentem.