如何用PHP开发系统主动外呼并捕获用户语音回复的IVR应用
实现方案及问题修正
核心问题梳理
- 你当前外呼绑定的TwiML地址指向了内容为空的
voice.xml,没有加载任何语音交互逻辑,用户接起电话后无交互触发点,自然无法捕获回复 - 带
<Gather>语音捕获逻辑的TwiML生成代码和外呼发起代码写在了同一个文件中,逻辑拆分错误 - Gather参数存在语法错误,空键
''=>'true'会导致TwiML生成异常,Twilio无法正常解析 - 回调地址要确保是公网可访问的,Twilio才能正常推送识别结果
修正后代码示例
1. 外呼发起文件(call.php)
<?php require_once 'vendor/autoload.php'; use Twilio\Rest\Client; $sid = "你的Account SID"; $token = "你的Auth Token"; $twilio = new Client($sid, $token); $call = $twilio->calls->create( "+1310XXXXXXX", // 被叫号码 "+15676777774", // 你的Twilio号码 [ "method" => "GET", // 这里填你部署的IVR逻辑文件的公网地址 "url" => "http://你的域名/ivr_logic.php" ] ); echo "外呼已发起,呼叫SID:".$call->sid;
2. IVR交互逻辑文件(ivr_logic.php)
<?php require_once 'vendor/autoload.php'; use Twilio\TwiML\VoiceResponse; $response = new VoiceResponse(); // 修正参数错误,删除空键,补齐合理配置 $gather = $response->gather([ 'action' => 'http://你的域名/completed.php', // 直接写绝对回调地址避免路径错误 'method' => 'GET', 'input' => 'speech', 'timeout' => 3, 'endOnSilence' => 1, // 静默1秒就判定用户说完 'speech_model' => 'phone' ]); $gather->say('请说出你要反馈的内容'); // 用户超时没说话的兜底逻辑 $response->say('未检测到你的语音输入,呼叫即将结束'); $response->hangup(); // 输出TwiML时指定Content-Type为xml header('Content-Type: application/xml'); echo $response;
3. 结果接收文件(completed.php)
<?php // 语音识别结果在GET参数的SpeechResult字段里,呼叫SID在CallSid字段,可一起存储 $log = "呼叫ID:".$_GET['CallSid'].",识别结果:".$_GET['SpeechResult'].",完整参数:".$_SERVER['QUERY_STRING'].PHP_EOL; file_put_contents('voice.txt', $log, FILE_APPEND); // 加FILE_APPEND避免每次覆盖之前的记录 // 接收完后要给Twilio返回合法的TwiML,否则会报错 require_once 'vendor/autoload.php'; use Twilio\TwiML\VoiceResponse; $response = new VoiceResponse(); $response->say('你的反馈已收到,感谢使用,再见'); $response->hangup(); header('Content-Type: application/xml'); echo $response;
额外注意事项
- 所有提供给Twilio访问的文件,都必须部署在公网可访问的服务器上,不能用本地localhost地址
- 要确保你的Twilio账号已经开通语音识别相关权限,号码也配置了外呼权限
- 可以先在Twilio控制台的TwiML调试工具里验证你的ivr_logic.php生成的TwiML是否合法,再测试外呼
内容的提问来源于stack exchange,提问作者Gautam Sharma
相关产品推荐
相关产品推荐

