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

Chrome M71后无用户激活调用speechSynthesis.speak()报错的解决及权限申请

解决Chrome中speechSynthesis.speak()无用户激活报错的问题

这是Chrome从版本71(2018年12月)开始推行的安全限制——为了避免网页未经用户许可自动播放音频造成骚扰,speechSynthesis.speak()必须在用户主动触发的交互事件(比如点击、触摸、键盘按键)的回调函数内调用,不能在页面加载完成后直接自动执行。

核心修复思路:绑定用户交互触发语音合成

这里提供两种常用的解决方案:

方案1:通过明确的用户操作触发(最直观)

给页面添加一个可交互元素(比如按钮),在用户点击它的时候执行语音合成:

<!-- HTML部分:添加触发按钮 -->
<button id="triggerSpeech">点击播放语音</button>
// JS部分:绑定点击事件
document.getElementById('triggerSpeech').addEventListener('click', () => {
  const utterance = new SpeechSynthesisUtterance("hello world");
  speechSynthesis.speak(utterance);
});

方案2:监听首次用户交互,解锁后续语音功能

如果需要在页面加载后不久播放语音,但又不想强制用户点击特定按钮,可以监听用户的第一次任意交互(点击页面任何位置),之后就可以自由调用语音合成:

let isSpeechActivated = false;

// 监听首次用户交互,激活语音权限
document.addEventListener('click', function activateSpeech() {
  if (!isSpeechActivated) {
    isSpeechActivated = true;
    // 首次交互后可以立即播放,或者初始化语音逻辑
    const utterance = new SpeechSynthesisUtterance("hello world");
    speechSynthesis.speak(utterance);
    // 只需要监听一次,之后移除该事件
    document.removeEventListener('click', activateSpeech);
  }
});

// 后续需要播放语音时,先检查激活状态
function playSpeech(text) {
  if (isSpeechActivated) {
    const utterance = new SpeechSynthesisUtterance(text);
    speechSynthesis.speak(utterance);
  } else {
    alert('请先点击页面任意位置,激活语音播放功能');
  }
}

关于权限的说明

这个限制不需要申请额外的浏览器权限(比如麦克风权限),它依赖的是Chrome的**用户激活状态(User Activation)**机制:只要调用speechSynthesis.speak()的代码是在用户主动触发的事件回调内执行,就会被浏览器允许。

需要注意的是,用户激活状态有一定的有效期,如果页面长时间没有用户交互,可能需要再次通过用户操作来激活。

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

火山引擎 最新活动