Azure Communication Services
Ermöglichen Sie Nutzern, eine Telefonnummer anzurufen, die Ihr ElevenLabs-Agent über ACS Call Automation entgegennimmt.
Überblick
Mit diesem Ansatz erhält Ihr Agent eine Telefonnummer. Ein Anrufer wählt sie, Azure Communication Services (ACS) nimmt den Anruf mit bidirektionalem Media Streaming an, und eine kleine Bridge leitet PCM-Audio zwischen ACS und dem ElevenLabs-Agenten über das standardmäßige Agent-WebSocket-Protokoll weiter. Dies entspricht dem Contact-Center-/IVR-Muster – derselben Struktur wie bei einer SIP-Trunking-Bereitstellung, wobei ACS der Carrier ist.
Außerdem verbindet es sich auf zwei Arten mit Teams: Ein Teams-Nutzer mit Calling Plan kann die ACS-Nummer direkt wählen, oder Sie schalten Teams Phone Extensibility vor die Nummer, sodass Anrufe an ein Teams-Ressourcenkonto in ACS weitergeleitet werden.
ACS stellt PSTN-Nummern nur in einer begrenzten Anzahl von Ländern bereit. Wenn in Ihrer Region keine Nummer verfügbar ist, verwenden Sie stattdessen einen SIP-Anbieter mit SIP Trunking oder den Graph-Anruf- Bot.
So funktioniert es
Audio ist auf beiden Seiten PCM 16 kHz Mono (das Ein-/Ausgabeformat des Agenten ist pcm_16000) und wird daher ohne Resampling als base64 durchgereicht.
Die Bridge stellt diese Routen bereit:
Voraussetzungen
- Ein kostenpflichtiges Azure-Abonnement (MCA / EA / Pay-As-You-Go) – kostenlose Test- oder Sponsoring-Abonnements können keine Nummern kaufen.
- Eine Azure Communication Services-Ressource.
- Einen HTTPS-Host für die Bridge mit einem öffentlichen WebSocket (Azure Container Apps, App Service oder eine VM).
- Einen ElevenLabs-Agenten, der auf beiden Seiten auf PCM 16000 Hz eingestellt ist: TTS-Ausgabeformat im Tab Voice, Audioeingabeformat des Nutzers im Tab Advanced.
Berechtigungen und Rollen
Mit Contributor (nicht Owner) kann az containerapp up die ACR-Pull-
Rollenzuweisung für die verwaltete Identität nicht erstellen. Aktivieren Sie stattdessen den Admin-Nutzer der Registry und binden Sie ihn ein – siehe die Warnung in Schritt 2.
Schritt 1 – ACS-Ressource und Nummer bereitstellen
Kaufen Sie in der Ressource eine Nummer (Portal → Ihre ACS-Ressource → Phone numbers → Get oder über das phone-numbers SDK). Für einen Agenten, der Anrufe annimmt, genügt eine Nummer mit eingehenden Anrufen. Fügen Sie die Fähigkeit ausgehend hinzu, wenn Sie auch /api/outboundCall verwenden möchten.

