Voice tasting — every voice we can reach, one page

Test sentence: “What you have touched is a sphere, fired twice, in a small workshop. It was ordered in nineteen sixty-two by a harbor master, a careful man, who wanted brightness through fog.”

Tier 1 — built-in iPhone voices · live, tap to hear · the trivial swap

$0, offline, zero integration workonly tier with LIVE word events (what the scroll rides today) Rows read a shorter sample. Karen is the current Overexplainer voice. Enhanced/premium variants appear only if downloaded in Settings → Accessibility → Spoken Content → Voices.

Loading device voices…

Tier 2 — Kokoro-82M · open-weights neural TTS · demoed below, free forever

$0runs in browser (~90 MB one-time model download) or on our serveriPhone-Chrome feasibility unverified — needs a device probe before we commitno live word events — scroll sync would pace from audio duration + our text map

E1 — af_heart (US female, their flagship)
E2 — af_bella (US female, warmer)
E3 — af_nicole (US female, whispery/ASMR)
E4 — am_michael (US male)
E5 — am_fenrir (US male, deeper)
E6 — bf_emma (British female)
E7 — bm_george (British male)

Tier 2b — Cloudflare Workers AI · demoed below · free tier on your existing account

~$0 at art-piece volumeserver-side: generated by a few lines in our existing CF Functions, no new vendorno word timestamps — estimated pacing for scroll

C1 — Deepgram Aura: asteria (US female)
C2 — Deepgram Aura: luna (US female, softer)
C3 — Deepgram Aura: orion (US male)
C4 — Deepgram Aura: angus (Irish male)
C5 — MeloTTS (US female)

Tier 2c — Gemini TTS (Vertex) · demoed below · rides the piece's existing Google project

zero new keys — generated via your existing Google auth; prod would use the proxy's existing service account~30 voices, style-PROMPTABLE (see G7)no word timestamps — estimated pacing for scroll

G1 — Kore (firm female)
G2 — Aoede (breezy female)
G3 — Leda (youthful female)
G4 — Charon (informative male)
G5 — Puck (upbeat male)
G6 — Enceladus (breathy male)
G7 — Kore, style-prompted: “hushed, conspiratorial near-whisper, one visitor in an empty museum” — same voice as G1, directed by a sentence of prose

Tier 2d — ElevenLabs · demoed below · your new free account

the current quality bar for expressive TTSTIMESTAMPS VERIFIED: the API returned per-character timings for this exact sentence (175 chars, 10.5s) — a perfect live playhead for the scroll controllerfree tier ≈10k chars/month ≈ a dozen stories; $5/mo for ~30k morefree tier caps at 2 concurrent requests

L1 — George (warm British storyteller)
L2 — Lily (velvety British female)
L3 — Sarah (mature, reassuring)
L4 — River (relaxed, gender-neutral)
L5 — Brian (deep, resonant)
L6 — Callum (husky trickster)

Tier 3 — still undemoed (needs a key we don't hold)

OAOpenAI tts-1 / gpt-4o-mini-tts
needs an OpenAI key we don't currently hold$15/1M chars — pennies per story

The architectural note that matters

Today's scroll sync feeds on the phone's LIVE per-word events — only built-in voices emit those. Any voice above means server- or browser-generated audio with no live events: ElevenLabs hands us word timestamps directly (best), everything else gets pacing estimated from audio duration + the text map. Both fit the new v3 controller; it was built to run from sparse or estimated playheads.