如何通过Twilio API获取视频通话录音中音频的转写文本
Twilio视频通话音频离线转写实现方案
Twilio Programmable Video 本身不直接绑定录音转写能力,视频通话的音轨是独立存储的,离线转写走Twilio语音识别服务的异步任务链路即可,全程不需要实时处理流,具体实现步骤如下:
第一步:筛选并获取音频录音资源
视频房间开启录制后,默认会生成三类录制文件:独立视频轨、独立音频轨、合并音视频文件。你当前拿到的RecordingInstance列表里,先筛选出type属性为audio的实例即可拿到纯音频录音资源。
多人房间下每个参会者的音频会单独存为一条音频录音记录,需要逐个处理。
参考PHP代码:/** @var \Twilio\Rest\Client $twilio */ $roomSid = 'RMxxxxxxxxxxxx'; // 替换为目标房间的SID // 拉取指定房间下所有录制资源,筛选音频类记录 $audioRecordings = array_filter( $twilio->video->recordings->read(['groupingSid' => $roomSid]), fn($rec) => $rec->type === 'audio' ); // 取单条音频记录的媒体访问地址(多人场景需遍历所有音频记录) $audioMediaUrl = $audioRecordings[0]->mediaUrl;注意:
mediaUrl是带访问权限控制的,Twilio内部服务可以直接拉取该地址的资源,如果你要自己下载需要用Account SID和Auth Token做Basic Auth鉴权。第二步:创建异步离线转写任务
拿到音频媒体地址后,直接调用转写接口创建异步任务即可,不需要手动下载再上传音频文件,Twilio会自动拉取存储侧的音频完成识别。
参考PHP代码:$transcription = $twilio->transcriptions->create([ 'mediaUrl' => $audioMediaUrl, 'languageCode' => 'zh-CN', // 根据实际音频语言调整,英文填en-US 'speakerDiarization' => true, // 多人场景建议开启,可自动区分不同说话人 'statusCallback' => 'https://你的服务自有地址/twilio/transcribe-notify' // 转写结果回调地址,可选 ]); $transcribeTaskSid = $transcription->sid; // 保存任务SID,用于后续查询结果第三步:获取最终转写结果
两种方式可取回结果,优先推荐回调方式,避免轮询带来的额外请求开销:- 回调模式:转写任务完成(或失败)后,Twilio会主动向你配置的
statusCallback地址推送全量结果,包含完整转写文本、说话人分段、时间戳等信息,直接解析请求体即可。 - 轮询模式:如果不配置回调,可定期通过任务SID查询转写状态,待状态为
completed时即可取回结果,参考代码:
do { $taskInfo = $twilio->transcriptions($transcribeTaskSid)->fetch(); if ($taskInfo->status === 'failed') { // 自行处理转写失败逻辑,比如检查音频是否损坏、语言参数是否正确 break; } if ($taskInfo->status === 'completed') { $fullTranscribeText = $taskInfo->transcriptionText; // 完整转写文本 $speakerSegments = $taskInfo->utterances; // 开启说话人分离时返回的分段内容 break; } sleep(5); // 轮询间隔建议不短于5秒,避免触发接口限流 } while (true);- 回调模式:转写任务完成(或失败)后,Twilio会主动向你配置的
补充说明:
如果你已经配置了视频录制自动同步到自有云存储,直接传入自有存储中音频文件的可访问地址(支持带签名的临时访问地址)作为mediaUrl即可,转写流程完全一致。默认录制文件在Twilio侧保留30天,可在控制台调整保留周期,注意在录音过期前发起转写任务。
内容的提问来源于stack exchange,提问作者user10099
相关产品推荐
相关产品推荐

