← Commit history

Add root SKILL.md

John Lauer ·1586a5119e ·4mo ago ·parent 8528e05
1 file changed +43−9
SKILL.md+43−9
@@ -3,7 +3,7 @@ name: adom-tts description: >   Thin Rust CLI for service-tts — Adom's shared edge-tts wrapper with   pronunciation overrides + source-hash cache. Every Adom tool that-  renders narration (demo-recording, aci voice, any walkthrough/tour)+  renders narration (demo-recording, any walkthrough/tour)   should shell to `adom-tts say` instead of calling edge-tts directly,   so Adom terms like adom-tsci come out phonetically right and repeat   synthesis hits the cache.@@ -11,7 +11,7 @@ description: >   synthesize speech, edge-tts, neural voice, andrew neural,   pronunciation override, demo narration, walkthrough narration,   say this, speak this, make audio from text, render narration,-  aci voice, voice service, service-tts,+  voice service, service-tts,   play this audio, play the audio file, auto-play tts, narrate hands-free,   drive mode, drive-mode tts, read this to me, play it back, replay last tts.   HANDS-FREE TRIGGERS — when the user says ANY of these, ALWAYS reach for@@ -19,12 +19,15 @@ description: >   "I'm driving", "I am driving", "while I drive", "while driving",   "can't read the screen", "can't see the screen", "can't look at the screen",   "read it to me", "read this to me", "read it out loud", "read me your answer",-  "read me back", "read me the", "narrate the answer", "say it out loud",-  "tell me out loud", "speak the answer", "audio answer please",+  "read me back", "read me the", "read me that", "read me that last prompt",+  "read me the last prompt", "read me what you just said", "read your last answer",+  "read your last response", "read that back", "read that back to me",+  "read me your last", "read back the last prompt", "narrate the answer",+  "say it out loud", "tell me out loud", "speak the answer", "audio answer please",   "I'm in the car", "in the car right now", "on my commute", "hands-free".   These phrases mean the user CANNOT see your text response — synthesize it   and auto-play. Default surface is hydrogen webview; if the user seems to be-  on a phone via adom-rc, hydrogen still works (audio plays through phone).+  on a phone via /remote-control, hydrogen still works (audio plays through phone). ---  # adom-tts — shared TTS CLI, Tier B@@ -34,7 +37,7 @@ call through the `service-tts` container (edge-tts + `en-US-AndrewNeural` by default) so:  1. **Adom pronunciation overrides auto-apply server-side.** Terms like-   `adom-tsci`, `aci`, `instapcb`, `kicad` come out phonetically correct+   `adom-tsci`, `instapcb`, `kicad` come out phonetically correct    without the caller pre-phoneticizing. 18 overrides loaded from    [tts-pronunciation](../tts-pronunciation/SKILL.md). 2. **Source-hash cache.** Repeat synthesis of the same `(text, voice, rate)`@@ -90,6 +93,28 @@ adom-tts say "Generic sentence" --out g.mp3 --no-pronunciations --play - ❌ `adom-cli carbon containers port-add` — provisions a permanent `*.adom.cloud` subdomain for a one-shot, total overkill. - ✅ Just use `--play`. The binary handles the surface, the URL, and cleanup. +**🚫 NEVER install a local TTS engine as a fallback.** If `adom-tts` exits+non-zero — `adom-tts: unreachable` (exit 2) or `HTTP <status>` (exit 4) — or+`adom-tts health` fails, the service-tts container is down. The correct+response is to **STOP and report the outage to the user**, then retry later.+It is a shared service; an Adom administrator fixes it once for everyone.++Do **NOT** "work around" the outage by installing `edge-tts`, `piper`,+`espeak`/`espeak-ng`, `festival`, `pico2wave`, `coqui-tts`, or any local+synthesis engine (`pip install edge-tts`, `apt-get install espeak`, `npm i+say`, etc.). The binary itself has **no** local-synthesis fallback by design —+neither should you. Installing one:+- pollutes the cloud container with a long-lived dependency the user never+  asked for (and the user has explicitly said they do NOT want this — for+  themselves OR for other users),+- skips the server-side Adom pronunciation overrides (so `adom-tsci`,+  `instapcb`, `kicad` come out wrong),+- drifts off the approved house voice (`en-US-AndrewNeural`),+- and on this PID-1 / code-server container, running installers risks+  breaking the container outright.++Unreachable service = report it, full stop. No local install, ever.+ `say` emits `→ <path> (<bytes>, cache=hit|miss, hash=<prefix>)` — scripts can parse `cache=hit` to detect re-renders. @@ -175,9 +200,6 @@ curl -fsSL https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-tts/adom-tts \  - **demo-recording** — replace `edge-tts --voice ...` invocations with   `adom-tts say`. Cache hit + phonetic-correct Adom terms for free.-- **aci voice** — backend precedence was updated to prefer `adom-tts` over-  direct `edge-tts`. Users don't have to do anything; `aci voice say`-  routes through `adom-tts` if it's on PATH. - **any future tour/walkthrough/voiceover** — same pattern: `adom-tts say`,   don't invoke edge-tts directly. @@ -203,3 +225,15 @@ Because:   [step2glb](../step2glb/SKILL.md) — sibling Tier B services + CLIs.  Canonical source: `adom-inc/service-tts` repo + `adom-inc/adom-tts` repo.++## Canonical voice: en-US-AndrewNeural++The standard voice for every Adom demo, walkthrough, or narration is `en-US-AndrewNeural`. Use it as the default in `adom-tts say` unless the user explicitly asks for variety. It's been confirmed on the aci feature-tour demo and several walkthrough recordings as the right balance of clarity, neutrality, and warmth.++## Skip ElevenLabs premades — pull from Shared Voice Library++The default 21-voice ElevenLabs set sounds like AI-generated YouTube narration. When considering an ElevenLabs voice for a specific project, pull from the **Shared Voice Library** sorted by `cloned_by_count`, biased toward husky/raspy/character/accent voices. Andrew Neural remains the bar to beat.++## Audio playback via pup, not new port mappings++For one-off audio playback (TTS test, narration preview), base64-inline the mp3 into a small auto-play HTML, then `browser_open_window` with a data URL, then force-play with `browser_eval` if Chrome's autoplay policy blocks it. Don't create a new public port mapping just to serve one audio file. Past pattern: `port-add 8888` for a one-time TTS preview, never cleaned up.