JS SpeechSynthesis Проблемы с методом cancel()

я хочу использовать метод отмены window.SpeechSynthesis в Chrome, чтобы отрезать высказывание и начать новое (так что вам не нужно слышать все высказывания, которые все еще находятся в очереди)

var test = new SpeechSynthesisUtterance("Test");
window.speechSynthesis.speak(test);  
window.speechSynthesis.cancel();
var test2 = new SpeechSynthesisUtterance("Test2");
window.speechSynthesis.speak(test2);

Ожидается: начать речь с var test , но немедленно отменить ее из-за отмены(). Затем снова запустите речь с помощью var test2 , что должно работать нормально.

Ну конечно этого не произошло. Но то, что случилось, ничего. :D Казалось, что вызов speak() после cancel() ничего не делает.

Описание API следующее:

Этот метод удаляет все высказывания из очереди. Если высказывание произносится, речь немедленно прекращается. Этот метод не изменяет состояние паузы глобального экземпляра SpeechSynthesis.

Спасибо за ответы :)


person Erik    schedule 08.09.2016    source источник


Ответы (3)


Я только что столкнулся с той же проблемой: выдача говорения после отмены приведет к тому, что высказывание не будет произнесено.

Я добавил небольшой тайм-аут (250 мс) после вызова clear(), и, похоже, он работает:

var sayTimeout = null;

function say(text) {
    if (speechSynthesis.speaking) {
        // SpeechSyn is currently speaking, cancel the current utterance(s)
        speechSynthesis.cancel();

        // Make sure we don't create more than one timeout...
        if (sayTimeout !== null)
            clearTimeout(sayTimeout);

        sayTimeout = setTimeout(function () { say(text); }, 250);
    }
    else {
        // Good to go
        var message = new SpeechSynthesisUtterance(text);
        message.lang = "en-US";
        speechSynthesis.speak(message);
    }
}
person Basuro    schedule 18.05.2017

Кажется, теперь он работает, используя предоставленный вами код.

$(document).on("click", "#speak", function() {

  var test = new SpeechSynthesisUtterance("Test");
  window.speechSynthesis.speak(test);
  window.speechSynthesis.cancel();
  var test2 = new SpeechSynthesisUtterance("Test2");
  window.speechSynthesis.speak(test2);

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="speak">CLICK ME TO HEAR TEXT</div>

person user1063287    schedule 28.06.2019
comment
Подтвержденный. Я слышу Test2 в Chrome 76/Windows 7. - person Bob Stein; 27.09.2019

Этот код взят непосредственно из примеров библиотеки p5speech. Может быть, это помогает в качестве обходного пути?

    function parseResult()
    {
        // recognition system will often append words into phrases.
        // so hack here is to only use the last word:
        var mostrecentword = myRec.resultString.split(' ').pop();
        if(mostrecentword.indexOf("left")!==-1) { dx=-1;dy=0; }
        else if(mostrecentword.indexOf("right")!==-1) { dx=1;dy=0; }
        else if(mostrecentword.indexOf("up")!==-1) { dx=0;dy=-1; }
        else if(mostrecentword.indexOf("down")!==-1) { dx=0;dy=1; }
        else if(mostrecentword.indexOf("clear")!==-1) { background(255); }
        console.log(mostrecentword);
    }
person dackdel    schedule 12.04.2019