在呼叫中心 AI 系统中,AI 代理需要主动发起 PSTN(公共交换电话网)通话,以实现与用户的实时交互。传统的电话系统依赖外部服务商,导致延迟高、成本不可控,而 Microsoft 的 call-center-ai 项目提供了一种 code-first API 方法,通过 Twilio 集成,直接调度通话并绑定电话号码,让 bot 与用户直连。这种方法的核心优势在于简化了架构,AI 代理可以像调用工具一样发起呼叫,避免了复杂的中介层。
API 调度机制的核心观点
观点一:API-phone-dispatching 将电话调度抽象为 RESTful 接口,AI 代理通过 JSON payload 指定目标号码、bot 端点和上下文参数,即可触发 PSTN 通叫。证据显示,这种设计支持 agent-initiated calls,例如在对话中检测到“打电话确认地址”意图后,立即 dispatch 一个呼叫会话。[1] 与事件驱动的 webhook 不同,这里是主动分发,适合低延迟场景。
落地参数:
- dispatch_url: POST /api/call/dispatch,headers: Authorization: Bearer {twilio_token}
- payload 示例:
{
"to": "+1234567890",
"bot_webhook": "https://your-bot.com/voice",
"context": {"user_id": "123", "intent": "address_confirm"},
"timeout": 30
}
- retry_policy: max_retries=3, backoff=exponential (1s, 2s, 4s),防止网络抖动导致失败。
- 并发限: per-agent 5 calls/min,避免 Twilio 速率限制 (默认 1 call/sec/account)。
电话号码绑定:bot 直连的关键
观点二:绑定(bind)机制允许动态分配 Twilio 号码给特定 bot,实现一对一交互,而非共享池导致的上下文混淆。绑定后,AI bot 可通过 WebSocket 或 SSE 实时处理语音转文本(STT)和文本转语音(TTS)。这绕过了传统 IVR(交互式语音应答),直接将 PSTN 接入 LLM 管道。
证据:项目中 bind API 返回一个临时号码,TTL 默认为 1 小时,支持续期。[1] 例如,代理预分配号码后,用户回拨即进入 bot 流,无需人工转接。
可落地清单:
- 初始化 Twilio:Account SID, Auth Token, 获取可用号码池 (search_numbers API)。
- bind 调用:POST /api/number/bind { "bot_id": "agent-001", "region": "US" } → 返回 { "number": "+1987654321", "sid": "PNxxx" }
- 释放机制:idle_timeout=300s 后 auto-release,或 manual unbind。
- 成本优化:优先用本地号码 (Caller ID matching),每月号码租赁
$1,通话按分钟计费 ($0.013/min)。
| 参数 |
默认值 |
推荐范围 |
说明 |
| bind_ttl |
3600s |
1800-7200s |
绑定存活期 |
| max_concurrent_calls |
10 |
5-20 |
代理并发上限 |
| stt_provider |
deepgram |
twilio/openai |
实时语音识别 |
集成 Twilio 的工程实践
Twilio 作为后端,提供 Programmable Voice API,支持 TwiML(Twilio Markup Language)或 webhook 桥接到 bot。观点三:通过自定义 Voice URL,PSTN 呼叫直接流式转录到 AI 管道,实现全双工对话,而非半双工 DTMF。
证据:call-center-ai 示例代码展示如何用 Node.js/ Python SDK 初始化 client,dispatch 时指定 url 到 bot handler。[2]
完整集成步骤:
- 环境准备:npm install twilio,或 pip install twilio。配置 .env: TWILIO_ACCOUNT_SID=ACxxx, TWILIO_AUTH_TOKEN=xxx。
- Dispatch 实现(Python 示例):
from twilio.rest import Client
client = Client(account_sid, auth_token)
call = client.calls.create(
to='+1234567890',
from_='+1987654321',
url='https://bot.example.com/voice?context=xxx'
)
- Bot webhook handler:用 Flask/FastAPI 接收 POST,解析 SpeechResult,返回 TwiML 或 。
- 监控点:
- Metrics:call_duration (目标 <300s/session), answer_rate (>80%), asr_wer (<10%)。
- 告警:dispatch_fail_rate >5%,触发回滚到短信 fallback。
- 日志:Twilio Monitor API,追踪 CallSid 事件 (initiated, ringing, answered, completed)。
风险与限流:
- 延迟风险:PSTN setup ~3-5s,建议 intent 后预热号码池。
- 合规模块:GDPR/CCPA,录音需 consent;中国区用阿里云号码桥接。
- 回滚策略:若 Twilio outage,fallback 到 email/SMS API。
这种 API-phone-dispatching 方案将呼叫中心从被动接听到 AI 主导,显著提升效率。实际部署中,从小规模 (10 agents) 测试,逐步 scale。
资料来源:
[1] https://github.com/microsoft/call-center-ai (README & examples)
[2] Twilio Programmable Voice Docs: https://www.twilio.com/docs/voice
(正文字数约 950)