在Chrome Android上使用SpeechSynthesis.resume()恢复已暂停的语音不起作用

时间:2019-11-20 11:59:32

标签: javascript google-chrome text-to-speech web-audio-api speech-synthesis

使用浏览器api speechSynthesis.resume()我正在尝试在android chrome上恢复暂停的语音

我已经在mac os mojave的chrome桌面版本78.0.3904.97上测试了以下代码,在语音暂停后,它可以恢复语音,而不会出现任何问题。但是相同的代码无法在Android chrome 77.x和78.x版上恢复语音

复制步骤

  1. 运行以下代码
  2. 按播放以听讲话
  3. 中途暂停演讲
  4. 按简历
  5. 语音在桌面chrome上恢复,但在Android chrome上不恢复

这是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>

2 个答案:

答案 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函数就可以完成工作,不会产生错误。