基于PHP RestAPI实现Twilio通话录音下载及转写问题求助
问题分析与解决方案
核心错误点
- recording.php语法致命错误:
require DIR . '/vendor/autoload.php';中DIR是未定义常量,必须改为__DIR__,这是引发500错误的直接原因。 - 录音配置重复冲突:
dailcall.php中同时设置record: true和指定url指向recording.php手动创建录音,导致Twilio流程冲突,触发异常。 - 参数格式错误:
recording.php中transcribe使用字符串'true',Twilio要求该参数为布尔值true。
修正后的代码实现
方案一:直接通过通话创建配置实现30秒录音+转写(推荐)
无需额外中间文件,直接在创建通话时完成所有配置,避免流程冲突。
dailcall.php
$call = $twilio->calls ->create($to, // 目标号码 $from, // Twilio号码 [ "record" => true, "recordingDuration" => 30, // 限制最长录音30秒 "recordingChannels" => "dual", "transcribe" => true, "recordingStatusCallback" => "https://twilioxxxx.tk/api/araonvlad_bot/read_Recording.php", "recordingStatusCallbackMethod" => "POST", "transcribeCallback" => "https://twilioxxxx.tk/api/araonvlad_bot/read_Transcription.php", // 单独接收转写结果 "StatusCallbackMethod" => "POST", "StatusCallbackEvent" => ["in-progress", "completed"] ] );
方案二:通过TwiML手动触发录音(适合复杂场景)
如果需要在通话过程中手动控制录音时机,修正recording.php并调整dailcall.php配置:
dailcall.php
$call = $twilio->calls ->create($to, // 目标号码 $from, // Twilio号码 [ "method" => "POST", "url" => "https://twilioxxxx.tk/api/araonvlad_bot/recording.php", "StatusCallbackMethod" => "POST", "StatusCallbackEvent" => ["in-progress", "completed"] ] );
recording.php
use Twilio\Rest\Client; require __DIR__ . '/vendor/autoload.php'; // 修正__DIR__常量 // 返回TwiML指令启动录音(之前错误地用API创建,Twilio要求通过TwiML控制通话流程) header('Content-Type: application/xml'); echo '<?xml version="1.0" encoding="UTF-8"?>'; echo '<Response>'; echo '<Record maxLength="30" transcribe="true" recordingStatusCallback="https://twilioxxxx.tk/api/araonvlad_bot/read_Recording.php" recordingChannels="dual"/>'; echo '</Response>';
read_Recording.php(处理录音下载与转写存储)
require __DIR__ . '/vendor/autoload.php'; use Twilio\Rest\Client; $twilio = new Client("AC8b2cc96be2a8dbc059f29xxxxx", "88db8eeb71124a3effd6c19681xxxx"); // 记录请求日志 file_put_contents('request.log', "\n" . json_encode($_REQUEST) . ' - read Recording File: - ' . "\n", FILE_APPEND); $recordingSid = $_REQUEST['RecordingSid']; // 1. 下载MP3录音文件 $recording = $twilio->recordings($recordingSid)->fetch(); $fullMp3Url = 'https://api.twilio.com' . $recording->uri . '.mp3'; // 确保recordings目录存在且有写入权限 $localMp3Path = 'recordings/' . $recordingSid . '.mp3'; file_put_contents($localMp3Path, file_get_contents($fullMp3Url)); // 2. 获取并保存转写文本 $transcriptions = $twilio->recordings($recordingSid)->transcriptions->read(); foreach ($transcriptions as $transcription) { $localTxtPath = 'transcriptions/' . $recordingSid . '.txt'; file_put_contents($localTxtPath, $transcription->transcriptionText); }
额外注意事项
- 确保服务器上
recordings/和transcriptions/目录存在且具备写入权限。 - 你的服务器必须能被公网访问,且使用有效SSL证书(Twilio要求Webhook地址为HTTPS)。
- 确认Twilio账户已开通转写功能,且账户余额充足。
内容的提问来源于stack exchange,提问作者NomanJaved
相关产品推荐
相关产品推荐

