Azure Communication Services
Permita que os usuários liguem para um número de telefone atendido pelo seu agente da ElevenLabs, via ACS Call Automation.
Visão geral
Essa abordagem dá ao seu agente um número de telefone. Quem liga disca para ele, o Azure Communication Services (ACS) atende com streaming de mídia bidirecional, e uma pequena ponte retransmite o áudio PCM entre o ACS e o agente da ElevenLabs usando o protocolo WebSocket do agente padrão. É o padrão de central de atendimento / URA — a mesma estrutura de uma implantação de tronco SIP, com o ACS como operadora.
Ele também se conecta ao Teams de duas formas: um usuário do Teams com um Plano de Chamadas pode discar diretamente para o número do ACS, ou você pode colocar Teams Phone Extensibility na frente do número para que chamadas a uma conta de recurso do Teams sejam roteadas para o ACS.
O ACS provisiona números PSTN apenas em um conjunto limitado de países. Se um número não estiver disponível na sua região, use um provedor SIP com tronco SIP ou o bot de chamadas do Graph.
Como funciona
O áudio é PCM mono de 16 kHz em ambas as pontas (o formato de entrada/saída do agente é pcm_16000), então ele é transmitido como base64 sem reamostragem.
A ponte expõe estas rotas:
Requisitos
- Uma assinatura paga do Azure (MCA / EA / Pay-As-You-Go) — assinaturas gratuitas/de avaliação/patrocinadas não podem comprar números.
- Um recurso do Azure Communication Services.
- Um host HTTPS para a ponte com um WebSocket público (Azure Container Apps, App Service ou uma VM).
- Um agente da ElevenLabs configurado para PCM 16000 Hz em ambas as pontas: formato de saída TTS na aba Voice e formato de áudio de entrada do usuário na aba Advanced.
Permissões e funções
Com a função Colaborador (e não Proprietário), az containerapp up não consegue criar a atribuição
da função de pull do ACR para a identidade gerenciada. Em vez disso, habilite o usuário administrador do registro
e anexe-o — veja o aviso na Etapa 2.
Etapa 1 — Provisionar o recurso ACS e o número
Compre um número no recurso (Portal → seu recurso ACS → Phone numbers → Get, ou o SDK de phone-numbers). Para um agente que atende chamadas, basta um número com chamadas recebidas; adicione a capacidade de saída se também quiser usar /api/outboundCall.

Para verificar pela CLI (requer az extension add --name communication) e buscar a string de conexão que a ponte usa como ACS_CONNECTION_STRING:
Etapa 2 — Implantar a ponte
A ponte é um pequeno app Flask + flask-sock que usa azure-communication-callautomation. O núcleo do fluxo de entrada:
No socket /ws, retransmita PCM16 nas duas direções: encaminhe frames AudioData do ACS para a ElevenLabs como {"user_audio_chunk": "<base64>"} e envie o áudio do agente de volta como {"Kind":"AudioData","AudioData":{"Data":"<base64>"},"StopAudio":null}. O primeiro frame enviado pelo ACS é AudioMetadata (o formato negociado) — registre-o em log e ignore-o. O lado da ElevenLabs usa o protocolo WebSocket do agente padrão.
O ACS usa diferentes convenções de maiúsculas e minúsculas no JSON em cada direção: os frames recebidos que ele envia usam camelCase (kind,
audioData.data), enquanto os frames de saída que ele espera usam PascalCase (Kind, AudioData.Data,
StopAudio). Mantenha os dois formatos distintos — a retransmissão abaixo segue isso.
Essa retransmissão é intencionalmente mínima. Para produção, adicione logs, reconexão e encerramento adequado. A referência completa de mensagens está na documentação de WebSocket.
EL_WS conecta-se a um agente público. Para um agente privado, faça a ponte solicitar no servidor uma URL
assinada de curta duração — GET /v1/convai/conversation/get-signed-url?agent_id=... com sua chave de API
— e conecte-se à URL retornada. Para residência de
dados, defina ELEVENLABS_ORIGIN como seu host de
residência (wss://api.eu.residency.elevenlabs.io, .in. ou .sg.) — solicitações de URL assinada
usam o host https:// correspondente.
Implante no Azure Container Apps e capture o FQDN público:
Em seguida, defina BRIDGE_PUBLIC_HOST=$FQDN e a string de conexão do ACS (como segredo) no app.
Com a função Colaborador (e não Proprietário), az containerapp up não consegue criar a função de
pull do ACR para a identidade gerenciada. Habilite o usuário administrador do registro (az acr update --admin-enabled true) e anexe-o
com az containerapp registry set; depois, use az containerapp update --image ....
Etapa 3 — Rotear IncomingCall para a ponte
Crie uma assinatura do Event Grid no recurso ACS que envie IncomingCall para a ponte. O handshake de validação da ponte (acima) conclui a assinatura automaticamente.
A assinatura aparece na tela Events do recurso ACS:

Disque para o número — o agente atende.
Como conectar ao Teams
- Discagem direta: um usuário do Teams com Teams Phone + Plano de Chamadas pode discar para o número ACS como qualquer número externo.
- Conta de recurso do Teams (TPE): vincule uma conta de recurso do Teams ao recurso ACS com Teams Phone Extensibility para que chamadas à conta de recurso disparem o mesmo fluxo
IncomingCall→ ponte.
Fim da chamada
Quando o agente encerra a conversa (por exemplo, com a ferramenta End Call), a ElevenLabs fecha o WebSocket. Desligue a ponta do ACS para que quem ligou não fique em uma linha sem resposta:
Transferência assistida para uma pessoa
As ferramentas nativas de transferência da ElevenLabs só se aplicam quando a ElevenLabs controla a telefonia. Portanto, aqui o agente dispara uma ferramenta de cliente personalizada (por exemplo, transfer_to_human) que sua ponte processa adicionando a pessoa à chamada ativa com add_participant (assistida), em vez de uma transferência cega:
O ACS emite callbacks AddParticipantSucceeded / AddParticipantFailed para /api/callbacks. Retorne um client_tool_result ao agente para que ele possa dizer sua frase de transferência. Consulte ferramentas do sistema para ver a configuração do lado do agente.
Defina a proteção de transferência assim que a ferramenta for acionada (antes de chamar add_participant), ou um fechamento rápido do
WebSocket da EL poderá competir com o desligamento e encerrar a chamada antes de a pessoa entrar.
Solução de problemas
Nenhum IncomingCall chega à ponte
Confirme que a assinatura do Event Grid foi provisionada (provisioningState: Succeeded) e que a
/api/incomingCall da ponte retornou a confirmação de validação. Confirme que o número permite chamadas recebidas
e está no mesmo recurso ACS em que está a assinatura. Na aba Filters da assinatura,
os tipos de evento devem incluir Incoming Call:

CreateCallFailed / AddParticipantFailed para um número internacional
CreateCallFailed / AddParticipantFailed para um número internacional
Chamadas de saída do ACS para alguns destinos (por exemplo, Índia) são restritas ou intermitentes. Use um destino compatível ou coloque um número SIP/de operadora na frente da ponta humana. A lógica da ponte não é afetada — é uma falha no nível da operadora na ponta de saída.
O áudio está distorcido ou na velocidade errada
Os dois lados devem usar PCM mono de 16 kHz. Defina o formato de entrada/saída do agente como pcm_16000; a
ponte registra o formato negociado em conversation_initiation_metadata.
Não consigo comprar um número / número não disponível no meu país
A compra de números requer um tipo de assinatura paga (MCA/EA/PAYG). Se o ACS não oferecer números no seu país, use um provedor SIP.