Azure Communication Services
ACS Call Automation के ज़रिए यूज़र्स को उस फ़ोन नंबर पर कॉल करने दें, जिसका जवाब आपका ElevenLabs एजेंट देता है।
अवलोकन
इस तरीके से आपके एजेंट को एक फ़ोन नंबर मिलता है। कॉलर इस पर डायल करता है, Azure Communication Services (ACS) दो-तरफ़ा मीडिया स्ट्रीमिंग के साथ कॉल का जवाब देता है, और एक छोटा ब्रिज मानक एजेंट WebSocket प्रोटोकॉल का इस्तेमाल करके ACS और ElevenLabs एजेंट के बीच PCM ऑडियो रिले करता है। यह कॉन्टैक्ट सेंटर / IVR पैटर्न है — SIP ट्रंकिंग डिप्लॉयमेंट जैसा ही सेटअप, जिसमें ACS कैरियर है।
यह Teams से भी दो तरीकों से जुड़ता है: Calling Plan वाला Teams यूज़र सीधे ACS नंबर डायल कर सकता है, या आप नंबर के आगे Teams Phone Extensibility लगा सकते हैं, ताकि Teams रिसोर्स अकाउंट पर आने वाली कॉल ACS पर रूट हों।
ACS केवल कुछ सीमित देशों में PSTN नंबर प्रोविज़न करता है। अगर आपके क्षेत्र में नंबर उपलब्ध नहीं है, तो SIP ट्रंकिंग वाले SIP प्रोवाइडर का इस्तेमाल करें, या Graph calling bot इस्तेमाल करें।
यह कैसे काम करता है
दोनों लेग पर ऑडियो PCM 16 kHz मोनो होता है (एजेंट का इनपुट/आउटपुट फ़ॉर्मैट pcm_16000 है), इसलिए यह बिना री-सैंपलिंग के base64 के रूप में पास होता है।
ब्रिज ये रूट एक्सपोज़ करता है:
ज़रूरतें
- एक पेड Azure सब्सक्रिप्शन (MCA / EA / Pay-As-You-Go) — मुफ़्त/ट्रायल/स्पॉन्सरशिप सब्सक्रिप्शन नंबर नहीं खरीद सकते।
- एक Azure Communication Services रिसोर्स।
- सार्वजनिक WebSocket के साथ ब्रिज के लिए एक HTTPS होस्ट (Azure Container Apps, App Service, या VM)।
- दोनों लेग पर PCM 16000 Hz पर सेट एक ElevenLabs एजेंट: Voice टैब में TTS आउटपुट फ़ॉर्मैट और Advanced टैब में यूज़र इनपुट ऑडियो फ़ॉर्मैट।
अनुमतियां और रोल
Contributor के तहत (Owner नहीं), az containerapp up मैनेज्ड-आइडेंटिटी ACR pull
रोल असाइनमेंट नहीं बना सकता। इसके बजाय registry admin यूज़र सक्षम करें और उसे अटैच करें — चरण 2 में चेतावनी देखें।
चरण 1 — ACS रिसोर्स और नंबर प्रोविज़न करें
रिसोर्स में नंबर खरीदें (Portal → आपका ACS रिसोर्स → Phone numbers → Get, या phone-numbers SDK)। कॉल का जवाब देने वाले एजेंट के लिए inbound calling वाला नंबर काफ़ी है; अगर आप /api/outboundCall भी चाहते हैं, तो outbound क्षमता जोड़ें।

CLI से सत्यापित करने के लिए (az extension add --name communication ज़रूरी है), और ब्रिज द्वारा ACS_CONNECTION_STRING के रूप में इस्तेमाल की जाने वाली कनेक्शन स्ट्रिंग पाने के लिए:
चरण 2 — ब्रिज डिप्लॉय करें
ब्रिज azure-communication-callautomation का उपयोग करने वाला एक छोटा Flask + flask-sock ऐप है। इनबाउंड फ़्लो का मुख्य भाग:
/ws सॉकेट पर PCM16 को दोनों दिशाओं में रिले करें: ACS AudioData फ़्रेम को ElevenLabs में {"user_audio_chunk": "<base64>"} के रूप में फ़ॉरवर्ड करें, और एजेंट का ऑडियो वापस {"Kind":"AudioData","AudioData":{"Data":"<base64>"},"StopAudio":null} के रूप में भेजें। ACS का पहला फ़्रेम AudioMetadata होता है (नेगोशिएट किया गया फ़ॉर्मैट) — इसे लॉग करें और अनदेखा करें। ElevenLabs वाला भाग मानक एजेंट WebSocket प्रोटोकॉल है।
ACS हर दिशा के लिए अलग JSON केसिंग इस्तेमाल करता है: इसके भेजे गए इनबाउंड फ़्रेम camelCase (kind,
audioData.data) में होते हैं, जबकि इसके अपेक्षित आउटबाउंड फ़्रेम PascalCase (Kind, AudioData.Data,
StopAudio) में होते हैं। दोनों केस अलग रखें — नीचे दिया रिले इसे ही दर्शाता है।
यह रिले जानबूझकर न्यूनतम रखा गया है। प्रोडक्शन के लिए लॉगिंग, रिकनेक्शन और व्यवस्थित टियरडाउन जोड़ें। पूरा मैसेज रेफ़रेंस WebSocket दस्तावेज़ में है।
EL_WS एक पब्लिक एजेंट से कनेक्ट होता है। प्राइवेट एजेंट के लिए, ब्रिज से सर्वर-साइड एक अल्पकालिक
साइन किया हुआ URL मांगें — आपकी API key के साथ 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 कनेक्शन स्ट्रिंग (सीक्रेट के रूप में) सेट करें।
Contributor के तहत (Owner नहीं), az containerapp up मैनेज्ड-आइडेंटिटी ACR
pull रोल नहीं बना सकता। registry admin यूज़र सक्षम करें (az acr update --admin-enabled true) और इसे
az containerapp registry set के साथ अटैच करें, फिर az containerapp update --image ... चलाएं।
चरण 3 — IncomingCall को ब्रिज पर रूट करें
ACS रिसोर्स पर एक Event Grid सब्सक्रिप्शन बनाएं, जो IncomingCall को ब्रिज पर पोस्ट करे। ब्रिज का वैलिडेशन हैंडशेक (ऊपर) सब्सक्रिप्शन अपने-आप पूरा कर देता है।
सब्सक्रिप्शन 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 /api/callbacks पर AddParticipantSucceeded / AddParticipantFailed कॉलबैक भेजता है। एजेंट को 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 16 kHz मोनो होने चाहिए। एजेंट के इनपुट/आउटपुट फ़ॉर्मैट को pcm_16000 पर सेट करें; ब्रिज
conversation_initiation_metadata से नेगोशिएट किया फ़ॉर्मैट लॉग करता है।
नंबर नहीं खरीद पा रहे / मेरे देश में नंबर उपलब्ध नहीं है
नंबर खरीदने के लिए पेड सब्सक्रिप्शन प्रकार (MCA/EA/PAYG) चाहिए। अगर ACS आपके देश में नंबर नहीं देता, तो इसके बजाय SIP प्रोवाइडर इस्तेमाल करें।