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

如何用原生JavaScript播放POST请求返回的audio/mpeg音频文件

解决思路及代码修正

你的核心问题是错误地用JSON解析了二进制音频数据:接口返回的是audio/mpeg格式的二进制流,不是JSON,所以调用response.json()必然触发解析错误。正确的处理方式是直接获取二进制Blob对象,再转换成浏览器可播放的音频URL。

修正后的完整代码

async function postTTS(url, data) {
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'xi-api-key': API_KEY_EL,
    },
    body: JSON.stringify(data),
  });
  // 关键:用blob()获取二进制音频数据,而非json()
  return response.blob();
}

// 绑定按钮点击事件(对应你HTML里的按钮id)
document.getElementById('outputSound').addEventListener('click', async () => {
  try {
    // 获取音频Blob对象
    const audioBlob = await postTTS(
      `https://api.elevenlabs.io/v1/text-to-speech/${bellaVoiceId}`,
      body
    );
    // 将Blob转换为浏览器可识别的临时音频URL
    const audioUrl = URL.createObjectURL(audioBlob);
    // 创建Audio实例并播放
    const audio = new Audio(audioUrl);
    await audio.play();
    // 播放结束后释放临时URL,避免内存泄漏
    audio.addEventListener('ended', () => {
      URL.revokeObjectURL(audioUrl);
    });
  } catch (err) {
    console.error('播放失败:', err);
  }
});

关键说明

  • response.blob():专门用于获取音频、图片这类二进制类型的响应数据,是处理文件流的正确方法。
  • URL.createObjectURL(blob):将Blob对象转换为浏览器可直接识别的临时URL,Audio对象可以通过这个URL加载并播放音频。
  • URL.revokeObjectURL(audioUrl):播放完成后主动释放临时URL,防止长期占用浏览器内存。

内容的提问来源于stack exchange,提问作者me-an-ape

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:13:26