1a6e0c87ce
_speakBrowser() was silently failing in two scenarios: 1. Chrome cancel+speak bug: calling speechSynthesis.speak() immediately after cancel() is silently dropped in Chrome. Fixed by adding a 50ms setTimeout between cancel() and speak(). 2. No voice fallback: when tts_voice preference is empty (never saved) and the browser has no default 'it-IT' voice, speech fails silently. Now tries: preferred by name → first Italian voice → first any voice → lang-only as last resort. 3. Async voice loading: Chrome/Android load voices asynchronously. When getVoices() returns empty, now waits for onvoiceschanged (with a 500ms safety timeout) before speaking.