Podcast player: calmer line-following scroll, and a voice you can pick

"The scrolling works kinda weirdly" + "maybe a less robotic voice, preferably
male".

Scroll: the transcript now follows by LINE, not by word - words on the same
line never move the page (that was the jitter), a line only scrolls once it
leaves a comfortable band, small corrections are instant rather than animated,
and a wheel/touch/drag on the transcript pauses the following for four seconds
instead of fighting the reader. Chapter jumps and word taps re-centre at once.

Voice: lib/podcast-voices ranks what the platform installed (natural / neural
/ online names up, espeak / SAM / compact down, a male name preferred) and the
player picks the best one automatically; a new picker in the chrome lists
everything in the episode's language, applies it live and remembers the choice
per language. A note points at the system settings when only robotic voices
exist. The engine takes the chosen voice instead of guessing.

podcast-test: 34 checks now (voice ranking, filtered picker, persisted pick,
same-line silence, line following, manual-scroll suspension). Version 0.7.4,
SW v96.
This commit is contained in:
Martin Dvořák 2026-10-16 13:05:57 +00:00
commit 4ec986da12
8 changed files with 684 additions and 46 deletions

View file

@ -1516,7 +1516,16 @@ Things I chose while building, with the reasoning:
contrast, and the scan now covers this screen too. `tests/podcast-test.mjs` (17th suite)
stubs both the model and the speech engine: it drives a boundary event, checks the
pause/resume word, the chapter jump, the speed change, the stored position and the plugin's
400/stream guards (26 checks).
400/stream guards. **Follow-up (0.7.4):** the scroll follows by *line*, not by word — words on
the same line never move the page (that was the jitter), a line only scrolls once it leaves a
comfortable band, small corrections are instant instead of animated, and a manual wheel,
touch or drag pauses the following for four seconds instead of fighting the reader; a seek
(chapter, word tap) re-centres at once. And the voice is now a choice: `lib/podcast-voices`
ranks what the platform has installed (natural/neural/online names up, espeak/SAM/compact
down, a male name preferred — "preferably male" was the ask), the player picks the best one
automatically and offers a picker for everything in the episode's language, and the choice is
remembered per language. The suite grew to 34 checks (voice ranking, the filtered picker,
persisting a pick, same-line silence, line following, manual-scroll suspension).
102. **An API key is not a login.** "When trying to use a different provider on the web app it
glitches out completely" — a photo of the first-run gate with iOS's saved-password sheet laid