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

使用Twilio播放S3公共URL音频时出现11200错误求助

问题:Twilio播放S3存储的音频报错Error 11200(HTTP检索失败)

我通过twilio-node播放AWS S3上的语音信箱问候音频时,通话末尾会提示"An application error has occurred...",Twilio控制台显示错误码11200(HTTP检索失败)。

相关细节

  • 用nestjs-s3上传音频,ContentType设为audio/x-wav,文件ACL已设为public-read,浏览器能正常打开播放该音频
  • 手动上传到同一S3路径的音频,Twilio可以正常播放

上传代码(nestjs-s3)

await this.s3
  .putBucketVersioning({
    Bucket: 'abc',
    VersioningConfiguration: {
      MFADelete: 'Disabled',
      Status: 'Enabled',
    },
  })
  .promise()
  .catch(error => {
    console.error(error);
    throw new ServiceUnavailableException(error, error.message);
  });

// 校验音频类型
if (file.mimetype.indexOf('audio/') === -1) {
  throw new UnsupportedMediaTypeException();
}
this.logger.debug(`file.mimetype: ${file.mimetype}`);
await this.s3
  .upload({
    Bucket: 'abc',
    Key: `voicemail-greetings/${slugify(file.originalname, {
      lower: true,
      locale: 'fr',
    })}`,
    Body: file.buffer,
    CacheControl: 'no-cache',
    ContentType: file.mimetype,
    ACL: 'public-read',
  })
  .promise()
  .catch(error => {
    if (error.code === 'NoSuchBucket') {
      this.logger.warn("Bucket doesnt exist");
      throw new UnprocessableEntityException(error, error.message);
    }
    throw new InternalServerErrorException(error, error.message);
  });

Twilio播放代码

const url = `https://abc.s3.eu-west-3.amazonaws.com/voicemailgreetings/${proTarget.proOrganizationId}.wav`;
voiceResponse.play(url);

生成的XML响应

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Play>https://abc.s3.eu-west-3.amazonaws.com/voicemail-greetings/18.wav</Play>
    <Record playBeep="true" action="/beta/pro/call/record-end"/>
</Response>

排查修复方案

  1. 核对S3对象元数据
    对比手动上传和代码上传文件的元数据,重点确认:

    • Content-Type必须是audio/x-wav,避免因文件识别问题导致Twilio无法解析
    • Content-Length是否和文件实际大小一致,排除上传时buffer损坏的可能
      可以临时把Cache-Control改成public, max-age=3600,测试是否是缓存策略导致的问题
  2. 严格校验URL路径
    上传代码的Key路径是voicemail-greetings/xxx,但Twilio代码里拼接的URL写的是voicemailgreetings/xxx(少了横杠),虽然XML里的路径是对的,但要确保每次生成的URL完全匹配S3对象的Key,避免拼写错误。

  3. 检查S3权限细节
    即便设置了public-read,也要确认:

    • 桶的Bucket Policy没有添加拒绝匿名访问的规则,避免覆盖ACL权限
    • 因为开启了桶版本化,要确保访问的是最新版本的音频对象
  4. 确认音频格式符合Twilio要求
    Twilio对WAV文件有硬性要求:

    • 采样率:8kHz或16kHz
    • 位深:16位
    • 声道:单声道
      可以用ffmpeg检查文件参数:
    ffmpeg -i your-file.wav
    

    如果不符合,转码后再上传测试。

  5. 模拟Twilio请求测试
    用curl模拟Twilio的请求头访问S3 URL,查看响应状态:

    curl -H "User-Agent: TwilioProxy/1.1" https://abc.s3.eu-west-3.amazonaws.com/voicemail-greetings/18.wav -I
    

    如果返回4xx/5xx,说明S3端存在访问问题;如果返回200,重点检查响应头的Content-Type是否正确。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:07:08