我试图获取用户的语音输入,发送到 API,并说出 API 响应——本质上是循环播放,直到用户挂断电话。不幸的是,它是一个繁重的 API,因此需要 4-6 秒才能响应,导致用户最终陷入沉默。我想在这些静音期间播放 MP3 文件(在
<Gather>
完成监听之后,直到 API 响应准备就绪。
我有
twilio.php
<?php header('Content-Type: application/xml');
$bytes = random_bytes(15);
$threadId = bin2hex($bytes);
?>
<Response>
<Gather input="speech" action="/process.php?tid=<?php echo $threadId; ?>" method="POST">
<Say>How can I help you today?</Say>
</Gather>
</Response>
然后我有
process.php
<?php
$userInput = $_POST['SpeechResult'];
$ch = curl_init('https://internalapi.com/endpoint');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($userInput));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $api_key,
]);
$response = curl_exec($ch);
curl_close($ch);
$response_data = json_decode($response, true);
$responseFinal = $response_data['message']['content'];
header('Content-Type: application/xml');
echo '<Response><Gather input="speech" action="/process.php?tid='.$tid.'" method="POST"><Say>' . $responseFinal . '</Say></Gather></Response>';
内部 API 的响应可能需要 4-6 秒,导致用户方面陷入沉默。我想添加 2 秒的超时时间来收集,然后播放 mp3 文件,直到收到 API 响应。这在 PHP 中相对来说比较棘手。
关于如何实现这一目标有什么想法吗?
您可以以异步方式处理此问题,并返回一个仅在触发 API 调用时播放 MP3 的 TwiML。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Play loop="10">https://api.twilio.com/cowbell.mp3</Play>
</Response>
同时,您将保存呼叫 ID 并触发长时间运行的操作。操作完成后,您将使用新的 TwiMl 和下一个 <Gather>
修改调用。
<?php
// Update the path below to your autoload.php,
// see https://getcomposer.org/doc/01-basic-usage.md
require_once '/path/to/vendor/autoload.php';
use Twilio\Rest\Client;
// Find your Account SID and Auth Token at twilio.com/console
// and set the environment variables. See http://twil.io/secure
$sid = getenv("TWILIO_ACCOUNT_SID");
$token = getenv("TWILIO_AUTH_TOKEN");
$twilio = new Client($sid, $token);
$call = $twilio->calls("CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
->update([
"twiml" => "<Response><Gather>...</Gather></Response>"
]
);
print($call->to);