Skip to content

v1.18.0 — Atom TTS prefetch+FIFO, deferred idle TTS, Tailscale router guide#58

Merged
amariichi merged 3 commits into
mainfrom
work/defer-idle-tts-and-router-doc
May 24, 2026
Merged

v1.18.0 — Atom TTS prefetch+FIFO, deferred idle TTS, Tailscale router guide#58
amariichi merged 3 commits into
mainfrom
work/defer-idle-tts-and-router-doc

Conversation

@amariichi
Copy link
Copy Markdown
Owner

Summary

Three independently useful changes bundled into the v1.18.0 release.

1. Atom TTS prefetch + FIFO (PLANS_53) — primary feature

  • TTS worker: MH_TTS_REMOTE_PREFETCH_MS (default 900) returns play_stop early for browser-only audio targets so the next chunk's synthesis can overlap the current chunk's playback.
  • face-app browser audio: same-session chunks queue sequentially instead of replacing the active source.
  • AtomS3R firmware: one-pending-WAV FIFO; stop(), PTT, and interrupt flush both the active and queued audio.
  • Net effect: long multi-sentence answers on PC browser, mobile browser, and AtomS3R play with much shorter inter-chunk gaps.

2. Bridge generation watermark fix (PLANS_52 × PLANS_53 integration)

Hardware testing surfaced a regression where the AtomS3R cut off mid-utterance and then spoke an idle notification. Root cause: scripts/atoms3r-http-bridge.mjs advanced its generation watermark on every relayed payload, so a deferred-idle (PLANS_52) tts_state at generation N+1 caused the in-flight gen=N utterance's tail chunks to be dropped as "stale". Fix: scope observeGeneration to tts_audio / tts_audio_ref only. Verified end-to-end on hardware.

3. Deferred idle TTS + Tailscale router guide

Already on the branch from earlier work:

  • Defer idle TTS notifications until speech drains (PLANS_52)
  • Add Tailscale travel router setup guide

Docs and defaults

  • README, doc/guides/operator-stack.md (EN+JA), and examples/rmh-voice-mode/README.md now recommend --audio-target browser for PC browser, mobile, and AtomS3R, with a brief note that worker prefetch is disabled in both mode.
  • restart-operator-stack-in-place.sh default changed from both to browser to match run-operator-stack.sh's existing default.

Version

Bumped across all six sites: package.json, mcp-server/dist/index.js (SERVER_VERSION), both worker pyproject.toml, both uv.lock (regenerated via uv lock).

Test plan

  • node --check scripts/atoms3r-http-bridge.mjs
  • .venv-platformio/bin/pio run -d firmware/atoms3r-headroom (per PLANS_53 ExecPlan)
  • Full npm test (375 tests, per PLANS_53 ExecPlan)
  • Hardware: 3-step live test on AtomS3R confirmed the gap-reduction, the bridge regression, and the post-fix end-to-end success
  • Reviewer: spot-check doc/guides/operator-stack.md audio target descriptions render well in both languages

🤖 Generated with Claude Code

amariichi and others added 3 commits May 24, 2026 18:11
Smoother long-form TTS to remote audio sinks (PC browser, mobile,
AtomS3R) and a related bridge integration fix.

PLANS_53 implementation (codex):
- tts-worker: MH_TTS_REMOTE_PREFETCH_MS (default 900) returns play_stop
  early for browser-only audio targets so the next chunk's synthesis
  can overlap the current chunk's playback.
- face-app browser audio: same-session chunks queue sequentially
  instead of replacing the active source.
- AtomS3R firmware: one-pending-WAV FIFO; stop/PTT/interrupt flush.

Bridge integration fix:
- scripts/atoms3r-http-bridge.mjs: scope observeGeneration to
  tts_audio / tts_audio_ref only. Previously every relayed payload
  advanced the watermark, so a deferred-idle (PLANS_52) tts_state at
  generation N+1 caused the in-flight gen=N utterance's tail chunks
  to be dropped — the AtomS3R would cut off mid-sentence and then
  speak the idle notification. Verified end-to-end on hardware.

Docs and defaults:
- README, doc/guides/operator-stack.md (EN+JA), and
  examples/rmh-voice-mode/README.md now recommend
  `--audio-target browser` for PC browser, mobile, and AtomS3R,
  with a brief note that worker prefetch is disabled in `both` mode.
- restart-operator-stack-in-place.sh default changed from `both`
  to `browser` to match run-operator-stack.sh's existing default.

Version bumped across all six sites: package.json, mcp-server
SERVER_VERSION, both worker pyproject.toml, both uv.lock.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@amariichi amariichi merged commit f60ca6c into main May 24, 2026
1 check passed
@amariichi amariichi deleted the work/defer-idle-tts-and-router-doc branch May 24, 2026 10:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant