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;
});