使用浏览器api speechSynthesis.resume()我正在尝试在android chrome上恢复暂停的语音
我已经在mac os mojave的chrome桌面版本78.0.3904.97上测试了以下代码,在语音暂停后,它可以恢复语音,而不会出现任何问题。但是相同的代码无法在Android chrome 77.x和78.x版上恢复语音
复制步骤
这是Chrome中的错误吗?
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
</head>
<body>
<button id="play">Play</button>
<button id="pause">Pause</button>
<button id="resume">Resume</button>
<div id="data"></div>
<script>
const play = document.getElementById("play");
const pause = document.getElementById("pause");
const resume = document.getElementById("resume");
play.addEventListener("click", function() {
document.getElementById("data").innerText = "play";
var utterance = new SpeechSynthesisUtterance(
"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"
);
utterance.lang = "en-US";
speechSynthesis.cancel();
speechSynthesis.speak(utterance);
});
pause.addEventListener("click", function() {
document.getElementById("data").innerText = "pause";
speechSynthesis.pause();
});
resume.addEventListener("click", function() {
document.getElementById("data").innerText = "resume";
speechSynthesis.resume();
});
</script>
</body>
</html>
答案 0 :(得分:1)
是的,这是个错误:https://github.com/mdn/browser-compat-data/issues/4500
状态是固定的,因此也许可以在Beta或开发版本或Chronium中使用。
按现状,当您暂停SpeechSynthesis时,其暂停状态不会更新,并且所有其他语音命令都将放入待处理的队列中,给人的印象是SpeechSynthesis完全停止工作。您的代码通过在每个“讲话”命令之前使用“取消”行来避免这种情况。
偶然地,您是否希望此代码在Firefox中运行?
编辑:希望您不要介意,我对代码进行了一些更改,并添加了一个“状态”按钮来演示此错误。状态按钮显示语音,已暂停和未决状态。
单击“播放”,然后单击“状态”:说的是真的,暂停的是假,未决的是假。然后点击“暂停”和“状态”。在Windows中,口语为true,暂停时为true,未决为false。但是在Andriod中,状态分别为true,false和false。所以简历无法做任何事情,因为暂停是错误的。
此后,如果再次单击“播放”,话语将进入待处理队列,因此状态为true,false,true。
x_1
x_2
y_1
...
y_5
z_1
(为了更好地显示该错误,我注释了您的取消行并添加了一个单独的取消按钮)
答案 1 :(得分:0)
实际上,问题在于某些浏览器不会自动更新状态,并且Mozilla网站指定这是一项实验性功能,并且并非所有浏览器都支持该功能,这表明我们还应该检查这种支持的程度。对于铬及其衍生物,仅暂停执行该语句,对此的简单解决方案是:
var synth = window.speechSynthesis;
var voice = new SpeechSynthesisUtterance('hello');
var voices = speechSynthesis.getVoices();
//Put this on the play button
synth.resume();
synth.speak(voice);
因此,如果有要恢复的内容,它将从上次中断的地方返回,否则,它将开始,如果不需要if(),则resume()函数本身将启动该语句,但是如果存在失败,speak函数就可以完成工作,不会产生错误。