From my answer in https://stackoverflow.com/a/79296650/2219998, mobile Safari seems to require that the first utterance happens during a user interaction (even if it's empty!) in order to enable utterances in non-user-interactive places like timeouts/intervals. This works for me:
<!-- begin snippet: js hide: false console: true babel: false babelPresetReact: false babelPresetTS: false -->
<!-- language: lang-js -->
function speak(msg) {
speechSynthesis.speak(new SpeechSynthesisUtterance(msg));
}
const startTimerButton = document.getElementById('start-timer');
startTimerButton.addEventListener('click', () => {
// Mobile Safari requires an utterance (even a blank one) during
// a user interaction to enable utterances during timeouts.
speak('');
setInterval(() => {
speak('another five seconds passed');
}, 5 * 1000);
});
<!-- language: lang-html -->
<button id="start-timer">Start</button>
<!-- end snippet -->
As per [@Frazer's comment][1], mobile Safari seems to require that the first utterance happens during a user interaction (even if it's empty!) in order to enable utterances in non-user-interactive places like timeouts/intervals. This works for me:
<!-- begin snippet: js hide: false console: true babel: false babelPresetReact: false babelPresetTS: false -->
<!-- language: lang-js -->
function speak(msg) {
speechSynthesis.speak(new SpeechSynthesisUtterance(msg));
}
const startTimerButton = document.getElementById('start-timer');
startTimerButton.addEventListener('click', () => {
// Mobile Safari requires an utterance (even a blank one) during
// a user interaction to enable utterances during timeouts.
speak('');
setInterval(() => {
speak('another five seconds passed');
}, 5 * 1000);
});
<!-- language: lang-html -->
<button id="start-timer">Start</button>
<!-- end snippet -->
[1]: https://stackoverflow.com/questions/61658740/speechsynthesis-not-working-on-mobile-safari-even-though-its-supported#comment109595034_61658740