在 chrome android 上使用 voiceSynthesis.resume() 恢复暂停的语音不起作用

Dav*_*vid 6 javascript google-chrome text-to-speech speech-synthesis web-audio-api

使用浏览器 api voiceSynthesis.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>
Run Code Online (Sandbox Code Playgroud)

Fra*_*zer 6

是的,这是一个错误:https ://github.com/mdn/browser-compat-data/issues/4500

状态是固定的,所以也许它可以在测试版或开发版或 Chrium 中运行。

就目前情况而言,当您暂停语音合成时,其暂停状态不会更新,并且所有进一步的语音命令都会放入待处理队列中,给人的印象是语音合成已完全停止工作。您的代码可以在每个“speak”命令之前使用“cancel”行来避免这种情况。

顺便问一下,您希望这段代码在 Firefox 中运行吗?

编辑:希望您不介意,我稍微更改了您的代码并添加了一个“状态”按钮来演示此错误。状态按钮显示正在发言、暂停和待处理状态。

单击“播放”,然后单击“状态”:正在讲话为 true,暂停为 false,待处理为 false。然后单击“暂停”和“状态”。在 Windows 中,speaking 为 true,paused 为 true,pending 为 false。然而在Andriod 中,状态分别为true、false、false。所以恢复不能做任何事情,因为暂停是错误的。

此后,如果您再次单击“播放”,则话语将进入待处理队列,因此状态为 true、false、true。

<!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>
    <button id="status">Status</button>
    <button id="ssCancel">Cancel</button>

    <div id="data"></div>

    <script>
      const play = document.getElementById("play");
      const pause = document.getElementById("pause");
      const resume = document.getElementById("resume");
      const status = document.getElementById("status");
      const ssCancel = document.getElementById("ssCancel");
      const data = document.getElementById("data");

      play.addEventListener("click", () => {
        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", () => {
        data.innerText = 'pause';
        speechSynthesis.pause();
      });
      
      resume.addEventListener("click", () => {
        data.innerText = "resume";
        speechSynthesis.resume();
      });
      
      status.addEventListener('click', () => {
        data.innerText = `
          Speaking: ${speechSynthesis.speaking},
          Paused: ${speechSynthesis.paused},
          Pending: ${speechSynthesis.pending}.`;
      });
      
      ssCancel.addEventListener('click', () => {
          speechSynthesis.cancel();
      });
    </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

(为了更好地显示错误,我注释掉了您的取消行并添加了单独的取消按钮)

  • 只是一个注释,修复方法是在文档中添加一个注释,表明 chrome 在 android 上有一个错误。它不是对实际错误的修复 (4认同)