Речевой синтез WebSpeech: приостановка высказывания1, воспроизведение другого высказывания2 и возобновление высказывания1 - возможно?

Я использую модуль speechSynthesis WebSpeech, чтобы веб-приложение говорило. Тем не менее, кажется, что вы можете только добавить высказывания в очередь, а затем pause(), resume() и cancel() всей очереди.

У меня есть ситуация, когда я хочу иметь два высказывания:

utterance1 = new SpeechSynthesisUtterance(text1);
utterance2 = new SpeechSynthesisUtterance(text2);

Я хотел бы воспроизвести utterance1, затем приостановить его в середине, воспроизвести utterance2, а затем возобновить utterance1. В коде это будет выглядеть так:

speechSynthesis.speak(utterance1);
// ... after a while
speechSyntehsis.pause(utterance1);
speechSynthesis.speak(utterance2);
// ... after a long while
speechSynthesis.resume(utterance1);

К сожалению, методы speechSynthesis pause(), resume() и cancel() не принимают никаких аргументов и воздействуют на всю очередь речевого высказывания. Есть ли способ добиться такого поведения?

Если бы у меня могло быть несколько объектов speechSynthesis, то я мог бы создать один для каждого высказывания, но я полагаю, что у меня может быть только один.

Если бы я мог отслеживать, где в строке было произнесено высказывание, то я мог бы отменить его и затем создать новое высказывание с оставшейся частью текста, но я не знаю, возможно ли это.

Какие-либо предложения?

1 ответ

Решение

Я уже несколько месяцев работаю в speechSynthesis с моей библиотекой Artyom.js, и в соответствии с документацией (и всеми выполненными мною тестами) приостановить один экземпляр синтеза и провести повторный анализ другого невозможно, потому что все экземпляры связаны с window.speechSynthesis (если когда-нибудь API изменится, это станет еще одним большим шагом в speechSynthesis). Когда вы вызываете метод паузы speechSynthesis "instance", он будет применяться ко всей очереди, и другого пути нет.

Согласно документации:

// the only solution would be if the speechSynthesis official API had a constructor like
// and a real NEW instance be created
// var synthRealInstance = new speechSynthesis();
// but till the date ... nope :(

var synthA =  window.speechSynthesis;
var synthB = window.speechSynthesis;

var utterance1 = new SpeechSynthesisUtterance('How about we say this now? This is quite a long sentence to say.');
var utterance2 = new SpeechSynthesisUtterance('We should say another sentence too, just to be on the safe side.');

synthA.speak(utterance1);
synthB.speak(utterance2);

synthA.pause();
// or synthB will anyway stop the synthesis of the queue

Существует свойство в высказывании (onmark), однако оно не очень хорошо задокументировано и, вероятно, не будет работать, так как этот API все еще экспериментален.

Событие mark вызывается при достижении тега mark в файле языка разметки речи (SSML). Просто знайте, что можно передать свои речевые данные в высказывание, используя документ SSML на основе XML. Основным преимуществом этого является то, что он облегчает управление речевым контентом при создании приложений, которые имеют большой объем текста, который необходимо синтезировать.

Подробнее о здесь.

Другие вопросы по тегам