Safari JavaScript SpeechSynthesis на iOS 26 перестает работать после определенного текстаIOS

Программируем под IOS
Ответить
Anonymous
 Safari JavaScript SpeechSynthesis на iOS 26 перестает работать после определенного текста

Сообщение Anonymous »

После обновления iOS до версии 26.0.1 (не уверен, применимо ли это к версии 26). Я только что заметил, что SpeechSynthesis снова глючит. Итак, я хочу знать, что я могу сделать, чтобы обойти это.
На данный момент я заметил следующее: при использовании голоса Tingting, если текст в речь начинается с «» и содержит внутри себя китайские иероглифы. При попытке произнести его синтез речи перестанет работать. И перезагрузка страницы не поможет. Вам необходимо перезапустить Safari, прежде чем использовать какие-либо функции синтеза речи. А вот демонстрационный код:

Код: Выделить всё

const init = () => {
if (document.querySelector('button')) return;
const voices = window.speechSynthesis.getVoices();
const zhCnVoices = [...voices].filter((voice, index, list) => /^zh-CN/.test(voice.lang) && list.findIndex(that => that.voiceURI === voice.voiceURI) === index);
if (!zhCnVoices.length) return;
const select = document.body.appendChild(document.createElement('select'));
zhCnVoices.forEach(voice => {
const option = select.appendChild(document.createElement('option'));
option.textContent = voice.name;
option.value = voice.voiceURI;
});
select.value = zhCnVoices.find(voice => /Tingting/.test(voice.voiceURI))?.voiceURI;
const input = document.body.appendChild(document.createElement('input'));
input.value = '';
const speak = (text) => {
const ssu = new SpeechSynthesisUtterance(text);
ssu.voice = zhCnVoices.find(voice => voice.voiceURI === select.value);
window.speechSynthesis.cancel();
window.speechSynthesis.speak(ssu);
};
const button = document.body.appendChild(document.createElement('button'));
button.textContent = 'Buggy Speak';
const button2 = document.body.appendChild(document.createElement('button'));
button2.textContent = 'Workaround Speak';
button.addEventListener('click', () => {
speak(input.value);
});
button2.addEventListener('click', () => {
speak(input.value.replace(/[]/g, ch => ({ '': '\uff1e' }[ch])));
});
};
window.speechSynthesis.addEventListener("voiceschanged", init);
init();


Сначала щелкните обходной вариант, он должен сработать, и вы должны произнести здесь какой-то текст, если в вашей системе установлен мандаринский голос. Затем нажмите на глючный, вы ничего не должны услышать. И вы можете попробовать обходной путь еще раз, он больше не будет работать до перезапуска Safari.
На данный момент я хочу знать следующее:
  • Как определить версию iOS, чтобы этот обходной путь применялся только к версиям с ошибками. (Я подтверждаю, что в iOS 18 этой ошибки нет.)
  • Я не уверен, возникла ли такая же ошибка на Mac, поскольку у меня нет устройства для ее тестирования. Так это также применимо к Mac?
Обновление:
После отладки я могу подтвердить, что эта ошибка затрагивает как iOS 26, так и Mac OS 26. Она также применима к сторонним браузерам, если вы используете голосовую связь от Apple. Голос повлиял не только на голоса на китайском языке (zh-CN, zh-TW и yue-HK), но и на другие голоса, такие как Фред на английском языке. А поскольку Apple нечестна относительно версии системы в строке User-Agent, лучшее, что я могу сделать, — это применить этот трюк к последней версии перед заморозкой UA. Так что, если у кого-то есть хорошая идея, как определить, когда применить этот трюк, пожалуйста, оставьте ответ здесь.

Подробнее здесь: https://stackoverflow.com/questions/797 ... rtain-text
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»