-
v2.5.62
StableAll checks were successfulRelease / Test backend (push) Successful in 37sRelease / Check ui (push) Successful in 44sRelease / Docker / caddy (push) Successful in 48sRelease / Docker / backend (push) Successful in 4m38sRelease / Docker / runner (push) Successful in 2m49sRelease / Docker / ui (push) Successful in 2m13sRelease / Gitea Release (push) Successful in 57sreleased this
2026-04-04 19:49:53 +05:00 | -365 commits to main since this releasePreviously all voices waited for full TTS generation before first byte
reached the browser (POST → poll → presign flow). For long chapters this
meant 2–5 minutes of silence.New flow for Kokoro and PocketTTS:
- tryPresign fast path unchanged (audio in MinIO → seekable presigned URL)
- On cache miss: set audioEl.src to /api/audio-stream/{slug}/{n} and mark
status=ready immediately — audio starts playing within seconds - Backend streams bytes to browser while concurrently uploading to MinIO;
subsequent plays use the fast path
New SvelteKit route: GET /api/audio-stream/[slug]/[n]
- Proxies backend handleAudioStream (already implemented in Go)
- Same 3 chapters/day free paywall as POST route
- HEAD handler for paywall pre-check (no side effects, no counter increment)
so AudioPlayer can surface upgrade CTA before pointing at URL
CF AI voices keep the old POST+poll flow (batch-only API, no real streaming
benefit, preserves the generating progress bar UX).Downloads