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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JS - 语音

C语言中如何引用其它C源文件中的函数?

如何在numpy中将[a,b,c]转换为[a+b+c,b+c,c]?

C/C++编程笔记:那些不会在C ++中编译的C程序,挺特殊奥~

在 C/C++ 中使用 swift 库?

C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件