SpeechSynthesis.speak 在 chrome 中不起作用
Posted
技术标签:
【中文标题】SpeechSynthesis.speak 在 chrome 中不起作用【英文标题】:speechSynthesis.speak not working in chrome 【发布时间】:2017-05-23 05:19:36 【问题描述】:我在 Windows 10 上使用 chrome 版本 55.0.2883.87 m(64 位)。
以下简单的 html 文件重现了该问题,并从我更复杂的应用程序中提取。它应该在页面加载时说出 3 个单词。它适用于 MS Edge 和 Firefox,但不适用于 chrome。几周前,这段代码在 Chrome 上为我工作没问题。
<html>
<head>
<script lang="javascript">
window.speechSynthesis.speak(new SpeechSynthesisUtterance("cat"));
window.speechSynthesis.speak(new SpeechSynthesisUtterance("dog"));
window.speechSynthesis.speak(new SpeechSynthesisUtterance("bark"));
</script>
</head>
<body></body>
</html>
【问题讨论】:
【参考方案1】:您的文字转语音试用是否只运行过一次?这就是原因。
在 chrome 中你必须取消语音合成,否则它不符合谷歌的自动播放政策。所以你应该开始你的脚本:
window.speechSynthesis.cancel()
取消之前发生的任何语音合成。
【讨论】:
【参考方案2】:此外,我的问题是SpeechSynthesisUtterance
实例的播放速率高于 2。我发现它必须在 chrome 中设置为 2 或更低(尽管它在其他浏览器中具有更高的速率,例如野生动物园)。
在chrome中,如果发声率高于2,会导致window.speechSynthesis
卡住,需要window.speechSynthesis.cancel()
才能通过.speak()
再次播放音频(有效率低于2)。
【讨论】:
【参考方案3】:除了在调用 new 时指定文本,您可以尝试分别指定具有速率、音量和文本的对象,然后将其转换为语音。
【讨论】:
【参考方案4】:speechSynthesis.speak() 自 2018 年起不再允许用户在 Google 的 Chrome 网络浏览器中激活。它违反了 Google Chrome 的自动播放政策。因此,谷歌浏览器已经设法取消了它的自动播放功能,但您可以通过添加一个按钮来进行自定义调用来使用它。
您可以访问此处查看 chrome 本身提供的状态,下面附上的图片清楚地表明未经用户许可禁止调用 speechSynthesis.speak()。
Link to image
Link to article by Google Chrome
【讨论】:
【参考方案5】:我可能永远无法确定,因为这个问题是间歇性的,但在我开始在说话之前取消之后,它似乎消失了。
utter = new window.SpeechSynthesisUtterance("cat");
window.speechSynthesis.cancel();
window.speechSynthesis.speak(utter);
我认为取消不一定必须出现在话语对象的创建和使用之间。只是它出现在每次讲话之前。我可能遇到了不同的问题,因为我只创建了一个话语对象,而不是一堆。我只在 Chrome 78 上看到它。使用 Windows 7,64 位。从未在 Firefox 或 Edge 上看到过问题。
2 周后编辑。多次尝试后没有复发。似乎 .cancel() 解决了我的问题。我的症状是:在 Chrome 中调用 speechSynthesis.speak() 有时不会启动语音。代码中没有立即出现问题的迹象,speechSynthesis.speaking
为真,.pending
为假。话语对象不会有任何事件。通常,当语音起作用时,我会在调用 .speak() 约 0.1 秒后收到 'start'
事件。
【讨论】:
【参考方案6】:resultsDisplay = document.getElementById("rd");
startButton = document.getElementById("startbtn");
stopButton = document.getElementById("stopbtn");
recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition)();
recognition.lang = "en-US";
recognition.interimResults = false;
recognition.maxAlternatives = 5;
recognition.onresult = function(event)
resultsDisplay.innerHTML = "You Said:" + event.results[0][0].transcript;
;
function start()
recognition.start();
startButton.style.display = "none";
stopButton.style.display = "block";
function stop()
recognition.stop();
startButton.style.display = "block";
stopButton.style.display = "none";
.resultsDisplay width: 100%; height: 90%;
#stopbtn display: none;
<div class="resultsDisplay" id="rd"></div>
<br/>
<center>
<button onclick="start()" id="startbtn">Start</button>
<button onclick="stop()" id="stopbtn">Stop</button>
</center>
试试
utterance = new SpeechSynthesisUtterance("cat, dog, bark");
speechSynthesis.speak(utterance);
我在LiveWeave 发了一个Weave。
【讨论】:
以上是关于SpeechSynthesis.speak 在 chrome 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在numpy中将[a,b,c]转换为[a+b+c,b+c,c]?