Hoppa till navigering

Streama dialog i realtid

Den här guiden visar hur du streamar ljud för Eleven v3-dialog via Text to Dialogue WebSocket.

Text to Dialogue WebSocket (/v1/text-to-dialogue/stream-input) håller en enda anslutning öppen medan du skickar dialograder och tar emot base64-kodade ljudsegment. Den är endast avsedd för dialogmodellerna Eleven v3 och Eleven v4 (model_id måste börja med eleven_v3 eller eleven_v4).

Den här guiden handlar om WebSocket för Text to Dialogue. För Flash, Multilingual v2 eller andra TTS-modeller som inte är v3 använder du Realtime TTS WebSocket. För en jämförelse sida vid sida av båda protokollen, se Text to Speech- och Text to Dialogue- WebSockets.

Krav

  • Ett ElevenLabs-konto med en API-nyckel (autentisering).
  • API-nyckeln måste ha behörighet för Text to Speech.
  • Python eller Node.js installerat på din dator.

Konfiguration

pip install python-dotenv websockets

Skapa en .env-fil:

.env
ELEVENLABS_API_KEY=your_elevenlabs_api_key_here

Välj ett röst-ID från Voice Library. Exemplen nedan använder eleven_v4_turbo, som tillåter en registrerad röst per anslutning.

Öppna WebSocket-anslutningen

Anslut till wss://api.elevenlabs.io/v1/text-to-dialogue/stream-input med frågeparametrar som model_id och output_format. Du kan skicka API-nyckeln i headern xi-api-key eller i det första JSON-meddelandet (visas här i brödtexten för ett enhetligt mönster mellan språk).

import asyncio
import base64
import json
import os
from dotenv import load_dotenv
import websockets
load_dotenv()
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
VOICE_ID = "21m00Tcm4TlvDq8ikWAM"
MODEL_ID = "eleven_v4_turbo"
URI = (
"wss://api.elevenlabs.io/v1/text-to-dialogue/stream-input"
f"?model_id={MODEL_ID}&output_format=mp3_44100_128"
)

Registrera röster och streama text

Skicka ett första meddelande som innehåller voices (obligatoriskt) och xi_api_key om du inte har angett headern xi-api-key. Skicka sedan en eller flera ramar med inputs: varje objekt har text, voice_id och valfritt new_turn.

Servern buffrar text tills den har tillräckligt med kontext (cirka 40 tecken och 8 ord) och skickar sedan audio-segment. Svarsfälten använder snake_case (till exempel is_final).

async def stream_dialogue():
async with websockets.connect(URI) as websocket:
await websocket.send(
json.dumps(
{
"voices": [VOICE_ID],
"xi_api_key": ELEVENLABS_API_KEY,
}
)
)
line = (
"This is a longer line of dialogue used to exceed the minimum buffer so the model "
"starts generating streamed audio for the registered voice. "
)
await websocket.send(
json.dumps(
{
"inputs": [
{"text": line, "voice_id": VOICE_ID, "new_turn": False},
],
}
)
)
await websocket.send(json.dumps({"close_socket": True}))
os.makedirs("output", exist_ok=True)
out_path = "output/dialogue-ws.mp3"
with open(out_path, "wb") as audio_file:
while True:
raw = await websocket.recv()
msg = json.loads(raw)
if msg.get("error"):
raise RuntimeError(msg)
if msg.get("audio"):
audio_file.write(base64.b64decode(msg["audio"]))
if msg.get("is_final"):
break
print(f"Wrote {out_path}")
asyncio.run(stream_dialogue())

close_socket tömmer all buffrad text, skickar återstående ljud och sedan en sista ram med is_final: true innan anslutningen stängs. Om du vill hålla anslutningen öppen mellan rader utelämnar du close_socket tills sessionen avslutas. Använd flush för att framtvinga ljud för kortare buffertar utan att stänga anslutningen.

Kör skriptet

python text-to-dialogue-websocket.py

Du bör få en MP3-fil under output/ (med filnamnet från exemplet ovan).

Anmärkningar om beteende

Buffring

Till skillnad från TTS WebSocket chunk_length_schedule använder dialogstreaming ett fast tröskelvärde på servern (antal tecken och ord) före det första partiella ljudet. Om du skickar korta rader och hör fördröjningar kan du samla lite mer text per inputs-ram eller skicka flush: true för att framtvinga generering utan att stänga socketen.

Turordningar och röster

Ange new_turn: true när en talare avslutar en tur så att prosodin återställs korrekt. Att ändra voice_id mellan inputs-poster startar också en ny tur. Med eleven_v4_turbo registrerar du exakt en röst i voices; eleven_v4 har stöd för upp till 10 registrerade röster.

Inaktivitet

Om servern inte tar emot något klientmeddelande på 20 sekunder avslutas anslutningen. Skicka {"keep_alive": true} för att återställa timern utan att syntetisera ljud.

Samtidighet

Varje öppen anslutning håller en dialogs-session så länge den är öppen och hämtas från en dedikerad pool som är separat från din plans vanliga samtidighetsgräns. Ljud som genereras via anslutningen räknas inte mot standardgränsen för samtidighet. Se samtidighet för Text to Dialogue.

Justering

Lägg till sync_alignment=true i frågesträngen för att ta emot alignment-objekt (tidsmatriser i snake_case) i segment när de är tillgängliga. Se API-referensen.

Nästa steg