P2 — implement Android microphone/wake/manual activation, streamed playback and cross-process barge-in #175

Open
opened 2026-08-22 21:55:53 +00:00 by lost-rob0t · 0 comments
lost-rob0t commented 2026-08-22 21:55:53 +00:00 (Migrated from github.com)

Parent epic: #152
Depends on: #173, #132; device policy from #170.

Goal

Implement the Android voice edge while reusing the daemon voice pipeline: Android captures/plays audio; server owns existing VAD/STT/routing/LLM/tool/TTS synthesis.

Scope

  • explicit mic permission and audio-route lifecycle;
  • push-to-talk/manual activation first-class;
  • local wake-word mode only according to #170 battery/background/privacy research;
  • stream negotiated input frames through #132;
  • display partial/final transcript and assistant text;
  • bounded streaming playback of server TTS output;
  • local immediate playback stop on user interruption;
  • upstream canonical cancel tied to turn/stream;
  • audio focus/headset/Bluetooth route handling according to Android APIs;
  • background/foreground service behavior explicit;
  • no raw audio in logs/audit.

Tests

Fake audio device/frame golden tests; permission denial/revocation; app background/foreground; device rotation/activity recreation; disconnect mid-utterance; server restart; sequence gap/duplicate/late chunks; slow playback/backpressure; barge-in race; stale audio after cancel; audio focus loss; route change where testable. Real hardware remains final gate.

Acceptance

A real/fixture Android client can speak over one authenticated daemon session, receive transcript/text/audio, and interrupt naturally without server owning Android microphone/speaker state.

Parent epic: #152 Depends on: #173, #132; device policy from #170. ## Goal Implement the Android voice edge while reusing the daemon voice pipeline: Android captures/plays audio; server owns existing VAD/STT/routing/LLM/tool/TTS synthesis. ## Scope - explicit mic permission and audio-route lifecycle; - push-to-talk/manual activation first-class; - local wake-word mode only according to #170 battery/background/privacy research; - stream negotiated input frames through #132; - display partial/final transcript and assistant text; - bounded streaming playback of server TTS output; - local immediate playback stop on user interruption; - upstream canonical cancel tied to turn/stream; - audio focus/headset/Bluetooth route handling according to Android APIs; - background/foreground service behavior explicit; - no raw audio in logs/audit. ## Tests Fake audio device/frame golden tests; permission denial/revocation; app background/foreground; device rotation/activity recreation; disconnect mid-utterance; server restart; sequence gap/duplicate/late chunks; slow playback/backpressure; barge-in race; stale audio after cancel; audio focus loss; route change where testable. Real hardware remains final gate. ## Acceptance A real/fixture Android client can speak over one authenticated daemon session, receive transcript/text/audio, and interrupt naturally without server owning Android microphone/speaker state.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
nsaspy/zara#175
No description provided.