Речевой синтез 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. Основным преимуществом этого является то, что он облегчает управление речевым контентом при создании приложений, которые имеют большой объем текста, который необходимо синтезировать.