Generuj audio w czasie rzeczywistym
Ten przewodnik pokazuje, jak generować audio w czasie rzeczywistym przez połączenie WebSocket.
Strumieniowanie przez WebSocket to metoda wysyłania i odbierania danych przez jedno, długotrwałe połączenie. Jest przydatna w aplikacjach czasu rzeczywistego, w których dane audio trzeba przesyłać strumieniowo, gdy tylko są dostępne.
Jeśli chcesz szybko sprawdzić opóźnienie (czas do pierwszego bajtu) połączenia WebSocket z API zamiany tekstu na mowę ElevenLabs, możesz zainstalować elevenlabs-latency przez npm i postępować zgodnie z instrukcjami tutaj.
WebSockety są dostępne dla Text to Speech i platformy Agents. Ten przewodnik dotyczy WebSocketu Text
to Speech (/v1/text-to-speech/{voice_id}/stream-input). Ten endpoint nie obsługuje modeli
eleven_v3 ani eleven_v4. Informacje o dialogu Eleven v3 lub Eleven v4 przez WebSocket znajdziesz w artykułach
Realtime Text to Dialogue
oraz WebSockety Text to Speech i Text to Dialogue
w porównaniu.
Wymagania
- Konto ElevenLabs z kluczem API (zobacz, jak znaleźć klucz API).
- Python lub Node.js (albo inne środowisko JavaScript) zainstalowane na komputerze
Konfiguracja
Zainstaluj wymagane zależności:
Następnie utwórz plik .env w katalogu projektu i dodaj klucz API:
Nawiąż połączenie WebSocket
Po wybraniu głosu z Voice Library i modelu zamiany tekstu na mowę, którego chcesz użyć, nawiąż połączenie WebSocket z API zamiany tekstu na mowę.
Wyślij tekst wejściowy
Gdy połączenie WebSocket jest otwarte, najpierw ustaw parametry głosu. Następnie wyślij wiadomość tekstową do API.
Zapisz audio do pliku
Odczytaj przychodzącą wiadomość z połączenia WebSocket i zapisz fragmenty audio w pliku lokalnym.
Uruchom skrypt
Uruchom skrypt, wykonując poniższe polecenie w terminalu. Plik audio mp3 zostanie zapisany w katalogu output.
Zaawansowana konfiguracja
WebSockety oferują zaawansowane ustawienia, które pozwalają dostroić generowanie audio w czasie rzeczywistym.
Buforowanie
Przy generowaniu audio w czasie rzeczywistym warto uwzględnić dwa ważne pojęcia: czas do pierwszego bajtu (TTFB) i buforowanie. Aby tworzyć audio wysokiej jakości i określać kontekst, model potrzebuje określonej ilości tekstu wejściowego. Im więcej tekstu wysyłasz przez połączenie WebSocket, tym lepsza jakość audio. Jeśli próg nie zostanie osiągnięty, model doda tekst do bufora i wygeneruje audio, gdy bufor się zapełni.
Pod względem opóźnienia TTFB to czas potrzebny na wysłanie pierwszego bajtu audio do klienta. Jest ważny, ponieważ wpływa na odczuwalne opóźnienie audio. Możesz więc chcieć kontrolować rozmiar bufora, aby zachować równowagę między jakością a opóźnieniem.
Aby tym zarządzać, użyj parametru chunk_length_schedule podczas inicjalizacji połączenia WebSocket lub wysyłania tekstu. To tablica liczb całkowitych określających liczbę znaków wysłanych do modelu przed wygenerowaniem audio. Na przykład, jeśli ustawisz chunk_length_schedule na [120, 160, 250, 290], model wygeneruje audio po wysłaniu odpowiednio 120, 160, 250 i 290 znaków.
Oto przykład działania z domyślnymi ustawieniami chunk_length_schedule:
Na powyższym diagramie audio jest generowane dopiero po wysłaniu drugiej wiadomości na serwer. Dzieje się tak, ponieważ pierwsza wiadomość nie osiąga progu 120 znaków, a druga zwiększa łączną liczbę znaków powyżej tego progu. Trzecia wiadomość przekracza próg 160 znaków, więc audio jest od razu generowane i zwracane do klienta.
Możesz podać własną wartość chunk_length_schedule podczas inicjalizacji połączenia WebSocket lub wysyłania tekstu.
Jeśli chcesz wymusić natychmiastowe zwrócenie audio, użyj flush: true, aby wyczyścić bufor i wymusić wygenerowanie całego zbuforowanego tekstu. Przydaje się to na przykład po dotarciu do końca dokumentu, gdy chcesz wygenerować audio dla ostatniej sekcji.
Możesz ustawić to dla każdej wiadomości osobno, dodając flush: true w wiadomości.
Dodatkowo zamknięcie WebSocketu automatycznie wymusi wygenerowanie całego zbuforowanego tekstu.
Ustawienia głosu
Podczas inicjalizacji połączeń WebSocket możesz określić ustawienia głosu dla kolejnych generacji. Pozwala to kontrolować szybkość, stabilność i inne cechy głosu w wygenerowanym audio.
Możesz je zastąpić dla każdej wiadomości osobno, określając inne voice_settings w wiadomości.
Słowniki wymowy
Możesz używać słowników wymowy, aby kontrolować wymowę konkretnych słów lub fraz. Przydaje się to, gdy chcesz zadbać o poprawną wymowę określonych słów albo zaakcentować wybrane słowa lub frazy.
W przeciwieństwie do voice_settings i generation_config, słowniki wymowy musisz określić w wiadomości „Initialize Connection”. Więcej informacji znajdziesz w dokumentacji API.
Gdy używasz słowników wymowy opartych na fonemach z WebSocketami, musisz dodać enable_ssml_parsing=true jako parametr zapytania do URI WebSocketu. Przykład:
Dobre praktyki
- Zalecamy używanie domyślnego ustawienia
chunk_length_schedulewgeneration_config. - Przy tworzeniu aplikacji agenta konwersacyjnego w czasie rzeczywistym zalecamy użycie
flush: truewraz z tekstem na końcu tury rozmowy, aby audio było generowane na czas. - Jeśli domyślne ustawienie nie zapewnia optymalnego opóźnienia w twoim przypadku, możesz zmienić
chunk_length_schedule. Pamiętaj jednak, że zmniejszenie opóźnienia w ten sposób może odbyć się kosztem jakości.
Wskazówki
- Połączenie WebSocket zostanie automatycznie zamknięte po 20 sekundach bezczynności. Aby je utrzymać, możesz wysłać pojedynczy znak spacji
" ". Pamiętaj, że ten ciąg musi zawierać spację, ponieważ wysłanie całkowicie pustego ciągu""zamknie WebSocket. - Wyślij pusty ciąg, aby zamknąć połączenie WebSocket po wysłaniu ostatniej wiadomości tekstowej.
- Możesz użyć
alignment, aby uzyskać sygnatury czasowe na poziomie słów dla każdego słowa w tekście. Przydaje się to do synchronizowania audio z tekstem w filmie lub w innych zastosowaniach wymagających precyzyjnego czasu. Więcej informacji znajdziesz w dokumentacji API.