Twilio - 如何在收集完成和收集操作完成之间播放音乐 - 等待繁重的 API 运行?

问题描述 投票:0回答:1

我试图获取用户的语音输入,发送到 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 中相对来说比较棘手。

关于如何实现这一目标有什么想法吗?

php twilio
1个回答
1
投票

您可以以异步方式处理此问题,并返回一个仅在触发 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);
© www.soinside.com 2019 - 2024. All rights reserved.