Podcast player: say why it cannot speak, with a way out

"The podcasts don't even work on my Linux setup on Firefox." Firefox on
Linux speaks through speech-dispatcher; without it speechSynthesis is present
but empty and silent - getVoices() is empty, speak() does nothing, no events
- so the player looked broken.

- pressing play with zero installed voices (or a start that never arrives
  within 1.7s) raises a banner naming the cause, with the Linux fix
  (sudo apt install speech-dispatcher) and the iOS one where it applies;
- the banner offers "Use the natural voice" when a provider key exists (it
  switches the source, keeps playing and remembers it), "Add a provider key"
  when not (opens Settings) and a link into the picker;
- natural-voice errors (refused autoplay, provider refusal) show in that same
  banner instead of hiding inside the picker.

podcast-test fakes a present-but-empty speechSynthesis and pins the banner,
the Linux line and the one-tap switch. 48 checks. Version 0.7.8, SW v100.
This commit is contained in:
Martin Dvořák 2026-10-16 18:32:36 +00:00
commit 08a145b087
6 changed files with 147 additions and 8 deletions

View file

@ -314,6 +314,9 @@ const en: Record<string, string> = {
"podcast.voiceNaturalNote": "Generated by your own provider key — the words are timed to the audio, so the highlight still follows the voice.",
"podcast.voiceNeedsKey": "Add an OpenAI or Groq key in Settings → Providers to use natural voices.",
"podcast.voiceNoSystem": "This device reports no system voices. The natural voice works anywhere — or add a voice in your system settings.",
"podcast.voiceSilent": "The system voice did not start — this browser has no speech engine behind it. On Firefox/Linux install speech-dispatcher (sudo apt install speech-dispatcher) and reopen this page.",
"podcast.voiceUseNatural": "Use the natural voice",
"podcast.voiceOpenProviders": "Add a provider key",
"podcast.voiceGenerating": "Generating the voice…",
"podcast.voiceRobotic": "Only the basic system voices are installed. For a natural host voice, add one in your system settings (Windows: Speech; macOS: Spoken Content; Chrome ships the Google voices).",
"podcast.tapToJump": "Tap any word to jump there.",
@ -1401,6 +1404,9 @@ const cs: Record<string, string> = {
"podcast.voiceNaturalNote": "Generuje ho klíč tvého providera — slova jsou časovaná podle audia, takže zvýraznění drží s hlasem.",
"podcast.voiceNeedsKey": "Pro přirozené hlasy si v Nastavení → Provideři přidej klíč OpenAI nebo Groq.",
"podcast.voiceNoSystem": "Tohle zařízení nehlásí žádné systémové hlasy. Přirozený hlas funguje všude — nebo si hlas přidej v nastavení systému.",
"podcast.voiceSilent": "Systémový hlas se nespustil — prohlížeč za ním nemá žádný hlasový engine. Na Firefoxu/Linuxu doinstaluj speech-dispatcher (sudo apt install speech-dispatcher) a stránku otevři znovu.",
"podcast.voiceUseNatural": "Použít přirozený hlas",
"podcast.voiceOpenProviders": "Přidat klíč providera",
"podcast.voiceGenerating": "Generuji hlas…",
"podcast.voiceRobotic": "Jsou nainstalované jen základní systémové hlasy. Pro přirozený hlas moderátora si nějaký přidej v nastavení systému (Windows: Řeč; macOS: Mluvený obsah; Chrome má hlasy Google).",
"podcast.tapToJump": "Klikni na kterékoli slovo a přeskočíš tam.",