JS Речь Синтез Проблема на iOS

Недавно я реализовал базовое веб-приложение, которое основывалось на URL-адресе Google TTS для создания чистых MP3-файлов для воспроизведения на внешнем интерфейсе.

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

Одной из таких альтернатив является API синтеза речи javascript, т.е. SpeechSynthesisUtterance() и window.speechSynthesis.speak('...'). Это очень хорошо работает на моем настольном компьютере и ноутбуке, но как только я использую его на своих устройствах iOS, скорость звука значительно возрастает.

Кто-нибудь может подсказать, что я могу сделать, чтобы решить эту проблему?

Ниже приведен пример кода:

var msg = new SpeechSynthesisUtterance(); 
    msg.text = item.title;
    msg.voice = "Google UK English Male";
    msg.rate = 0.7;
    msg.onend = function(){
        console.log('message has ended');
        $('.word-img').removeClass('img-isplaying');
    };
    msg.onerror = function(){
        console.log('ERROR WITH SPEECH API');
        $('.word-img').removeClass('img-isplaying');
    };
window.speechSynthesis.speak(msg);

1 ответ

IOS не позволяет программно использовать новый SpeechSynthesis-Api. Пользователь должен вызвать явное действие. Я могу понять это решение. Но я не понимаю, почему Api не работает в веб-приложениях, как проигрывание аудио файлов. Это не работает в стандартном Safari IOS, но работает в веб-приложениях.

Вот небольшая хитрость:

<a id="trigger_me" onclick="speech_text()"></a>
<script>
    function speech_text() {
        var msg = new SpeechSynthesisUtterance();
        /* ... */
    }
    /* and now you must trigger the event for #trigger_me */
    $('#trigger_me').trigger('click');
</script>

Это работает только с родными элементами DOM. Если вы добавите новый тег программно в дом, как...

$('body').append('<a id="trigger_me" onclick="speech_text()"></a>');

... функция не сработает. Похоже, что IOS-Safari регистрирует события для специальных внутренних функций только один раз после загрузки.

В ПОРЯДКЕ. Решил сегодня эту проблему. Проблема в том, что iOS не позволяет запускать речевой API программно, если мы не сработаем один раз при взаимодействии с пользователем.

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

Вот мой код.

let hasEnabledVoice = false;

document.addEventListener('click', () => {
  if (hasEnabledVoice) {
    return;
  }
  const lecture = new SpeechSynthesisUtterance('hello');
  lecture.volume = 0;
  speechSynthesis.speak(lecture);
  hasEnabledVoice = true;
});
Другие вопросы по тегам