Zur Navigation springen

Speech Engine Schnellstart

Fügen Sie Ihrem Chat-Agenten mit dem ElevenLabs SDK Sprache hinzu.

In diesem Leitfaden erstellen Sie einen sprachgesteuerten Agenten mit Speech Engine. Sie richten einen Server ein, der Ihr LLM mit ElevenLabs verbindet, und verknüpfen anschließend einen Browser-Client, damit Nutzer Sprachgespräche mit Ihrem Agenten führen können.

Verwenden Sie die ElevenLabs Speech Engine Skill, um Ihrem Chat-Agenten Sprache hinzuzufügen:

npx skills add elevenlabs/skills --skill speech-engine

So funktioniert Speech Engine

Speech Engine verbindet Ihr LLM mit ElevenLabs, sodass Nutzer mit Ihrem Agenten sprechen und seine Antworten hören können. ElevenLabs übernimmt Speech to Text und Text to Speech; Ihr Server stellt die LLM-Logik bereit.

Jede WebSocket-Verbindung steht für eine Konversation. Wenn der Nutzer spricht, transkribiert ElevenLabs das Audio und sendet das Transkript an Ihren Server. Ihr Server übergibt es an Ihr LLM und streamt anschließend die Antwort zurück. ElevenLabs wandelt den Text in Sprache um und spielt ihn im Browser ab. Das SDK übernimmt Verbindungsverwaltung, Sprecherwechsel und die Erkennung von Unterbrechungen.

Voraussetzungen

Dieses Tutorial verwendet die API von OpenAI für das LLM. Sie benötigen einen OpenAI-API-Schlüssel, der in der Umgebungsvariable OPENAI_API_KEY gesetzt ist.

Server einrichten

1

API-Schlüssel erstellen

Erstellen Sie hier im Dashboard einen API-Schlüssel, den Sie verwenden, um sicher auf die API zuzugreifen.

Speichern Sie den Schlüssel als verwaltetes Secret und übergeben Sie ihn den SDKs je nach Präferenz entweder als Umgebungsvariable über eine .env-Datei oder direkt in der Konfiguration Ihrer App.

.env
ELEVENLABS_API_KEY=<your_api_key_here>
2

Abhängigkeiten installieren

pip install elevenlabs openai python-dotenv
3

Server verfügbar machen

Speech Engine benötigt eine öffentlich erreichbare URL. Verwenden Sie ngrok, um Ihren lokalen Server verfügbar zu machen. Der Server ist noch nicht erstellt, aber ngrok muss zuerst ausgeführt werden, damit Sie die URL für den nächsten Schritt haben.

ngrok http 3001

