В Safari не сработало голосовое событие

Насколько я могу судить, событие Voiceschange не происходит в Safari ни на Mac, ни на iOS. Также странно, что он не работает в Chrome на iOS, но я предполагаю, что Chrome на iOS использует тот же движок JavaScript, что и Safari.

Вот демонстрация, которую я использовал для проверки: http://jsbin.com/gosaqihi/9/edit?js,console (взят из раздела Получение списка голосов в speechSynthesis of Chrome (Web Speech API))

Я также попробовал это с помощью addEventListener:

speechSynthesis.addEventListener("voiceschanged", function () {
    var voices = speechSynthesis.getVoices(),
        keys = Object.keys(voices[0]),
        i, j;

    document.write("<table border=1><tr>");

    for ( i = 0; i < keys.length; i++ ) {
        document.write("<td>" + keys[i] + "</td>");
    }

    document.write("</tr>");

    for ( i = 0; i < voices.length; i++ ) {
        document.write("</tr>");
        for ( j = 0; j < keys.length; j++ ) {
            document.write("<td>" + voices[i][keys[j]] + "</td>");
        }
        document.write("</tr>");
    }

    document.write("<table>");
}, false);

Оба подхода (onvoiceschanged, addEventListener) прекрасно работают в Chrome для Windows, Android и Mac, но не работают в Chrome для iOS и Safari для Mac и iOS. Насколько я могу судить, Safari просто не запускает событие Voiceschange.

Сложно, у меня нет никаких устройств Apple, поэтому я должен был это выяснить, когда друзья что-то пробуют.

Что-то особенное мне нужно сделать в Safari, чтобы получить список голосов? Или API речевого синтеза просто (полностью) еще не реализован?

1 ответ

Решение

Очевидно, Safari пока имеет лишь частичную поддержку API Web Speech.

Что вы могли бы сделать для того, чтобы ваш код работал в разных средах, это определить, onvoiceschanged существует в speechSynthesis, Если нет, вы можете просто позвонить speechSynthesis.getVoices() без прослушивания onvoiceschanged,

function doVoices() {
    var voices = speechSynthesis.getVoices(),
    // ...
}

if ('onvoiceschanged' in speechSynthesis) {
    speechSynthesis.onvoiceschanged = doVoices;
} else {
    doVoices();
}
Другие вопросы по тегам