我有一个问题,在Firefox中,如果页面被自动刷新,语音会被切断,但是在谷歌浏览器中,即使页面被自动刷新,语音也会结束。如何解决该问题,以便即使页面自动刷新也不会在Firefox中被切断?
msg = new SpeechSynthesisUtterance("say something");
window.speechSynthesis.speak(msg);
答案 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-dispatcher
或speechd
(speech-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的过程并非没有错误,与问题描述最接近的是
Why hasn't Issue 88072 and Issue 795371 been answered? Are Internals>SpeechSynthesis and Blink>Speech dead?(出于可能的原因,“即使在页面自动刷新的情况下,“但在谷歌chrome浏览器中它仍能完成语音提示。”在Chrome上仍然可以)
.volume
属性问题
最令人震惊的问题是Chromium / Chrome webkitSpeechReconition
实现,它记录用户的音频并将该音频数据发布到远程服务,然后将脚本返回到浏览器,而无需明确通知用户标有WONT FIX
GitHub上的相关W3C语音API问题
The UA should be able to disallow speak() from autoplaying #27
Precisely define when speak() should fail due to autoplay rules #35(具有讽刺意味的是,与报告的Chromium / Chrome行为和此问题所述的输出有关,请参见Web Audio, Autoplay Policy and Games和Autoplay Policy Changes)
Intent to Deprecate: speechSynthesis.speak without user activation
摘要
SpeechSynthesis API在网络上正在被滥用。我们没有关于滥用的确切数据,但是由于其他自动播放途径 开始关闭,滥用正逐渐转移到网络演讲 API,它不遵循自动播放规则。
弃用后,计划是要引起SpeechSynthesis.speak to 如果没有特定的自动播放规则,则立即触发错误 满意。这样可以使其与Chrome中的其他音频API保持一致。
Timing of SpeechSynthesisUtterance events firing not defined #40
总而言之,不会将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浏览器上的自动刷新。请记住,此选项是可恢复的!