На данный момент я заметил следующее: при использовании голоса 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
Мобильная версия