**AI外呼API**是一种RESTful通信接口,它允许开发者的应用程序无需编写复杂的通信协议代码,就能**向特定号码发起自动语音呼叫**,并在接通后通过AI模型进行智能对话。这使得传统的外呼系统从"人工操作"转变为"自动执行",大幅提升了效率和响应速度。
AI外呼的API集成主要分为三种类型,各有侧重:
1. **智能机器人API**:使用平台预置的AI对话机器人和意图识别模型。开发者无需自行训练AI或处理语音识别细节,只需通过API提交被叫号码列表,系统即可自动发起多轮对话。适合标准化、流程固定的外呼场景,如客户满意度回访、订单确认等。
2. **AI智能体(Agent)API**:这一模式提供了更高的灵活性。开发者可以**接入自己的大模型**(如OpenAI的GPT-4o-mini、DeepSeek、混元等),通过API控制对话内容。系统负责将用户的实时语音转文字,发给你的模型,再将模型回复的文字转成语音播报。
3. **传统语音通知API**:这是最基础的模式,主要用于批量播报固定内容。API仅负责发起呼叫和播放TTS或录音文件,不包含AI对话能力,适用于物流通知、紧急告警等无需交互的场景。
在动手写代码之前,快速完成以下准备即可。
| 项目 | 阿里云 | 腾讯云 | 蓝蓝通信 | Twilio |
|---|---|---|---|---|
| 核心产品 | 智能语音机器人 | TCCC联络中心 | 智能外呼 | Programmable Voice |
| 获取凭证 | 创建AccessKey,获取ID与Secret | 获取SecretId与SecretKey | 完成企业认证,获取API Key | 获取Account SID与Auth Token |
| 号码准备 | 购买或申请DID号码 | 使用测试号码或集成自有号码 | 购买或申请外呼号码 | 购买支持语音的Twilio号码 |
- **阿里云**:登录控制台,进入 **AccessKey管理** 创建密钥,妥善保存生成的 `AccessKey ID` 和 `AccessKey Secret`。
- **腾讯云**:获取 `SecretId` 和 `SecretKey`,并准备好已创建AI智能体后获取的 `AgentId`。
- **蓝蓝通信**:完成企业认证,在智能外呼控制台获取 `API Key` 和 `Secret Key`。
- **Twilio**:登录控制台,在仪表盘找到 `Account SID` 和 `Auth Token`,并准备好已购买的Twilio号码。
使用**AI智能体API**,需在管理端创建一个"代理人"。以腾讯云为例:
1. **创建AI智能体**:登录腾讯云联络中心(TCCC)工作台,在智能体管理中新建。你可以选择使用平台预置模型或接入自己的大模型(支持OpenAI、Azure及Minimax协议)。例如,通过API直接发起调用时,需提供模型参数。
2. **获取Agent ID**:创建完成后,在列表中复制该智能体的唯一标识ID,后续API调用中需要用到。
核心API端点一览表,可直接用于代码开发:
| API功能 | 阿里云 | 腾讯云 | 蓝蓝通信 | Twilio |
|---|---|---|---|---|
| 发起单次呼叫 | SingleCallByTts | CreateAICall | 实时调用 | client.calls.create |
| 发起批量呼叫 | BatchRobotSmartCall | CreateAutoCalloutTask | 批量任务 | 循环调用+异步队列 |
| 查询/控制呼叫 | QueryCallDetailByCallId | DescribeCallInfo | 回调与状态查询接口 | client.calls(call_sid).fetch() |
这是目前最先进的方式,代码量极少,AI会全自动完成对话。
```python
import requests
import json
import hashlib
import hmac
import time
# 准备请求
secret_id = "YOUR_SECRET_ID"
secret_key = "YOUR_SECRET_KEY"
timestamp = int(time.time())
service = "ccc"
host = "ccc.tencentcloudapi.com"
action = "CreateAIAgentCall"
version = "2020-02-10"
# 签名算法(此处为简化示意,实际需按照腾讯云API 3.0规范生成)
# 详情请参考官方签名文档
# 构造请求体
payload = {
"SdkAppId": 1400000000, # 你的应用ID
"AgentId": "YOUR_AGENT_ID", # 从控制台复制的智能体ID
"Callee": "0086139xxxxxxxx", # 被叫号码,须包含国家代码(如0086)
"Caller": "0086010xxxxxxxx", # 主叫号码
}
headers = {
"Content-Type": "application/json",
"X-TC-Action": action,
"X-TC-Version": version,
"X-TC-Timestamp": str(timestamp),
"X-TC-Region": "ap-guangzhou"
}
# 将签名加入headers,然后发送请求
# response = requests.post(f"https://{host}", headers=headers, data=json.dumps(payload))
```
```python
"LLMType": "openai", "Model": "deepseek-chat", "APIKey": "你的DeepSeek_API_Key", "APIUrl": "https://api.deepseek.com/v1/chat/completions"
```
```python
# 1. 安装依赖:pip install alibabacloud_dyvmsapi20170525
from alibabacloud_dyvmsapi20170525.client import Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dyvmsapi20170525 import models as dyvmsapi_models
from alibabacloud_tea_util import models as util_models
import os
import json
# 2. 配置凭证(建议使用环境变量)
config = open_api_models.Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
config.endpoint = 'dyvmsapi.aliyuncs.com'
client = Client(config)
# 3. 发起批量机器人外呼
request = dyvmsapi_models.BatchRobotSmartCallRequest(
called_show_number='0531xxxxxxxx', # 主叫号码
corp_name='您的企业名称', # 企业名称
called_number='1390000****' # 被叫号码
)
response = client.batch_robot_smart_call_with_options(request, util_models.RuntimeOptions())
print(json.dumps(response.body, default=str, indent=2))
```
最基础的API调用适合快速测试。
```python
from twilio.rest import Client
account_sid = "your_account_sid"
auth_token = "your_auth_token"
client = Client(account_sid, auth_token)
call = client.calls.create(
url="http://demo.twilio.com/docs/voice.xml", # 提供TwiML指令的URL
to="+8613800138000",
from_="+1234567890"
)
print(call.sid)
```
4.5 PHP代码示例
```php
<?php
function sendVoiceNotify($mobile, $content) {
$account = 'your_api_id';
$apiKey = 'your_api_key';
$url = 'https://www.lanlansms.com/webcall/voice/Submit.json';
$time = time();
$signStr = $account . $apiKey . $mobile . $content . $time;
$password = md5($signStr);
$data = [
'account' => $account,
'password' => $password,
'mobile' => $mobile,
'content' => $content,
'time' => $time
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result['code'] == 2) {
echo "语音通知发送成功,流水号:{$result['voiceid']}\n";
} else {
echo "发送失败:{$result['msg']}\n";
}
}
?>
```
```java
import com.tencentcloudapi.ccc.v20200210.CccClient;
import com.tencentcloudapi.ccc.v20200210.models.CreateAutoCalloutTaskRequest;
import com.tencentcloudapi.ccc.v20200210.models.CreateAutoCalloutTaskResponse;
CccClient client = new CccClient(cred, "ap-guangzhou");
CreateAutoCalloutTaskRequest req = new CreateAutoCalloutTaskRequest();
req.setSdkAppId(1400000000L);
req.setCallers(new String[]{"0086010xxxxxxxx"});
req.setCallees(new String[]{"0086139xxxxxxxx"});
req.setNotBefore(1642500621L);
req.setTries(2L);
CreateAutoCalloutTaskResponse resp = client.CreateAutoCalloutTask(req);
System.out.println("任务ID:" + resp.getTaskId());
```
无论是单次调用还是批量任务,最关键的性能瓶颈往往在于"并发"。
**QPS(每秒请求数)和CPS(每秒呼叫数)** 是硬指标。为避免触发运营商的"高频外呼"限制而导致封号,系统需要精确控制拨号节奏。
以腾讯云为例,API默认请求频率限制为 **20次/秒**,单个号码每日呼叫次数建议 **<3000次**。在生产环境中,不应直接循环调用,而应采用异步任务队列,并配置指数退避重试(例如,失败后间隔1秒、2秒、4秒递增重试,最多3次)。在大流量场景中,可利用**分布式消息队列(如Kafka或RabbitMQ)实现任务分发,支持优先级队列与重试机制**。
大流量场景下,可利用**分布式消息队列(如Kafka或RabbitMQ)实现任务分发,支持优先级队列与重试机制**,其伪代码实现逻辑如下:
```python
class CallScheduler:
def __init__(self):
self.queue = PriorityQueue() # 优先级队列管理任务
self.workers = [] # 工作节点池
def add_task(self, task):
priority = self._calculate_priority(task.type) # 催收>营销>通知
self.queue.put((priority, task))
```
集成中可能遇到以下错误类型:
**1. 鉴权类错误**
- `InvalidAccessKeyId.NotFound`:AccessKey不存在或已禁用。检查控制台密钥状态。
- `AuthFailure.SignatureFailure`:签名计算错误。检查签名算法和参数顺序。
**2. 号码与线路类错误**
- `InvalidParameter.PhoneNumber`:号码格式错误。使用国际标准格式(E.164),如 +8613800138000。
- 号码被拦截:号码质量差或未认证。使用合法运营商线路,配置归属地匹配(外呼北京客户使用010号段,接通率可提升25%-30%)。
**3. 合规与调用频次错误**
- 高频限制:触发运营商限流。在代码中实现令牌桶算法,控制拨号间隔(如每通电话间隔3秒)。
- `AccessDenied`:账户无权限或未开通服务。检查控制台是否已开通对应产品。
**4. 内容合规**
工信部等五部门新规要求,AI外呼必须在通话前3秒内主动告知"非真人交互"身份,且通话录音需留存不少于180天。
> **重要合规提醒**:为降低号码被投诉或标记的风险,需严格遵守运营商规则,并配置**一键退订**功能。使用官方认证的95/96/1010码号或企业实名认证号码,接听率远高于普通虚拟号段。
总结
AI外呼API的集成,正从简单的"语音播报"向更强大的"AI对话体"演进。开发者应优先尝试 **"AI智能体API"** ,只需传入Agent ID和号码,即可获得自然的多轮对话效果。对于个性化要求极高的项目,可使用**直接调用AI模型发起外呼**的方式,实现高度定制。
建议先通过免费试用或测试号码验证,逐步优化话术和AI交互逻辑,将各场景的外呼任务标准化、自动化。