Azure Communication Services
ACS Call Automationを介して、ElevenLabsエージェントが応答する電話番号にユーザーが発信できるようにします。
概要
この方法では、エージェントに電話番号を割り当てます。発信者がその番号に電話をかけると、Azure Communication Services(ACS)が双方向メディアストリーミングで応答し、小さなブリッジが標準のエージェントWebSocketプロトコルを使用して、ACSとElevenLabsエージェント間でPCMオーディオを中継します。これはコンタクトセンター/IVRのパターンであり、SIPトランキングのデプロイと同じ構成で、ACSがキャリアとなります。
Teamsにも2通りの方法で接続できます。Calling Planを持つTeamsユーザーはACS番号に直接発信できます。また、Teams Phone Extensibilityを番号の前段に置くことで、Teamsリソースアカウントへの通話をACSにルーティングできます。
ACSがPSTN番号を提供しているのは、限られた 国のみです。 お住まいの地域で番号を利用できない場合は、代わりにSIP トランキング対応のSIPプロバイダー、またはGraph通話 ボットを使用してください。
仕組み
オーディオは両方の経路でPCM 16kHzモノラル(エージェントの入出力形式はpcm_16000)のため、リサンプリングなしでbase64としてそのまま渡されます。
ブリッジは次のルートを公開します。
要件
- 有料のAzureサブスクリプション(MCA/EA/従量課金制)— 無料版、試用版、スポンサーシップのサブスクリプションでは番号を購入できません。
- Azure Communication Servicesリソース。
- パブリックWebSocketを備えたブリッジ用HTTPSホスト(Azure Container Apps、App Service、またはVM)。
- 両方の経路でPCM 16000Hzに設定したElevenLabsエージェント:VoiceタブでTTS出力形式を、Advancedタブでユーザー入力オーディオ形式を設定します。
権限とロール
共同作成者権限の場合(所有者ではない場合)、az containerapp upはマネージドIDのACRプル
ロール割り当てを作成できません。代わりにレジストリの管理者ユーザーを有効にしてアタッチしてください。手順2の警告を参照してください。
手順1 — ACSリソースと番号をプロビジョニングする
リソース内で番号を購入します(ポータル → ACSリソース → Phone numbers → Get、またはphone-numbers SDK)。通話に応答するエージェントでは、着信通話対応の番号で十分です。/api/outboundCallも使用する場合は、発信機能も追加してください。

