如何将Twilio Voice API与AWS S3集成实现通话录音存储?
Twilio通话录音转存AWS S3实现方案
现有代码优化方向
你当前的代码已经实现了带录音的通话发起,但录音仅存储在Twilio服务器。要转存到S3,需通过Twilio的录音完成回调触发后端上传逻辑,参考Dropbox教程的流程替换为S3操作即可。
步骤1:修改通话创建代码,添加回调配置
在client.calls.create中增加录音完成后的回调地址,指定仅在录音完成时触发:
call = client.calls.create( record=True, url='http://demo.twilio.com/docs/voice.xml', to='+15558889988', from_='+18889992222', # 替换为你的后端公网接口地址 recording_status_callback='https://your-public-backend.com/save-to-s3', recording_status_callback_event=['completed'] ) print(call.sid)
步骤2:后端实现S3上传接口
使用Python的boto3(AWS SDK)处理上传,示例基于Flask框架:
from flask import Flask, request import boto3 from urllib.request import urlopen from base64 import b64encode app = Flask(__name__) # 配置必填参数 AWS_ACCESS_KEY = "你的AWS访问密钥" AWS_SECRET_KEY = "你的AWS私有密钥" S3_BUCKET = "你的S3存储桶名称" TWILIO_ACCOUNT_SID = "你的Twilio账号SID" TWILIO_AUTH_TOKEN = "你的Twilio认证令牌" # 初始化S3客户端和Twilio认证信息 s3_client = boto3.client( "s3", aws_access_key_id=AWS_ACCESS_KEY, aws_secret_access_key=AWS_SECRET_KEY ) twilio_auth = b64encode(f"{TWILIO_ACCOUNT_SID}:{TWILIO_AUTH_TOKEN}".encode()).decode() @app.route("/save-to-s3", methods=["POST"]) def save_recording_to_s3(): # 从Twilio回调中获取录音SID recording_sid = request.form.get("RecordingSid") if not recording_sid: return "Missing RecordingSid", 400 # 构造带认证的Twilio录音下载地址 recording_url = f"https://api.twilio.com/2010-04-01/Accounts/{TWILIO_ACCOUNT_SID}/Recordings/{recording_sid}.mp3" headers = {"Authorization": f"Basic {twilio_auth}"} # 下载录音文件并上传至S3 try: with urlopen(recording_url, headers=headers) as response: s3_client.put_object( Bucket=S3_BUCKET, Key=f"call-recordings/{recording_sid}.mp3", Body=response.read(), ContentType="audio/mpeg" ) return "Success", 200 except Exception as e: print(f"Upload failed: {str(e)}") return "Upload failed", 500 if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
关键注意事项
- 后端可访问性:确保你的后端服务有公网IP或使用隧道工具(如ngrok)暴露本地服务,Twilio才能回调成功。
- 权限配置:
- AWS侧:给你的访问密钥配置S3存储桶的
PutObject权限。 - Twilio侧:确保你的账号允许读取录音文件(默认权限即可)。
- AWS侧:给你的访问密钥配置S3存储桶的
- 文件格式:示例中使用MP3格式,你也可以替换为WAV(将URL中的
.mp3改为.wav)。
内容的提问来源于stack exchange,提问作者Angela Rubchinksy
相关产品推荐
相关产品推荐

