You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

部署至Render后调用ElevenLabs API生成的音频无法在浏览器播放的问题排查

部署至Render后调用ElevenLabs API生成的音频无法在浏览器播放的问题排查

看起来你遇到的是本地运行正常,但部署到Render后,TTS音频无法播放的典型场景,结合你给出的错误信息和代码,我帮你梳理下排查方向和解决思路:

一、先搞懂错误的本质

你看到的报错:

"O atributo HTTP "Content-Type" de "application/json" não é suportado. Falha no carregamento do recurso de mídia blob..."
"Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable."

核心原因是:你的前端代码请求/tts接口后,拿到的不是预期的音频数据,而是JSON格式的错误响应

本地正常但部署后出错,说明问题根源在Render环境下的后端服务,你之前修改targetcurrentTarget的操作是正确的,但和当前报错无关。

二、第一步:排查Render上的后端日志

浏览器报了HTTP/2 500错误,这是服务器内部错误,肯定是后端在调用ElevenLabs API时出了问题。你可以:

  1. 登录Render控制台,找到你的Web Service,进入「Logs」标签页
  2. 查看/tts接口被调用时的后端日志,看有没有明确的报错信息(比如ElevenLabs API调用失败、密钥无效、网络超时等)

本地正常但部署后出错,最常见的原因是环境变量没同步到Render:比如你本地配置了ElevenLabs的API_KEY,但在Render的服务配置里没添加这个环境变量,导致后端拿不到密钥,调用ElevenLabs API直接失败,返回500错误(JSON格式的错误信息)。

三、第二步:用浏览器开发者工具确认接口返回

在部署后的页面上,打开浏览器的「开发者工具」→「Network」标签,然后点击按钮触发/tts请求:

  1. 找到这个POST请求,查看它的「Response」内容:如果返回的是JSON(比如{"error": "API key invalid"}之类的),那就能实锤后端调用ElevenLabs API失败了
  2. 查看「Response Headers」里的Content-Type:如果是application/json而不是audio/mpeg(ElevenLabs返回的标准音频类型),那说明后端根本没返回音频,而是返回了错误的JSON

四、前端代码可以加容错处理

虽然问题根源在后端,但你可以给前端的audio函数加一些错误处理,提前发现问题,而不是直接播放错误的Blob:

async function audio(textToRead) {
  try {
    const response = await fetch('/tts', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({text: textToRead})
    });

    // 先检查请求是否成功
    if (!response.ok) {
      const errorInfo = await response.json().catch(() => '未知错误');
      console.error('TTS接口调用失败:', errorInfo);
      alert('生成音频失败,请稍后重试');
      return;
    }

    const audioBlob = await response.blob();
    // 检查返回的Blob是否是音频类型
    if (!audioBlob.type.startsWith('audio/')) {
      console.error('接口返回的不是音频数据:', audioBlob);
      return;
    }

    const audioUrl = URL.createObjectURL(audioBlob);
    const audio = new Audio(audioUrl);
    await audio.play();
  } catch (err) {
    console.error('音频播放出错:', err);
  }
}

五、后端需要确认的点

如果你能看到后端代码,还要检查:

  • 调用ElevenLabs API时,是否正确传递了参数,并且把ElevenLabs返回的音频流原样转发给前端
  • 转发时是否设置了正确的Content-Type头(应该和ElevenLabs返回的一致,比如audio/mpeg
  • 如果ElevenLabs API调用失败,后端是否返回了正确的错误状态码,并且不要把错误的JSON当成音频返回给前端

最后总结

你现在的问题和前端的target/currentTarget无关,核心是Render上的后端服务调用ElevenLabs API失败,返回了JSON格式的500错误,而不是音频数据,导致前端把错误的JSON转成Blob后,浏览器无法识别为音频而报错。先从后端日志和环境变量查起,应该就能快速定位问题了!

火山引擎 最新活动