speechSynthesis.speak在Chrome中不工作

w41d8nur  于 12个月前  发布在  Go
关注(0)|答案(7)|浏览(718)

我在Windows 10上使用Chrome版本55.0.2883.87 m(64位)。
下面这个简单的html文件重现了这个问题,它是从我的更复杂的应用程序中提取出来的。它应该在页面加载时说三个字。它可以在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>
aor9mmx1

aor9mmx11#

我可能永远不会知道,因为这个问题是间歇性的,但它似乎消失后,我开始取消前发言

utter = new window.SpeechSynthesisUtterance("cat");

window.speechSynthesis.cancel();
window.speechSynthesis.speak(utter);

我不认为取消一定要在话语对象的创造和使用之间发生。只是在每次发言之前。我可能有一个不同的问题,因为我只创建了一个话语对象,而不是一堆。我只在Chrome 78上看到过。使用Windows 7,64位。我从来没有在Firefox或Edge上看到过这个问题。
两周后编辑。试了几十次都没有复发。.cancel()解决了我的问题。我的症状是:在Chrome中调用speechSynthesis.speak()有时不会启动语音。在代码中没有直接的问题指示,speechSynthesis.speaking将为true,.pending将为false。将不存在来自话语对象的事件。通常,当speech可以工作时,我会在调用.speak()后大约0.1秒获得一个'start'事件。

xa9qqrwz

xa9qqrwz2#

自2018年以来,在Google的Chrome Web浏览器中,如果没有用户激活,则不再允许使用speechSynthesis.speak()。违反Google Chrome的自动播放政策。因此,谷歌Chrome已经设法撤销了它的自动播放功能,但你可以通过添加一个按钮来使用它进行自定义调用。
您可以访问这里检查Chrome本身提供的状态,下面是所附的图像,其中清楚地表明,speechSynthesis.speak()调用未经用户许可是禁止的。
Link to image
Link to article by Google Chrome

p5cysglq

p5cysglq3#

除此之外,对我来说,问题是SpeechSynthesisUtterance示例上的播放速率超过2。我发现在Chrome中它必须设置为2或更少(尽管它在Safari等其他浏览器中的使用率更高)。
在Chrome中,如果发声速率高于2,则会导致window.speechSynthesis卡住,并且需要window.speechSynthesis.cancel()才能通过.speak()再次播放音频(以低于2的有效速率)。

wa7juj8i

wa7juj8i4#

你的文本到语音试用只工作了一次吗?原因如下。
在Chrome中,你必须取消语音合成,否则它不符合谷歌的自动播放政策。所以你应该开始你的脚本:

window.speechSynthesis.cancel()

取消之前的语音合成。

tnkciper

tnkciper5#

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

mepcadol

mepcadol6#

在调用new时,您可以尝试分别指定速率、音量和文本对象,然后将其转换为语音,而不是指定文本。

avwztpqn

avwztpqn7#

你不能在Chrome中自动播放。你必须把它添加到一个事件示例中

<button onclick="onRead()">Talk To Me</button>

const onRead = () => {
        const utter = new window.SpeechSynthesisUtterance("red");
        window.speechSynthesis.speak(utter);
};

相关问题