Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自M71以来,不再允许未经用户激活的JavaScript speechSynthesis.speak()_Javascript_Google Chrome_Speech Synthesis - Fatal编程技术网

自M71以来,不再允许未经用户激活的JavaScript speechSynthesis.speak()

自M71以来,不再允许未经用户激活的JavaScript speechSynthesis.speak(),javascript,google-chrome,speech-synthesis,Javascript,Google Chrome,Speech Synthesis,我使用speechSynthesis API的方式如下: speechSynthesis.speak(new SpeechSynthesisUtterance("hello world")); 但现在我在更新Google Chrome后发现错误: [Deprecation]speechSynthesis.speak()未经用户激活是不允许的 自2018年12月左右M71以来允许的时间更长。看见 欲知详情 演讲信息@ 应用程序-2c16c437c2795ae01c0a8852e5f8da58da

我使用speechSynthesis API的方式如下:

speechSynthesis.speak(new SpeechSynthesisUtterance("hello world"));
但现在我在更新Google Chrome后发现错误:

[Deprecation]speechSynthesis.speak()未经用户激活是不允许的 自2018年12月左右M71以来允许的时间更长。看见 欲知详情 演讲信息@ 应用程序-2c16c437c2795ae01c0a8852e5f8da58dad99d6e17814a31f1eea19922c5ebd2.js:147


如何解决此问题并获得许可?

这是Chrome关于从网页发出声音的新政策的一部分。
您只需要用户在父文档的生命周期内提供一个用户手势(您可以找到一个列表)(即,只要用户曾经与页面进行过交互,事件可能早就结束了)

请注意,这些事件甚至可以遍历帧,因此,例如,在StackOverflow中,您必须单击“Run”按钮这一简单事实将允许内部帧执行此代码:

const ut=new speechsynthesisutrance(“不应出现警告”);
演讲综合(ut)我求助于
swal(“点击OK说话”)。然后(()=>speakButton.Click())(带)——


请注意,
if(确认(“单击确定说话”))speakButton.Click()
不起作用。

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

我在电视中使用Chrome作为系统监视器,使用kiosk模式,没有任何用户交互。它甚至没有键盘和鼠标。 尽管如此,我还是能够在Chrome/Chrome的某些版本中启用,但在其他版本中无法启用。

此错误意味着整个文档(网站)没有用户交互,Google Chrome更新了关于在没有用户交互的情况下从网站发出声音的政策

用户交互方式:
click、dblclick、mouseup、pointerup、reset、submit等。

解决方案:


因此,如果要运行
speechSynthesis.speak().click()
,等等的方法创建临时用户交互。

一个简单的技巧,不需要真正的用户活动,就是在一个隐藏的按钮上执行单击事件,就像这样

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

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

  • 单击URL栏左侧的图标,打开站点设置

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

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


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

    我也遇到了同样的问题,可以使用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);
    }
    

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

    更新:我在Raspbian中使用Chromium,似乎它不再带有预安装的语音。所以我把声音合成到其他地方,并将它们作为音频文件发送,即使没有用户交互,现在也能正常工作;多次用于1(初始)用户交互?对我不起作用,版本84.0.4147.105(正式版本)(64位),操作系统linux Mint对我不起作用,Chromium 86.0.4240.75(正式版本)(64位),Ubuntu20.04(但在同一操作系统上的Firefox 82.0(64位)中起作用。我尝试了
    confirm()
    alert())
    。是的,这些点击显然不算。FWIW我尝试了这个,但它不起作用。在dom元素上创建了一个点击事件处理程序,然后在加载后触发了那个点击事件,之后播放时仍然没有触发语音。您测试过吗?