v1.18.0 — Atom TTS prefetch+FIFO, deferred idle TTS, Tailscale router guide#58
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three independently useful changes bundled into the v1.18.0 release.
1. Atom TTS prefetch + FIFO (PLANS_53) — primary feature
MH_TTS_REMOTE_PREFETCH_MS(default 900) returnsplay_stopearly for browser-only audio targets so the next chunk's synthesis can overlap the current chunk's playback.stop(), PTT, and interrupt flush both the active and queued audio.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.mjsadvanced its generation watermark on every relayed payload, so a deferred-idle (PLANS_52)tts_stateat generation N+1 caused the in-flight gen=N utterance's tail chunks to be dropped as "stale". Fix: scopeobserveGenerationtotts_audio/tts_audio_refonly. 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 guideDocs and defaults
doc/guides/operator-stack.md(EN+JA), andexamples/rmh-voice-mode/README.mdnow recommend--audio-target browserfor PC browser, mobile, and AtomS3R, with a brief note that worker prefetch is disabled inbothmode.restart-operator-stack-in-place.shdefault changed frombothtobrowserto matchrun-operator-stack.sh's existing default.Version
Bumped across all six sites:
package.json,mcp-server/dist/index.js(SERVER_VERSION), both workerpyproject.toml, bothuv.lock(regenerated viauv lock).Test plan
node --check scripts/atoms3r-http-bridge.mjs.venv-platformio/bin/pio run -d firmware/atoms3r-headroom(per PLANS_53 ExecPlan)npm test(375 tests, per PLANS_53 ExecPlan)doc/guides/operator-stack.mdaudio target descriptions render well in both languages🤖 Generated with Claude Code