diff --git a/README.md b/README.md index ac203ba..78decb6 100644 --- a/README.md +++ b/README.md @@ -1492,6 +1492,26 @@ Things I chose while building, with the reasoning: into view as you type. No strings, so no i18n; the additive change sits on top of the merged scene-heat rework unchanged. +104. **Natural voices — and the crack at the end of every sentence.** Two reports, one root: + the platform's speech engine. "There's a loud cracking sound at the end of every sentence" is + the browser/OS TTS (iOS and several Linux engines pop between their internal sentence chunks, + and an unnecessary `cancel()` makes it worse) — nothing in our code touches audio there. Both + halves are answered: the system path got hygiene (never cancel while idle, strip control + characters and normalise ellipses/dashes before speaking, and a 140 ms beat between sections + so speech never runs into the engine's tail), and the real fix is a second voice source that + does not use the platform engine at all. `lib/providers` now carries TTS profiles (OpenAI + `gpt-4o-mini-tts`, Groq `playai-tts`, and any OpenAI-compatible `/audio/speech` the custom + provider points at; male voices first), `/api/tts` proxies them so the key still never leaves + the browser, and the player's picker gains a **System / Natural** switch with the provider's + voice list. The natural engine (`lib/podcast-audio`) plays one clip per section through an + `