CLIから確認するには(az extension add --name communicationが必要)、また、ブリッジがACS_CONNECTION_STRINGとして使用する接続文字列を取得するには、次を実行します。
手順2 — ブリッジをデプロイする
ブリッジは、azure-communication-callautomationを使用する小規模なFlask + flask-sockアプリです。着信フローの中核は次のとおりです。
/wsソケットでは、PCM16を双方向に中継します。ACSのAudioDataフレームを{"user_audio_chunk": "<base64>"}としてElevenLabsに転送し、エージェントのオーディオを{"Kind":"AudioData","AudioData":{"Data":"<base64>"},"StopAudio":null}として返送します。ACSが最初に送信するフレームはAudioMetadata(ネゴシエートされた形式)です。ログに記録して無視してください。ElevenLabs側では標準のエージェントWebSocketプロトコルを使用します。
ACSでは方向ごとにJSONの大文字・小文字が異なります。受信フレーム、つまりACSが送信するフレームはキャメルケース(kind、
audioData.data)ですが、送信フレーム、つまりACSが期待するフレームはパスカルケース(Kind、AudioData.Data、
StopAudio)です。2つのケースを区別してください。以下のリレーではこの違いを反映しています。
このリレーは意図的に最小限にしています。本番環境では、ロギング、再接続、正常な 終了処理を追加してください。メッセージの完全なリファレンスはWebSocket ドキュメントにあります。
EL_WSはパブリックエージェントに接続します。プライベートエージェントの場合は、ブリッジからサーバー側で短期間有効な
署名付きURLをリクエストしてください。APIキーを使用してGET /v1/convai/conversation/get-signed-url?agent_id=...を実行し、
代わりに返されたURLに接続します。データ
レジデンシーでは、ELEVENLABS_ORIGINをレジデンシーホスト
(wss://api.eu.residency.elevenlabs.io、.in.、または.sg.)に設定します。署名付きURLのリクエストでは対応するhttps://ホストを
使用します。
Azure Container Appsにデプロイし、パブリックFQDNを取得します。
次に、アプリでBRIDGE_PUBLIC_HOST=$FQDNとACS接続文字列(シークレットとして)を設定します。
共同作成者権限の場合(所有者ではない場合)、az containerapp upはマネージドIDのACR
プルロールを作成できません。レジストリの管理者ユーザーを有効化し(az acr update --admin-enabled true)、
az containerapp registry setでアタッチしてから、az containerapp update --image ...を実行してください。
手順3 — IncomingCallをブリッジにルーティングする
ACSリソース上に、IncomingCallをブリッジへPOSTするEvent Gridサブスクリプションを作成します。ブリッジの検証ハンドシェイク(上記)により、サブスクリプションは自動的に完了します。
サブスクリプションはACSリソースのEventsブレードに表示されます。

番号に電話をかけると、エージェントが応答します。
Teamsへの接続
- **直接発信:**Teams PhoneとCalling Planを持つTeamsユーザーは、他の外線番号と同様にACS番号へ発信できます。
- Teamsリソースアカウント(TPE):Teams Phone ExtensibilityでTeamsリソースアカウントをACSリソースにバインドすると、リソースアカウントへの通話で同じ
IncomingCall→ ブリッジのフローが実行されます。
通話終了
エージェントが会話を終了すると(たとえば、End Callツールを使用した場合)、ElevenLabsはWebSocketを閉じます。発信者が切断された回線に残らないよう、ACS側の通話を切断します。
担当者へのウォーム転送
ElevenLabsネイティブの転送ツールは、ElevenLabsがテレフォニーを管理している場合にのみ適用されます。そのため、ここではエージェントがカスタムクライアントツール(例:transfer_to_human)を起動し、ブリッジがadd_participantで担当者をライブ通話に追加することで処理します。ブラインド転送ではなくウォーム転送です。
ACSはAddParticipantSucceeded/AddParticipantFailedコールバックを/api/callbacksに送信します。エージェントが引き継ぎの案内を話せるよう、client_tool_resultを返してください。エージェント側の設定については、システムツールを参照してください。
ツールの実行直後に(add_participantを呼び出す前に)転送ガードを設定してください。そうしないと、ELの高速な
WebSocket切断と通話切断が競合し、担当者が参加する前に通話が切断される可能性があります。
トラブルシューティング
IncomingCallがブリッジに届かない
Event Gridサブスクリプションがプロビジョニング済みであること(provisioningState: Succeeded)、および
ブリッジの/api/incomingCallが検証エコーを返したことを確認してください。番号に着信通話機能があり、サブスクリプションと
同じACSリソース内にあることも確認してください。サブスクリプションの
Filtersタブでは、イベントタイプにIncoming Callが含まれている必要があります。

国際電話番号でCreateCallFailed/AddParticipantFailedが発生する
国際電話番号でCreateCallFailed/AddParticipantFailedが発生する
一部の宛先(例:インド)へのACS発信は制限されている、または断続的に失敗することがあります。サポート対象の宛先を使用するか、担当者側の回線をSIP/Operator番号にしてください。ブリッジのロジックには影響しません。これは発信側回線におけるキャリアレベルの障害です。
音声が歪む、または速度がおかしい
両側ともPCM 16kHzモノラルである必要があります。エージェントの入出力形式をpcm_16000に設定してください。ブリッジはconversation_initiation_metadataからネゴシエートされた形式をログに記録します。
番号を購入できない/自国で番号を利用できない
番号の購入には有料のサブスクリプションタイプ(MCA/EA/PAYG)が必要です。ACSがお住まいの国で番号を提供していない場合は、代わりにSIPプロバイダーを使用してください。