You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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)

关键注意事项

  1. 后端可访问性:确保你的后端服务有公网IP或使用隧道工具(如ngrok)暴露本地服务,Twilio才能回调成功。
  2. 权限配置:
    • AWS侧:给你的访问密钥配置S3存储桶的PutObject权限。
    • Twilio侧:确保你的账号允许读取录音文件(默认权限即可)。
  3. 文件格式:示例中使用MP3格式,你也可以替换为WAV(将URL中的.mp3改为.wav)。

内容的提问来源于stack exchange,提问作者Angela Rubchinksy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:25:35