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

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

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

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

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

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

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

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

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

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


person tborenst    schedule 18.03.2016    source источник


Ответы (1)


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

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

// 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 все еще экспериментальный.

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

Подробнее читайте здесь.

person Carlos Delgado    schedule 18.03.2016
comment
Спасибо за очень быстрый ответ. Событие mark — это именно то, что я искал. Благодарю вас! - person tborenst; 18.03.2016
comment
@tborenst Если это не проблема, если вы достигли того, что вам нужно, поделитесь этим здесь, когда получите :) - person Carlos Delgado; 18.03.2016