Skip to content

feat(desktop): add Pocket voice settings - #3208

Draft
johnmatthewtennant wants to merge 11 commits into
jt/buzz-voice-refactorfrom
jtennant/pocket-tts-settings-v1
Draft

feat(desktop): add Pocket voice settings#3208
johnmatthewtennant wants to merge 11 commits into
jt/buzz-voice-refactorfrom
jtennant/pocket-tts-settings-v1

Conversation

@johnmatthewtennant

@johnmatthewtennant johnmatthewtennant commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Context

Pocket TTS can read live agent replies during a huddle, but Buzz does not provide an installation-wide way to turn that behavior off or choose among the bundled voices. The setting also needs a stable voice identity boundary that future backends and per-agent preferences can reuse without treating a display label as identity.

Summary

This adds a compact Pocket voice settings surface with an Agent text to speech toggle, preview playback, and 12 bundled voices. Text to speech remains enabled by default with Mary selected. Disabling it immediately cancels queued and in-flight agent speech.

Changes

  • Adds a versioned, device-local TTS settings schema and backend-qualified voice keys.
  • Bundles Anna, Azelma, Charles, Eponine, Eve, Fantine, George, Jane, Mary, Michael, Paul, and Vera with provenance and deterministic Mary fallback behavior.
  • Adds voice selection and preview controls while preserving the saved voice when text to speech is disabled.
  • Speaks only new live agent-authored text in active huddles, including kind 40002 agent replies, while excluding history, people, reactions, edits, system or tool rows, and attachment-only content.
  • Preserves route order across reconnects and serializes toggle and voice changes.
  • Cancels stale, queued, and in-flight speech on barge-in, shutdown, or voice changes without appending stale audio.
  • Adds content-free route diagnostics, focused Rust and frontend coverage, and a Playwright screenshot flow.

Related issue

Testing

  • just desktop-tauri-test: 1,883 passed, 0 failed, 14 ignored.
  • Rodio mixer diagnostics: 3 passed, 0 failed.
  • cd desktop && pnpm test: 3,782 passed, 0 failed.
  • cd desktop && pnpm check: passed, including Biome, file-size, px-text, and pubkey-truncation guards.
  • Focused live routing and filtering tests: 14 passed, 0 failed.
  • Fresh E2E build plus voice-settings.spec.ts --project=smoke: 2 passed, 0 failed.
  • Final affected Rust, Stacksmith, and minimize-diff reviews found no actionable issues.
  • Exact validated head: 7cc080448ce8f79c4d23d939beff95566044348b.

Manual validation remaining:

  • In a live dev or release huddle, audition all 12 bundled voices.
  • Confirm a new kind 40002 agent response is spoken through the selected huddle output.

Screenshots

The expanded 12-voice selector screenshot is preserved locally at desktop/test-results/voice-settings/pocket-voices.png with SHA-256 ce5aecacdbd146e27aa5d5353005c1aaf38254158ee24db9a39ea90c1ece2384. It has not been posted.

Reviewer-reproducible examples

From a fresh checkout, run the complete native and frontend contract suites:

. ./bin/activate-hermit
just desktop-tauri-test
cd desktop
pnpm test
pnpm check

Observed result:

Native: 1883 passed, 0 failed, 14 ignored
Rodio diagnostics: 3 passed, 0 failed
Desktop: 3782 passed, 0 failed
Desktop checks: passed

Build the E2E surface and exercise the expanded selector:

cd desktop
pnpm run build:e2e
pnpm exec playwright test tests/e2e/voice-settings.spec.ts --project=smoke

Observed result:

2 passed, 0 failed
12 bundled voice options rendered

The remaining user-visible audio check requires a live huddle and physical output device:

  1. Open Settings, select each bundled voice, and use Preview.
  2. Join a huddle with an agent and select the intended output device.
  3. Send a message that produces a new kind 40002 agent response.
  4. Confirm the response is spoken once through the selected output and that changing the voice cancels stale audio.

@johnmatthewtennant
johnmatthewtennant force-pushed the jtennant/pocket-tts-settings-v1 branch from df8cad5 to a741f1a Compare July 27, 2026 23:41
@johnmatthewtennant
johnmatthewtennant changed the base branch from main to jt/buzz-voice-refactor July 27, 2026 23:41
@johnmatthewtennant
johnmatthewtennant force-pushed the jtennant/pocket-tts-settings-v1 branch 2 times, most recently from 4891a92 to c118f5a Compare July 28, 2026 04:48
@johnmatthewtennant
johnmatthewtennant force-pushed the jt/buzz-voice-refactor branch 5 times, most recently from be4adc9 to 617e0d2 Compare July 28, 2026 21:40
johnmatthewtennant and others added 11 commits July 28, 2026 17:42
Signed-off-by: John Tennant <johnmatthewtennant@gmail.com>
Signed-off-by: John Tennant <jtennant@block.xyz>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
Signed-off-by: John Tennant <jtennant@squareup.com>
@johnmatthewtennant
johnmatthewtennant force-pushed the jtennant/pocket-tts-settings-v1 branch from 7e5cc4b to 7cc0804 Compare July 28, 2026 21:48
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