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

为何这段音频播放代码在Safari可用却无法在Chrome运行?

解决Chrome中无法播放谷歌翻译TTS音频的问题

谷歌翻译的TTS接口带有防盗链机制,Chrome下直接通过<audio>标签引用该URL会被服务器拒绝请求,而Safari的默认请求头恰好符合谷歌的验证规则,所以能正常播放。要在Chrome中实现播放,需要通过Fetch API模拟合法请求获取音频数据,再通过Blob URL播放,完全不需要生成本地MP3文件。

修改后的完整代码

<!DOCTYPE html>
<html>
<body>
<h2>Works in both Safari and Chrome</h2>
<button id="button" onclick="sound()">Play sound</button>
<p id="demo"></p>

<script>
async function sound() {
  try {
    // 构造目标音频请求URL
    const ttsUrl = 'https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=fr&q=je%20m%E2%80%99appelle%20Sebasti%C3%A9n';
    
    // 发送请求,模拟Chrome浏览器请求头绕过防盗链
    const response = await fetch(ttsUrl, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
      }
    });

    if (!response.ok) throw new Error('音频请求失败');
    
    // 将响应转为Blob二进制对象
    const audioBlob = await response.blob();
    // 生成本地可访问的Blob URL
    const audioUrl = URL.createObjectURL(audioBlob);

    // 创建临时音频元素播放
    const audio = new Audio(audioUrl);
    await audio.play();

    // 播放结束后释放Blob URL资源,避免内存泄漏
    audio.onended = () => {
      URL.revokeObjectURL(audioUrl);
    };
  } catch (err) {
    document.getElementById('demo').textContent = '播放失败: ' + err.message;
  }
}
</script>
</body>
</html>

核心改动说明

  • 请求头模拟:添加User-Agent头,让谷歌服务器识别为合法的Chrome浏览器请求,避免被拦截。
  • Blob URL播放:通过Fetch获取音频二进制数据转为Blob,再生成本地可访问的临时URL,绕开直接跨域引用的限制。
  • 资源清理:播放结束后主动释放Blob URL,避免浏览器内存占用过高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:31:58