Желаемое поведение
У меня есть несколько div, которые я хотел бы произнести, поэтому я перебираю их, беру их текст и вызываю .speak(text)
для каждого из них.
Я добавляю и пропускаю пользовательское свойство utterance
, представляющее индекс каждого экземпляра класса, чтобы можно было нацелить соответствующий div, о котором говорится в обработчике utterance.onboundary
.
Окружающая среда:
Локальная разработка в Chrome, версия 68.0.3440.106 (официальная сборка) (64-разрядная версия)
Настройка
var synth = window.speechSynthesis;
// declare so that these values are accessible globally
var voices = [];
Игра
// the select element that contains voice options
var selected_voice_index = $("#available_voices").prop('selectedIndex');
// iterate over divs, get their text and index, and speak them
$(".my_text").each(function(index) {
var text = $(this).text();
var utterance = new SpeechSynthesisUtterance(text);
// NOTE: I add property to pass through a class instance index
utterance.MY_UTTERANCE_INSTANCE = index;
// define the voice to use
utterance.voice = voices[selected_voice_index];
utterance.onboundary = onboundaryHandler;
utterance.onend = onendHandler;
synth.speak(utterance);
});
Обработка событий
function onendHandler(event) {
console.log("=============UTTERANCE ENDED=============");
// check values of event.utterance properties here
}
function onboundaryHandler(event) {
var char_index = event.charIndex;
var utterance_instance = event.utterance.MY_UTTERANCE_INSTANCE;
var utterance_text = event.utterance.text;
console.log("onboundaryHandler - char_index: " + char_index);
console.log("onboundaryHandler - utterance_instance: " + utterance_instance);
console.log("onboundaryHandler - utterance_text: " + utterance_text);
// apply markup to word being spoken here
}
Проблема
Он работает "отлично" в течение различных промежутков времени, а затем просто "перестает работать", то есть пользовательское значение свойства MY_UTTERANCE_INSTANCE
, которое я передаю onboundary
, перестает проходить (регистрируется как undefined
).
(Кроме того, у меня есть synth.cancel()
на document.ready
, чтобы убедиться, что все высказывания удаляются из очереди высказываний при загрузке / перезагрузке страницы, но, похоже, это не имеет значения - иногда речь начинается с нескольких делений из Топ).