app
Adom TTS: Text to Speech
Public Made by Adomby adom
Adom's shared voice service. Reads your AI's answers back to you while you drive, and renders perfectly-timed voiceover tracks for your demo videos, so you never record your own voice.
← Commit history
v1.9.20 — field fixes: auto-retry early-partial clips, confirm waits through retries + inline evidence, 24h log window + rotation
2 files changed
+12−15
dev-skills/adom-tts-dev/SKILL.md+12−2@@ -54,7 +54,9 @@ manually — deploy a new version and let supersede do the handoff. If you must - Clips **buffer** (up to 10 min) until the player page shows a *sustained* live audience — 3 consecutive polls. One fresh poll is NOT alive (a disconnected/backgrounded page still trickles heartbeats).-- `no-playback` clips are **retried 3×**, never silently consumed.+- `no-playback` AND **early-partial** clips (died under 10% of their duration,+ e.g. 0.7s into an 80s clip) are **retried 3×** (`clip_retry` with a reason,+ `replay: auto`), never silently consumed. - The page **downloads the whole mp3 to a local blob before playing** — a cellular-hotspot drop mid-clip cannot stall audio (the listener is often tethered while driving).@@ -69,7 +71,12 @@ Synthesis success ≠ playback. The page reports telemetry (beacons + piggybacke on `/poll` so a connection gap can't fake a failure); the drainer logs a `clip_end` verdict (`ok/partial/no-playback/error`) per clip to `~/.adom/tts/events.jsonl`. `--confirm` and `check` read that log — they never-touch the contended surface, which is why they're trustworthy. Any new playback+touch the contended surface, which is why they're trustworthy. CRITICAL: the+verdict must reflect the LATEST attempt — `--confirm` keeps waiting while a+retry is queued/playing instead of failing on the first attempt's verdict+(the confirm-vs-reality race from field feedback), and failure output includes+inline evidence (reached/duration + live surface state) so no forensics+session is needed. Any new playback feature MUST keep the verdict truthful; a false "ok" is the worst bug this system can have (a driving user silently misses answers). @@ -115,6 +122,9 @@ threads) and gets confused about WHO said WHAT. Two mechanisms, keep both: - Start: `adom-tts logs` (verdict summary + anomaly hints) and `adom-tts status` (lock pid/version, current clip, queue). Raw: `~/.adom/tts/events.jsonl`.+ The summary is a 24h WINDOW and the log rotates (newest 3000 events) —+ before that, cumulative counters made healed week-old incidents read as+ "failing hard today" and sent reporters chasing ghosts. - "Clip played twice / flipping" → two drainers or a reopen-after-start. Check lock vs live `__drain` processes and `player_reopen` events. - "Synth ok, verdict no-playback" → page not connected. Check
page.json−13@@ -12,7 +12,6 @@ "audio", "demo", "accessibility",- "cli", "open-source", "mit" ],@@ -65,17 +64,5 @@ ], "install": { "binary_name": "adom-tts"- },- "description": "Adom's shared text-to-speech CLI + Playground. Reads your AI answers back to you while driving, and renders perfectly-timed voiceover tracks for demo videos.",- "dependencies": {},- "scripts": {- "install": "./install.sh",- "uninstall": "./uninstall.sh"- },- "needs_sudo": false,- "org": "adom",- "author": {- "name": "John Lauer",- "email": "[email protected]" } }