Audio in Echtzeit generieren
Dieser Leitfaden zeigt Ihnen, wie Sie Audio über eine WebSocket-Verbindung in Echtzeit generieren.
WebSocket-Streaming ist eine Methode zum Senden und Empfangen von Daten über eine einzelne, langlebige Verbindung. Diese Methode eignet sich für Echtzeitanwendungen, bei denen Sie Audiodaten streamen müssen, sobald sie verfügbar sind.
Wenn Sie die Latenz (Zeit bis zum ersten Byte) einer WebSocket-Verbindung zur ElevenLabs-Text-to-Speech-API schnell testen möchten, können Sie elevenlabs-latency über npm installieren und den Anweisungen hier folgen.
WebSockets sind für Text to Speech und die Agents Platform verfügbar. Dieser Leitfaden behandelt den
Text to Speech-WebSocket (/v1/text-to-speech/{voice_id}/stream-input). Dieser Endpunkt
unterstützt die Modelle eleven_v3 und eleven_v4 nicht. Informationen zu Eleven v3-
oder Eleven v4-Dialogen über einen WebSocket finden Sie unter Realtime Text to Dialogue
und Text to Speech vs. Text to Dialogue
WebSockets.
Voraussetzungen
- Ein ElevenLabs-Konto mit API-Schlüssel (so finden Sie Ihren API-Schlüssel).
- Python oder Node.js (oder eine andere JavaScript-Laufzeit) auf Ihrem Computer installiert
Einrichtung
Installieren Sie die erforderlichen Abhängigkeiten:
Erstellen Sie anschließend eine .env-Datei in Ihrem Projektverzeichnis und fügen Sie Ihren API-Schlüssel hinzu:
WebSocket-Verbindung herstellen
Nachdem Sie eine Stimme aus der Stimmbibliothek und das gewünschte Text-to-Speech-Modell ausgewählt haben, stellen Sie eine WebSocket-Verbindung zur Text-to-Speech-API her.
Eingabetext senden
Sobald die WebSocket-Verbindung geöffnet ist, richten Sie zuerst die Stimmeinstellungen ein. Senden Sie anschließend die Textnachricht an die API.
Audio in Datei speichern
Lesen Sie die eingehende Nachricht aus der WebSocket-Verbindung und schreiben Sie die Audio-Chunks in eine lokale Datei.
Skript ausführen
Sie können das Skript ausführen, indem Sie den folgenden Befehl im Terminal eingeben. Eine MP3-Audiodatei wird im Verzeichnis output gespeichert.
Erweiterte Konfiguration
WebSockets bieten einige erweiterte Einstellungen, mit denen Sie Ihre Audioerzeugung in Echtzeit fein abstimmen können.
Pufferung
Bei der Audioerzeugung in Echtzeit sollten zwei wichtige Konzepte berücksichtigt werden: Time To First Byte (TTFB) und Pufferung. Um hochwertige Audiodaten zu erzeugen und Kontext abzuleiten, benötigt das Modell eine bestimmte Menge an Eingabetext. Je mehr Text über eine WebSocket-Verbindung gesendet wird, desto besser ist die Audioqualität. Wird dieser Schwellenwert nicht erreicht, fügt das Modell den Text einem Puffer hinzu und erzeugt Audio, sobald der Puffer gefüllt ist.
Bei der Latenz bezeichnet TTFB die Zeit, bis das erste Audio-Byte an den Client gesendet wird. Das ist wichtig, weil es die wahrgenommene Latenz des Audios beeinflusst. Daher sollten Sie die Puffergröße steuern, um Qualität und Latenz auszubalancieren.
Dafür können Sie den Parameter chunk_length_schedule verwenden, entweder beim Initialisieren der WebSocket-Verbindung oder beim Senden von Text. Dieser Parameter ist ein Array von Ganzzahlen, die die Anzahl der Zeichen darstellen, die an das Modell gesendet werden, bevor Audio erzeugt wird. Wenn Sie chunk_length_schedule beispielsweise auf [120, 160, 250, 290] setzen, erzeugt das Modell Audio, nachdem jeweils 120, 160, 250 und 290 Zeichen gesendet wurden.
So funktioniert dies mit den Standardeinstellungen für chunk_length_schedule:
Im obigen Diagramm wird Audio erst erzeugt, nachdem die zweite Nachricht an den Server gesendet wurde. Das liegt daran, dass die erste Nachricht unter dem Schwellenwert von 120 Zeichen liegt, während die zweite Nachricht die Gesamtzahl der Zeichen über diesen Schwellenwert erhöht. Die dritte Nachricht liegt über dem Schwellenwert von 160 Zeichen, daher wird Audio sofort erzeugt und an den Client zurückgegeben.
Sie können beim Initialisieren der WebSocket-Verbindung oder beim Senden von Text einen benutzerdefinierten Wert für chunk_length_schedule festlegen.
Wenn Sie die sofortige Rückgabe des Audios erzwingen möchten, können Sie mit flush: true den Puffer leeren und die Erzeugung aller gepufferten Texte erzwingen. Das kann beispielsweise nützlich sein, wenn Sie das Ende eines Dokuments erreicht haben und Audio für den letzten Abschnitt erzeugen möchten.
Dies kann pro Nachricht festgelegt werden, indem Sie in der Nachricht flush: true setzen.
Darüber hinaus erzwingt das Schließen des WebSockets automatisch die Erzeugung aller gepufferten Texte.
Stimmeinstellungen
Beim Initialisieren der WebSocket-Verbindungen können Sie die Stimmeinstellungen für nachfolgende Generierungen festlegen. So steuern Sie Geschwindigkeit, Stabilität und weitere Stimmmerkmale des erzeugten Audios.
Dies kann pro Nachricht überschrieben werden, indem Sie in der Nachricht andere voice_settings angeben.
Aussprachewörterbücher
Mit Aussprachewörterbüchern können Sie die Aussprache bestimmter Wörter oder Ausdrücke steuern. Das kann nützlich sein, um sicherzustellen, dass bestimmte Wörter korrekt ausgesprochen werden, oder um bestimmte Wörter oder Ausdrücke zu betonen.
Im Gegensatz zu voice_settings und generation_config müssen Aussprachewörterbücher in der Nachricht „Verbindung initialisieren“ angegeben werden. Weitere Informationen finden Sie in der API-Referenz.
Wenn Sie phonembasierte Aussprachewörterbücher mit WebSockets verwenden, müssen Sie enable_ssml_parsing=true als Abfrageparameter zur WebSocket-URI hinzufügen. Beispiel:
Best Practice
- Wir empfehlen die Standardeinstellung für
chunk_length_scheduleingeneration_config. - Bei der Entwicklung einer Anwendung für Echtzeit-Konversationsagenten empfehlen wir,
flush: truezusammen mit dem Text am Ende eines Gesprächszugs zu verwenden, um eine zeitnahe Audioerzeugung sicherzustellen. - Wenn die Standardeinstellung für Ihren Anwendungsfall keine optimale Latenz bietet, können Sie
chunk_length_scheduleanpassen. Beachten Sie jedoch, dass eine Latenzreduzierung durch diese Anpassung die Qualität beeinträchtigen kann.
Tipps
- Die WebSocket-Verbindung wird nach 20 Sekunden Inaktivität automatisch geschlossen. Um die Verbindung offen zu halten, können Sie ein einzelnes Leerzeichen
" "senden. Beachten Sie, dass diese Zeichenfolge ein Leerzeichen enthalten muss, da eine vollständig leere Zeichenfolge,"", den WebSocket schließt. - Senden Sie nach der letzten Textnachricht eine leere Zeichenfolge, um die WebSocket-Verbindung zu schließen.
- Mit
alignmentkönnen Sie Zeitstempel auf Wortebene für jedes Wort im Text abrufen. Das kann nützlich sein, um Audio und Text in einem Video abzugleichen oder für andere Anwendungen, die präzises Timing erfordern. Weitere Informationen finden Sie in der API-Referenz.