当页面自动刷新时,语音在Firefox中被截断,但在Google Chrome中不被截断

时间:2019-01-23 13:37:14

标签: javascript refresh speech-synthesis

我有一个问题,在Firefox中,如果页面被自动刷新,语音会被切断,但是在谷歌浏览器中,即使页面被自动刷新,语音也会结束。如何解决该问题,以便即使页面自动刷新也不会在Firefox中被切断?

msg = new SpeechSynthesisUtterance("say something");
window.speechSynthesis.speak(msg);

4 个答案:

答案 0 :(得分:1)

Firefox可能无法正确处理实验技术。

先尝试SpeechSynthesis.cancel(),然后再重复您的.speak()通话。

msg = new SpeechSynthesisUtterance("say something");
window.speechSynthesis.cancel();
window.speechSynthesis.speak(msg);

答案 1 :(得分:0)

  

我有这个问题,在Firefox中,如果   页面会自动刷新,但在Google chrome中会说完   语音,即使页面已自动刷新。

所描述的Firefox行为是理智的预期实现。

浏览Firefox和Chromium的source code时,speechSynthesis.speak()的实现是基于与本地语音服务器的套接字连接。位于* nix的服务器通常为speech-dispatcherspeechdspeech-dispatcher)。有关尝试在Chromium上实现SSML解析的说明,请参见How to programmatically send a unix socket command to a system server autospawned by browser or convert JavaScript to C++ souce code for Chromium?

最终在SE网站上问了多个问题,提交问题和错误并在W3C邮件列表中发布而没有任何证据表明SSML的情况下,最终决定根据W3C规范SpeechSynthesisSSMLParser使用JavaScript编写自己的代码来满足该要求解析将永远包含在Web Speech API中。

一旦启动连接,就会创建一个队列,以调用.speak()。即使关闭连接,Task Manager仍可能显示该服务注册的活动进程。

Chromium / Chrome的过程并非没有错误,与问题描述最接近的是

.volume属性问题

最令人震惊的问题是Chromium / Chrome webkitSpeechReconition实现,它记录用户的音频并将该音频数据发布到远程服务,然后将脚本返回到浏览器,而无需明确通知用户标有WONT FIX

的地方

GitHub上的相关W3C语音API问题


总而言之,不会将Firefox的行为描述为“问题”,而是将Chrome的行为描述为潜在的“问题”。

在浏览器中使用W3C Web Speech API的实现并非易事。有几个原因。包括商业TTS / SST服务的明显焦点或可用选项,以及“智能电话”中语音合成和语音识别的专有,闭源实现;代替解决在现代浏览器中实际部署W3C Web Speech API的各种问题。

speechd(语音分派器)的维护者在服务器端(本地speech-dispatcher套接字)方面非常有帮助。

不能代表Firefox维护者。可以估计,如果提交的错误与继续从重新加载的.speak()继续执行window的音频输出的功能请求有关,不符合浏览器最近实施的自动播放策略。尽管您仍然可以提交Firefox错误,以询问在重新加载当前window期间音频输出(来自任何API或接口)是否可以继续;是否有任何首选项或策略可以设置为覆盖所描述的行为,如@zip的答案所建议。并从实施者那里得到答案。

有一些组成FOSS代码的个人和团体在领域中活跃并愿意帮助SST / TTS开发,其中许多在GitHub中活跃,这是询问有关如何实现您正在尝试的内容的另一种选择专门在Firefox浏览器上实现。

除了要求实现者提出功能请求外,您还可以阅读源代码并尝试创建一个或多个解决方法。替代方法包括使用meSpeak.js,尽管如果Firefox在重新加载window期间有意阻止 音频输出,这仍未必能解决。

答案 2 :(得分:0)

不确定行为为何有所不同... guest271314可能与他的回答有关。但是,您可以通过使用onbeforeunload处理程序拦截重载事件并等待话语结束来阻止FF停止tts:

msg = new SpeechSynthesisUtterance("say something");
window.speechSynthesis.speak(msg);
window.onbeforeunload = function(e) {
  if(window.speechSynthesis.speaking){
    event.preventDefault();
    msg.addEventListener('end', function(event) {
      //logic to continue unload here
    });
  }
};

答案 3 :(得分:-3)

Firefox:

首先输入地址栏,然后在浏览器中搜索“ about:config”。这将转到另一个页面,在该页面上将弹出一个对话框,要求冒险,您需要接受这一点。从列表中查找名为“ accessibility.blockautorefresh”的首选项,然后右键单击该首选项。屏幕上的列表中会出现一些选项,选择“切换”选项,然后将其设置为“真”而不是“假”。此更改将阻止Firefox浏览器上的自动刷新。请记住,此选项是可恢复的!