自M71

时间:2019-01-19 08:44:51

标签: javascript google-chrome speech-synthesis

我以这种方式使用了SpeechSynthesis API:

speechSynthesis.speak(new SpeechSynthesisUtterance("hello world"));

但是现在更新Google Chrome后出现错误:

  

没有用户激活的[Deprecation] speechSynthesis.speak()为否   自M71以来,允许的时间更长,大约在2018年12月。请参阅   https://www.chromestatus.com/feature/5687444770914304了解更多详情   speechSynthesisMessage @   application-2c16c437c2795ae01c0a8852e5f8da58dad99d6e17814a31f1eea19922c5ebd2.js:147

如何解决此问题并寻求许可?

7 个答案:

答案 0 :(得分:3)

这是Chrome有关从网页发出声音的新政策的一部分。
您只需要您的用户在父文档的生存期内提供一个用户手势(可以在其中找到列表here)(即,只要该用户与页)。

请注意,这些事件甚至可以遍历框架,例如,在StackOverflow中,您必须单击“运行”按钮这一简单事实将使内部框架可以执行以下代码:

const ut = new SpeechSynthesisUtterance('No warning should arise');
speechSynthesis.speak(ut);

在您的代码中,您只需要提供某种类型的UI,即可确保您的用户在调用此方法之前已与页面进行了交互(例如,一个按钮/切换功能将非常完美)。

答案 1 :(得分:1)

如果您在chrome:// settings / content / sound中将站点地址设置为“可信任”,即使没有用户交互,它似乎也可以启用声音和语音合成。

我在电视上将Chrome用作系统监视器,使用信息亭模式,并且没有任何用户交互。它甚至没有键盘和鼠标。 尽管如此,我仍然能够在某些版本的Chrome / Chromium中启用,但在其他版本中却无法启用。

答案 2 :(得分:0)

我求助于swal("Click OK to speak").then(() => speakButton.click());(和https://sweetalert.js.org)-https://patarapolw.github.io/tts-api/?q=你好&lang=zh-CN&rate=0.8

请注意,if (confirm("Click OK to speak")) speakButton.click()无效。

答案 3 :(得分:0)

此错误表示整个文档(网站)没有用户互动,并且Google Chrome浏览器更新了有关在没有用户互动的情况下从网站发出声音的政策。

用户互动意味着:click, dblclick, mouseup, pointerup, reset, submit etc.

解决方案:

因此,如果您想在没有实际用户交互的情况下运行speechSynthesis.speak();,则只需使用.click()等方法创建临时用户交互即可。

答案 4 :(得分:0)

一个简单的技巧(不需要真正的用户活动)就是对隐藏按钮执行click事件,就像这样。

document.querySelector('button').click();
var msg = new SpeechSynthesisUtterance('Test');

答案 5 :(得分:0)

虽然我还没有找到任何请求权限的方法,但用户可以在 Google Chrome 中启用权限:

  1. 点击网址栏左侧的图标,打开网站设置

  2. 声音设置从“自动(默认)”更改为“允许

这样做之后,该网站将能够在没有任何用户交互(包括语音)的情况下发出声音。

不幸的是,我还没有在代码中找到一种方法来知道这是否有效。 (也许我们可以尝试其他音频 API 之一,看看它是否以错误消息响应。)

答案 6 :(得分:0)

我遇到了同样的问题,可以像这样使用 window.onload 对其进行排序:

window.onload = function(){ 
var u = new SpeechSynthesisUtterance('All is Ok');
 u.text = 'Hello World';    
 u.lang = 'en-US';
 u.rate = 1;
 u.pitch = .4;     
 speechSynthesis.speak(u);
}

当然这只会在页面加载后触发一次,但这对我来说是一个很好的解决方案。