Zur Überprüfung über die CLI (erfordert az extension add --name communication) und zum Abrufen der Verbindungszeichenfolge, die die Bridge als ACS_CONNECTION_STRING verwendet:
Schritt 2 – Bridge bereitstellen
Die Bridge ist eine kleine Flask- + flask-sock-App mit azure-communication-callautomation. Der Kern des eingehenden Ablaufs:
Leiten Sie auf dem Socket /ws PCM16 in beide Richtungen weiter: Leiten Sie ACS-AudioData-Frames als {"user_audio_chunk": "<base64>"} an ElevenLabs weiter und senden Sie das Audio des Agenten als {"Kind":"AudioData","AudioData":{"Data":"<base64>"},"StopAudio":null} zurück. Der erste von ACS gesendete Frame ist AudioMetadata (das ausgehandelte Format) – protokollieren und ignorieren Sie ihn. Die ElevenLabs-Seite nutzt das standardmäßige Agent-WebSocket-Protokoll.
ACS verwendet je Richtung unterschiedliche JSON-Groß-/Kleinschreibung: Eingehende Frames, die ACS sendet, nutzen camelCase (kind,
audioData.data), während ausgehende Frames, die ACS erwartet, PascalCase verwenden (Kind, AudioData.Data,
StopAudio). Halten Sie die beiden Schreibweisen getrennt – das folgende Relay bildet dies ab.
Dieses Relay ist bewusst minimal gehalten. Ergänzen Sie für den Produktionseinsatz Logging, Wiederverbindung und einen kontrollierten Abbau. Die vollständige Nachrichtenreferenz finden Sie in der WebSocket- Dokumentation.
EL_WS verbindet sich mit einem öffentlichen Agenten. Lassen Sie die Bridge für einen privaten Agenten serverseitig eine kurzlebige
signierte URL anfordern – GET /v1/convai/conversation/get-signed-url?agent_id=... mit Ihrem API-
Schlüssel – und verbinden Sie sich stattdessen mit der zurückgegebenen URL. Legen Sie bei Datenresidenz ELEVENLABS_ORIGIN auf Ihren
Residenzhost fest (wss://api.eu.residency.elevenlabs.io, .in. oder .sg.) – Anfragen nach signierten URLs
verwenden den entsprechenden https://-Host.
Stellen Sie die Anwendung in Azure Container Apps bereit und erfassen Sie den öffentlichen FQDN:
Setzen Sie anschließend BRIDGE_PUBLIC_HOST=$FQDN und die ACS-Verbindungszeichenfolge als Secret in der App.
Mit Contributor (nicht Owner) kann az containerapp up die ACR-
Pull-Rolle der verwalteten Identität nicht erstellen. Aktivieren Sie den Admin-Nutzer der Registry (az acr update --admin-enabled true) und binden Sie ihn
mit az containerapp registry set ein. Führen Sie dann az containerapp update --image ... aus.
Schritt 3 – IncomingCall zur Bridge weiterleiten
Erstellen Sie für die ACS-Ressource ein Event-Grid-Abonnement, das IncomingCall an die Bridge sendet. Der oben gezeigte Validierungs-Handshake der Bridge schließt das Abonnement automatisch ab.
Das Abonnement wird in der Ansicht Events der ACS-Ressource angezeigt:

Wählen Sie die Nummer – der Agent nimmt den Anruf an.
Mit Teams verbinden
- Direktwahl: Ein Teams-Nutzer mit Teams Phone + Calling Plan kann die ACS-Nummer wie jede externe Nummer wählen.
- Teams-Ressourcenkonto (TPE): Binden Sie ein Teams-Ressourcenkonto mit Teams Phone Extensibility an die ACS-Ressource, damit Anrufe an das Ressourcenkonto denselben Ablauf
IncomingCall→ Bridge auslösen.
Anrufende
Wenn der Agent die Unterhaltung beendet (z. B. über sein Tool End Call), schließt ElevenLabs den WebSocket. Legen Sie die ACS-Verbindung auf, damit der Anrufer nicht in einer toten Leitung bleibt:
Warme Übergabe an einen Menschen
Die nativen Übergabe-Tools von ElevenLabs gelten nur, wenn ElevenLabs die Telefonie bereitstellt. Hier löst der Agent daher ein benutzerdefiniertes Client-Tool aus (z. B. transfer_to_human), das Ihre Bridge verarbeitet, indem sie den Menschen mit add_participant zum aktiven Anruf hinzufügt (warm), statt den Anruf blind weiterzuleiten:
ACS sendet AddParticipantSucceeded- / AddParticipantFailed-Callbacks an /api/callbacks. Geben Sie dem Agenten ein client_tool_result zurück, damit er seine Übergabezeile sagen kann. Die Konfiguration auf Agentenseite finden Sie unter System-Tools.
Setzen Sie die Übergabe-Sperre, sobald das Tool ausgelöst wird (vor dem Aufruf von add_participant), da ein schnelles Schließen des EL-
WebSockets mit dem Auflegen konkurrieren und den Anruf beenden kann, bevor der Mensch beitritt.
Fehlerbehebung
Kein IncomingCall erreicht die Bridge
Prüfen Sie, ob das Event-Grid-Abonnement bereitgestellt wurde (provisioningState: Succeeded) und ob die
Bridge über /api/incomingCall die Validierungsantwort zurückgegeben hat. Prüfen Sie, ob die Nummer eingehende
Anrufe unterstützt und sich in derselben ACS-Ressource befindet, für die das Abonnement erstellt wurde. Im Tab
Filters des Abonnements müssen die Ereignistypen Incoming Call enthalten:

CreateCallFailed / AddParticipantFailed bei einer internationalen Nummer
CreateCallFailed / AddParticipantFailed bei einer internationalen Nummer
ACS-Ausgänge zu einigen Zielen (z. B. Indien) sind eingeschränkt oder unzuverlässig. Verwenden Sie ein unterstütztes Ziel oder schalten Sie für die menschliche Verbindung eine SIP-/Operator-Nummer vor. Die Bridge-Logik bleibt unverändert – es handelt sich um einen Fehler auf Carrier-Ebene der ausgehenden Verbindung.
Audio ist verzerrt oder hat die falsche Geschwindigkeit
Beide Seiten müssen PCM 16 kHz Mono verwenden. Setzen Sie das Ein-/Ausgabeformat des Agenten auf pcm_16000. Die
Bridge protokolliert das ausgehandelte Format aus conversation_initiation_metadata.
Kann keine Nummer kaufen / Nummer ist in meinem Land nicht verfügbar
Der Nummernkauf erfordert einen kostenpflichtigen Abonnementtyp (MCA/EA/PAYG). Falls ACS in Ihrem Land keine Nummern anbietet, verwenden Sie stattdessen einen SIP-Anbieter.