Kopieren Sie die Weiterleitungs-URL (z. B. https://abc123.ngrok.io).

4

Speech-Engine-Instanz erstellen

Verwenden Sie das SDK, um eine Speech-Engine-Instanz zu erstellen. Übergeben Sie dabei Ihre ngrok-URL mit angehängtem Pfad /ws als WebSocket-URL.

import asyncio
from dotenv import load_dotenv
from elevenlabs import AsyncElevenLabs
load_dotenv()
elevenlabs = AsyncElevenLabs(
api_key=os.getenv("ELEVENLABS_API_KEY"),
)
async def main():
engine = await elevenlabs.speech_engine.create(
name="My Speech Engine",
speech_engine={
# Note we use the wss protocol instead of https
"ws_url": "wss://abc123.ngrok.io/ws",
},
)
print(f"Speech Engine ID: {engine.engine_id}")
if __name__ == "__main__":
asyncio.run(main())

Führen Sie dieses Skript aus und kopieren Sie die Speech-Engine-ID (z. B. seng_8k3m9xr4hjnfg983brhmhkd98n6) für den nächsten Schritt.

5

Server erstellen

Erstellen Sie eine Datei namens server.py oder server.mts mit folgendem Inhalt. Dadurch wird ein Server eingerichtet, Speech Engine unter dem Pfad /ws angebunden und OpenAI zur Generierung von Antworten verwendet.

import asyncio
import os
from dotenv import load_dotenv
from openai import AsyncOpenAI
from elevenlabs import AsyncElevenLabs
load_dotenv()
# Replace with your Speech Engine ID from step 4
SPEECH_ENGINE_ID = "seng_8k3m9xr4hjnfg983brhmhkd98n6"
openai = AsyncOpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
)
elevenlabs = AsyncElevenLabs(
api_key=os.getenv("ELEVENLABS_API_KEY"),
)
def on_init(conversation_id, session):
print(f"Session started: {conversation_id}")
async def on_transcript(transcript, session):
stream = await openai.responses.create(
model="gpt-4o",
instructions="You are a helpful voice assistant. Keep responses concise and conversational.",
input=[
{"role": "assistant" if m.role == "agent" else m.role, "content": m.content}
for m in transcript
],
stream=True,
)
await session.send_response(stream)
def on_close(session):
print(f"Session ended: {session.conversation_id}")
def on_error(err, session):
print(f"Error: {err}")
async def main():
engine = await elevenlabs.speech_engine.get(SPEECH_ENGINE_ID)
await engine.serve(
port=3001,
path="/ws",
debug=True,
on_init=on_init,
on_transcript=on_transcript,
on_close=on_close,
on_error=on_error,
)
if __name__ == "__main__":
asyncio.run(main())

Der Callback onTranscript / on_transcript erhält den vollständigen Gesprächsverlauf und die aktuelle Sitzung. Das TypeScript SDK stellt außerdem ein AbortSignal bereit, das ausgelöst wird, wenn der Nutzer eine Antwort unterbricht. Durch die Übergabe von signal an den OpenAI-Aufruf wird die LLM-Anfrage bei einer Unterbrechung automatisch abgebrochen.

sendResponse() / send_response() akzeptiert einen String, ein asynchrones Iterable oder einen Stream von OpenAI, Anthropic oder Google Gemini. Das SDK extrahiert den Textinhalt automatisch.

Im obigen Beispiel wird das vollständige Transkript des Nutzers an das LLM übergeben. In einer Produktionsumgebung sollten Sie Schutzmechanismen hinzufügen, um Prompt-Injection- oder Manipulationsversuche zu verhindern.

6

Server starten

python server.py

Client einrichten

1

Client SDK installieren

npm install @elevenlabs/react
2

Token-Endpunkt erstellen

Fügen Sie einen serverseitigen Endpunkt hinzu, der ein Konversationstoken generiert. So bleibt Ihr API-Schlüssel außerhalb des Browsers, und WebRTC sorgt für die beste Audioqualität.

import os
from dotenv import load_dotenv
from flask import Flask, jsonify
from elevenlabs import ElevenLabs
load_dotenv()
app = Flask(__name__)
elevenlabs = ElevenLabs(
api_key=os.getenv("ELEVENLABS_API_KEY"),
)
@app.route("/api/token")
def get_token():
# Replace with your Speech Engine ID from step 4 of the server setup
speech_engine_id = "seng_8k3m9xr4hjnfg983brhmhkd98n6"
response = elevenlabs.conversational_ai.conversations.get_webrtc_token(
agent_id=speech_engine_id,
)
return jsonify(token=response.token)
if __name__ == "__main__":
app.run(port=3002)
3

Gesprächs-UI erstellen

Rufen Sie das Konversationstoken von Ihrem Server ab und verwenden Sie es, um eine Sitzung zu starten.

