Podcast voices: an iPhone note on where the other voices live

Safari hands web pages one voice per language, whatever the iPhone has
installed, so the picker cannot fix that on iOS. It now carries the way out
instead: Accessibility -> Spoken Content -> Voices -> your language, download
an Enhanced/Premium voice and make it preferred. The speaker button wears an
amber dot while the note is waiting, and the voice-less banner appends the
same guidance. Detection covers iPadOS too (maxTouchPoints, since it reports
as a Mac).

The suite fakes an iPhone user agent, a single Daniel voice and pins the dot
and the note's actual steps (37 checks). Version 0.7.5, SW v97.
This commit is contained in:
Martin Dvořák 2026-10-16 13:51:12 +00:00
commit 9882d775e7
7 changed files with 83 additions and 7 deletions

View file

@ -306,6 +306,7 @@ const en: Record<string, string> = {
"podcast.voiceAuto": "Automatic (best available)",
"podcast.voiceLocal": "installed",
"podcast.voiceNote": "Voices come from your browser and system — pick the one that sounds best to you.",
"podcast.voiceIos": "On iPhone, Safari offers web pages a single voice per language — the system's preferred one. For more (and better) voices: Settings → Accessibility → Spoken Content → Voices → your language, download a voice in Enhanced or Premium quality and make it the preferred one. Freezmo then reads with it.",
"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.",
"podcast.noVoice": "This browser has no speech voice installed, so the transcript cannot be read aloud here. You can still read along.",
@ -1378,6 +1379,7 @@ const cs: Record<string, string> = {
"podcast.voiceAuto": "Automaticky (nejlepší dostupný)",
"podcast.voiceLocal": "nainstalovaný",
"podcast.voiceNote": "Hlasy dodává prohlížeč a systém — vyber si ten, co zní nejlíp.",
"podcast.voiceIos": "Na iPhonu nabízí Safari webovým stránkám jen jeden hlas na jazyk — ten preferovaný v systému. Pro další (a lepší) hlasy: Nastavení → Zpřístupnění → Mluvený obsah → Hlasy → tvůj jazyk, stáhni si hlas ve verzi Vylepšený nebo Prémiový a nastav ho jako preferovaný. Freezmo pak čte s ním.",
"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.",
"podcast.noVoice": "Tento prohlížeč nemá nainstalovaný hlas, takže se přepis nedá přečíst nahlas. Číst ho ale můžeš dál.",

View file

@ -229,3 +229,16 @@ export function onlyRoboticVoices(locale: string, voices?: SpeechSynthesisVoice[
}
export const MALE_VOICE_HINTS = MALE_NAMES;
/**
* iPhone/iPad (all iOS browsers are WebKit): Safari hands web pages a single
* voice per language — the system's preferred one — no matter how many are
* installed, so the picker needs to say where to get a better one.
*/
export function isAppleMobile(): boolean {
if (typeof navigator === "undefined") return false;
const ua = navigator.userAgent;
if (/iPhone|iPod/.test(ua)) return true;
/* iPadOS 13+ reports as a Mac; the touch points give it away. */
return /iPad/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1);
}