SpeechSynthesisUtterance.onboundary перестает работать - PullRequest
0 голосов
/ 24 августа 2018

Желаемое поведение

У меня есть несколько 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, чтобы убедиться, что все высказывания удаляются из очереди высказываний при загрузке / перезагрузке страницы, но, похоже, это не имеет значения - иногда речь начинается с нескольких делений из Топ).

...