App.tsx
import { useConversation } from "@elevenlabs/react";
import { useCallback } from "react";
async function getToken(): Promise<string> {
const response = await fetch("/api/token");
if (!response.ok) {
throw Error("Failed to get conversation token");
}
const data = await response.json();
return data.token;
}
export default function App() {
const conversation = useConversation({
onConnect: () => console.log("Connected"),
onDisconnect: () => console.log("Disconnected"),
onError: (error: Error) => console.error("Error:", error),
});
const startConversation = useCallback(async () => {
await navigator.mediaDevices.getUserMedia({ audio: true });
const token = await getToken();
await conversation.startSession({ conversationToken: token });
}, [conversation]);
const stopConversation = useCallback(async () => {
await conversation.endSession();
}, [conversation]);
return (
<div>
<p>Status: {conversation.status}</p>
<button onClick={startConversation} disabled={conversation.status === "connected"}>
Start conversation
</button>
<button onClick={stopConversation} disabled={conversation.status !== "connected"}>
End conversation
</button>
</div>
);
}
4

Ausprobieren

Stellen Sie sicher, dass drei Prozesse ausgeführt werden:

  1. ngrok – Weiterleitung an Port 3001
  2. Ihr Speech-Engine-Server – python server.py oder npx tsx server.mts
  3. Der Token-Server – npx tsx token-server.mts oder python token_server.py

Öffnen Sie Ihre Client-Anwendung im Browser und klicken Sie auf Gespräch starten. Erteilen Sie bei Aufforderung Mikrofonzugriff und sprechen Sie dann. Sie sollten die Antwort des Agenten über Ihre Lautsprecher hören.

Wenn Sie auf dem Server debug: true aktiviert haben, werden eingehende Transkripte und ausgehende Antworten in der Konsole protokolliert.

Sitzungsereignisse

EreignisTypeScript-CallbackPython-CallbackBeschreibung
user_transcriptonTranscripton_transcriptNutzersprache transkribiert. Enthält den vollständigen Gesprächsverlauf und ein Abbruchsignal.
initonIniton_initSitzung mit einer Konversations-ID initialisiert.
closeonCloseon_closeOrdnungsgemäße Trennung von ElevenLabs.
disconnectedonDisconnecton_disconnectWebSocket wurde unerwartet getrennt.
erroronErroron_errorProtokoll- oder WebSocket-Fehler.

Erste Agentennachricht konfigurieren

Standardmäßig wartet der Agent, bis der Nutzer zuerst spricht. Damit der Agent den Nutzer beim Start des Gesprächs begrüßt, legen Sie beim Starten der Sitzung in der Client-Option overrides eine erste Nachricht fest.

1

Damit der Agent zuerst sprechen kann, müssen wir die Speech-Engine-Ressource aktualisieren, um diese Einstellung vom Client aus zuzulassen.

engine = await elevenlabs.speech_engine.update(
speech_engine_id="seng_8k3m9xr4hjnfg983brhmhkd98n6",
overrides={
"first_message": True,
},
)
2

Anschließend konfigurieren wir die erste Nachricht im Client SDK.

conversation.startSession({
conversationToken: token,
overrides: {
agent: {
firstMessage: "Hello! How can I help you today?",
},
},
});

Die erste Nachricht wird vom Agenten gesprochen, sobald die Verbindung hergestellt ist. Sie löst auf Ihrem Server keinen onTranscript-Callback aus – sie wird vollständig aufseiten von ElevenLabs verarbeitet.

Maximale Gesprächsdauer konfigurieren

Standardmäßig endet ein Gespräch nach 600 Sekunden (10 Minuten). Speech Engine unterstützt Gespräche von bis zu 7.200 Sekunden (2 Stunden). Um längere Gespräche zu ermöglichen, aktualisieren Sie die Speech-Engine-Ressource mit einem höheren Wert für max_duration_seconds:

engine = await elevenlabs.speech_engine.update(
speech_engine_id="seng_8k3m9xr4hjnfg983brhmhkd98n6",
conversation={
"max_duration_seconds": 7200,
},
)

Sie können dies auch im Dashboard festlegen: Öffnen Sie Ihre Speech Engine, wechseln Sie zur Registerkarte Erweitert und setzen Sie unter Gesprächsverhalten die Maximale Gesprächsdauer.

Nächste Schritte