← Commit history

Publish 1.9.34

John Lauer ·795a7be2d1 ·2mo ago ·parent 14ee1b6
5 files changed +40−39
README.md+29−29
@@ -1,6 +1,6 @@-# Adom TTS — Text to Speech+# Adom TTS: Text to Speech -**Adom's shared voice.** A thin Rust CLI + a live player webview for `service-tts` —+**Adom's shared voice.** A thin Rust CLI + a live player webview for `service-tts`, the edge-tts wrapper with Adom pronunciation overrides and a source-hash cache. Your AI speaks through it; you listen instead of read. @@ -12,11 +12,11 @@ You're in the car and can't read the screen. Just say:  > "Read me your last answer, I'm driving." -Claude composes the reply, speaks it through the shared player, and — this is the-important part — **verifies you actually heard it**. Clips buffer through dead zones+Claude composes the reply, speaks it through the shared player, and (this is the+important part) **verifies you actually heard it**. Clips buffer through dead zones and hotspot drops, retry if they never reached your ears, and land in a replayable History if two updates arrive back-to-back. The full hands-free contract lives in the-[adom-tts skill](skills/adom-tts/SKILL.md) (also on this page's **Skills** tab) — it+[adom-tts skill](skills/adom-tts/SKILL.md) (also on this page's **Skills** tab); it triggers on the words you'd actually say: "read it to me", "read that back", "I'm in the car", "narrate the answer", and many more. @@ -25,7 +25,7 @@ the car", "narrate the answer", and many more. You don't have to be driving. Long AI answers are tiring to read; tell your AI "say it out loud" or "talk to me instead of writing" and every reply plays through the player while you keep your eyes on your actual work. Parallel AI threads share-ONE player — clips queue in order, never talk over each other, and each one announces+ONE player: clips queue in order, never talk over each other, and each one announces which thread is speaking and what the update is about.  ### 3. Demo-video voiceovers (exact timing, no recording booth)@@ -33,7 +33,7 @@ which thread is speaking and what the update is about. Feed `adom-tts` a narration script and get a clean, perfectly-timed `.mp3` voiceover track in the house voice (`en-US-AndrewNeural`). No retakes, no listening to your own voice. Every clip is cached by source hash, so iterating on a script is instant after-the first render — which is why `demo-recording`, `video-post`, and every+the first render, which is why `demo-recording`, `video-post`, and every tour/walkthrough tool route through it.  ## What it looks like@@ -41,7 +41,7 @@ tour/walkthrough tool route through it. ### The live player  One shared player for all your AI threads. The header tells you WHO is speaking (the-thread) and WHAT the clip is about — here the `flight-search` thread is reading out+thread) and WHAT the clip is about. Here the `flight-search` thread is reading out flight options. The transcript highlights word-by-word as it speaks, the version badge shows which build is running, and the green light breathes while the AI's pipe to the player is live.@@ -51,7 +51,7 @@ player is live. ### The replayable History  Missed a clip because you drove through a dead zone, or two threads spoke back-to-back?-Every played clip is kept — with the sending thread, a one-line description, when it+Every played clip is kept, with the sending thread, a one-line description, when it played, and a replay button. Clips that never fully played are flagged, so the one you missed is exactly the one that stands out. Tap the arrow and it plays again. @@ -61,7 +61,7 @@ missed is exactly the one that stands out. Tap the arrow and it plays again.  Playback is never assumed. `--play` queues the clip and reports its queue position; `--confirm` blocks until the player proves the audio reached you, end to end. Note the-required `--thread` and `--desc` — anonymous clips are refused, because a History full+required `--thread` and `--desc`: anonymous clips are refused, because a History full of `reply.mp3` entries helps no one.  ![Terminal session showing say --play --confirm returning CONFIRMED, and adom-tts status showing the live player](screenshots/cli-verified.png)@@ -74,14 +74,14 @@ adom-tts health        # confirm the shared voice service is reachable ```  That installs the CLI, the `adom-tts` Claude Code skill, and bash completions. The CLI-talks to the shared `service-tts` container — **nothing about a TTS engine is installed+talks to the shared `service-tts` container. **Nothing about a TTS engine is installed locally.**  ## Quick start  ```bash # Speak to the human and VERIFY they heard it (the canonical pattern).-adom-tts say "This is the demo thread — the build is green." \+adom-tts say "This is the demo thread: the build is green." \   --out /tmp/x.mp3 --thread "demo" --desc "build status update" --play --confirm  # Demo voiceover: render a narration track to a file (no playback, no --thread needed).@@ -97,36 +97,36 @@ adom-tts play last  ## Dependencies -This package has **zero registry dependencies** — it installs and runs standalone.+This package has **zero registry dependencies**: it installs and runs standalone.  | Dependency | Required? | Why | |---|---|---|-| `service-tts` container | Runtime (shared) | The synthesis backend (edge-tts + pronunciation overrides + cache). Shared Adom infra — already running, not something you install. |+| `service-tts` container | Runtime (shared) | The synthesis backend (edge-tts + pronunciation overrides + cache). Shared Adom infra, already running, not something you install. | | `pup` (desktop Chrome) | Optional | Only for `--surface pup` to play in a desktop browser window instead of the default Hydrogen webview tab. |  ## Features -- **One shared player, many AI threads** — a single persistent server owns one webview;+- **One shared player, many AI threads**: a single persistent server owns one webview;   clips from every thread play sequentially, never overlapping, each labeled with its   thread and description.-- **Verified playback** — `--confirm` blocks until the human actually heard the clip;+- **Verified playback**: `--confirm` blocks until the human actually heard the clip;   `check` answers "did mine play?"; every command returns hints teaching the AI the   next correct step.-- **Never lose a clip** — buffering while your device is offline (up to 10 min),+- **Never lose a clip**: buffering while your device is offline (up to 10 min),   automatic retries, hotspot-proof download-then-play, and the replayable History.-- **Demo voiceover** — house voice `en-US-AndrewNeural`, any edge-tts voice via+- **Demo voiceover**: house voice `en-US-AndrewNeural`, any edge-tts voice via   `--voice`, speed via `--rate`, stdin piping for long scripts, source-hash cache.-- **Server-side pronunciation overrides** — Adom terms come out right without the+- **Server-side pronunciation overrides**: Adom terms come out right without the   caller pre-phoneticizing.-- **Swappable backend** — edge-tts today; can move to piper/Azure/ElevenLabs+- **Swappable backend**: edge-tts today; can move to piper/Azure/ElevenLabs   server-side with zero caller changes.  ## Talk to the AI -Paste any of these into Claude Code — they use the exact words the skill triggers on:+Paste any of these into Claude Code; they use the exact words the skill triggers on:  **Hands-free / drive mode**-- "I'm driving — read me your last answer."+- "I'm driving, read me your last answer." - "Read that back to me, I can't look at the screen." - "I'm in the car, narrate the answer." @@ -158,7 +158,7 @@ Paste any of these into Claude Code — they use the exact words the skill trigg | `adom-tts status` | Live player, current clip, the whole queue in order. | | `adom-tts play last\|<id>\|<path>` | Replay a clip (newest, by id/hash, or a file). | | `adom-tts control replay\|pause\|play\|toggle` | Drive the live player without reloading it. |-| `adom-tts reopen` | Re-offer the player tab if it was closed (queue survives). |+| `adom-tts reopen` | Re-surface the player if its window was closed (queue survives). | | `adom-tts logs [--tail N]` | Playback/synthesis event log with verdicts + anomaly hints. | | `adom-tts serve [--port N]` | Open the Playground webview. | | `adom-tts voices` / `pronunciations` / `health` / `config` | Service info. |@@ -168,17 +168,17 @@ Paste any of these into Claude Code — they use the exact words the skill trigg  **Exit codes:** `0` ok · `1` invalid input · `2` service unreachable · `4` service-side error · `5` playback not confirmed · `6` missing `--thread`/`--desc` with `--play`.-On `2`/`4` the service is down — report it; **do not** install a local TTS engine as a+On `2`/`4` the service is down: report it; **do not** install a local TTS engine as a workaround. -## Open source — modify it, then publish it back+## Open source: modify it, then publish it back  `adom-tts` is **open source under the MIT license** (see `LICENSE`). The whole project lives on this page as a git repo (see the **Files** tab): -1. **Get the source** — `adom-wiki repo clone adom/adom-tts`.-2. **Change whatever you want** — add a voice, a flag, a play surface; fix a bug.-3. **Publish it back** — bump the version, `adom-wiki pkg publish`, `adom-wiki repo push`.+1. **Get the source**: `adom-wiki repo clone adom/adom-tts`.+2. **Change whatever you want**: add a voice, a flag, a play surface; fix a bug.+3. **Publish it back**: bump the version, `adom-wiki pkg publish`, `adom-wiki repo push`.    Your improvement goes to the shared registry and the whole community inherits it.  ### One part isn't yours to change: the voice backend@@ -186,6 +186,6 @@ lives on this page as a git repo (see the **Files** tab): The MIT grant covers this CLI and the player. It does **not** cover the synthesis backend. Every `adom-tts say` call hits **Adom's cloud `service-tts` API**, which runs on Adom's infrastructure and counts against **Adom's quota**. That backend is an Adom-service, subject to change — endpoints, voices, rate limits, and availability can be+service, subject to change: endpoints, voices, rate limits, and availability can be modified or retired at Adom's discretion. Your fork is free and yours; the shared voice service it calls is a managed Adom service, not part of the open-source guarantee.
bin/adom-tts
⋯ 1 unchanged line ⋯
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-tts",-  "version": "1.9.33",+  "version": "1.9.34",   "type": "app",   "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.",   "license": "MIT",
page.json+1−1
@@ -4,7 +4,7 @@   "slug": "adom-tts",   "title": "Adom TTS — Text to Speech",   "brief": "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.",-  "version": "1.9.33",+  "version": "1.9.34",   "license": "MIT",   "tags": [     "tts",
skills/adom-tts/SKILL.md+9−8
@@ -45,8 +45,9 @@ by default) so: 3. **Adom-owned URL.** Backend (edge-tts → piper → Azure direct → ElevenLabs)    is swappable without any caller changes. -Default voice is `en-US-AndrewNeural` per approval. Service lives at-`https://adom-tts-f84dy9x2ezq9.adom.cloud`; CLI bakes it in at build time.+Default voice is `en-US-AndrewNeural` per approval. The service endpoint is+baked into the CLI at build time (see `adom-tts config`, the `service url`+line); it is an internal host, not something a caller ever opens by hand.  ## When to reach for this skill (besides obvious "make me an mp3" asks) @@ -319,14 +320,14 @@ Don't write an autoplay HTML file. Don't create a port mapping. The detached child handles the surface and self-shuts down on the audio's `ended` event (or after a 5-minute cap). -## Install (Tier B via wiki)+## Install (via wiki)++The binary ships inside the wiki package (Linux container install), so one+command pulls the CLI + skills and puts `adom-tts` on your PATH:  ```bash-curl -fsSL https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-tts/adom-tts \-  -o /tmp/adom-tts && chmod +x /tmp/adom-tts \-  && sudo install -m 0755 /tmp/adom-tts /usr/local/bin/adom-tts \-  && adom-tts install \-  && adom-tts health+adom-wiki pkg install adom/adom-tts+adom-tts health ```  ## Who should use this (and how)