You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After #1097 is fixed and #1071 is merged, evolve the Windows Voice Assistant from its initial one-shot wake flow into two explicit experiences:
Voice Wake: wait for a configurable phrase, handle one request, speak one response, then return to wake listening.
Talk Mode: run an ongoing listen, answer, speak loop until the user stops it.
#1071 should remain the foundation. It already establishes the important Windows-specific building blocks: local Whisper transcription, energy VAD, transcript-based wake matching, exclusive microphone ownership, canonical native Chat routing, exact gateway-run response correlation, configured TTS playback, settings readiness, and lifecycle cleanup.
Its transcript gate should be treated as a prototype and fallback, not the final wake-detection architecture. Generic speech-to-text is not optimized to produce a stable spelling for short names or invented words. A phrase such as "Hey Claw" may be transcribed as "Hey Klaw," "Hey Klaue," or another phonetically similar form, causing an exact text gate to miss a valid activation.
Reliable always-on Voice Wake will probably require a dedicated acoustic wake-word model that detects the target sound pattern before command transcription.
This proposal separates future modes instead of incrementally adding every behavior to the one-shot coordinator.
Wake phrase and request in one silence-bounded utterance -> selected native Chat session -> one correlated response -> configured TTS -> resume wake listening.
It does not add a wake-word model, continuous conversation, barge-in, or a new gateway or node protocol.
Research against the macOS implementation in openclaw/openclaw@030dbe9 shows that OpenClaw treats Voice Wake and Talk Mode as separate experiences:
Voice Wake uses ordinary on-device speech recognition plus deterministic transcript matching, not a dedicated acoustic wake-word model.
Voice Wake normally handles one command and returns to passive listening.
Talk Mode can be started manually or entered after a wake phrase.
Barge-in and speech interruption are Talk Mode concerns, not prerequisites for basic wake activation.
Windows should follow that product separation while retaining its native speech stack. Windows uses local Whisper and energy VAD where macOS uses Apple Speech.
Why transcript matching is not sufficient
The macOS implementation uses deterministic transcript matching, but that does not establish that transcript matching will be reliable enough on Windows. The #1071 prototype exposes a predictable failure mode:
Ambient speech is converted into text by a general-purpose Whisper model.
VoiceWakeGate requires the configured phrase to match the opening transcript tokens.
A phonetically correct but differently spelled transcript does not activate the Assistant.
Adding aliases, edit distance, or phonetic matching could improve recall in the short term, but it also expands the false-activation surface and becomes difficult to reason about across accents and languages. These techniques are useful fallback experiments, not a substitute for acoustic keyword spotting.
A dedicated wake-word detector evaluates audio against a phrase-specific model and emits a confidence score without depending on the transcription spelling. This should improve recognition of names and invented words such as "Claw," but it is not automatic or universal. The model still needs representative positive and negative audio, noise and accent coverage, threshold tuning, packaging, and sustained CPU measurements.
There is also a product tradeoff with #1071's arbitrary one-to-three-word wake phrase setting. Most dedicated detectors support fixed model-backed phrases, generated phrase-specific models, or user enrollment. The first reliable release should therefore do one of the following:
ship one or more supported model-backed phrases such as "OpenClaw" or "Hey Claw";
generate or download a model when a custom phrase is configured;
add local user enrollment for a custom phrase.
Free-form custom phrases that continue using transcript matching should be labeled experimental and should not carry the same reliability claim as model-backed phrases.
Proposed user experience
Experience
Activation
Behavior
Off
Disable Voice Wake and stop Talk Mode
No Assistant-owned microphone capture
Voice Wake
Enable Voice Wake and say the configured phrase
Capture one request, speak one matching response, then return to wake listening
Wake into Talk Mode
Enable Trigger Talk Mode, then say the configured phrase
Enter an ongoing conversation without requiring the phrase for each turn
Manual Talk Mode
Start Talk Mode from native Chat or an always-reachable tray control
Enter the same ongoing conversation without a wake phrase
Push-to-talk
Use the existing push-to-talk interaction
Remain an independent one-request input path
Voice Wake should support both:
The existing phrase-plus-request form: "OpenClaw, summarize my unread messages."
A trigger-only form: say "OpenClaw," pause, then speak the request within a bounded command window.
The Windows one-shot behavior should continue speaking its response. This preserves #1071 behavior even though the macOS one-shot forwarder does not itself own speech output.
Keep Talk Mode transient. Starting Talk Mode should be a runtime action, not a persisted always-on startup mode.
Pin a Talk Mode session. Resolve the visible selected Chat session when Talk Mode starts and keep that session for the conversation. Voice Wake can continue resolving the selected session for each independent turn.
Ship sequential Talk Mode first. The first Talk Mode milestone should stop listening while thinking and speaking. Barge-in should be a later, separately proven capability.
Treat transcript matching as provisional. Preserve it as a compatibility fallback and test seam, but require model-backed acoustic detection before calling always-on Voice Wake production-ready.
Avoid protocol expansion. The initial work should continue through the canonical Chat and TTS paths. It should not add voice.*, MCP, or Windows node commands.
Architecture direction
Do not grow App.xaml.cs into the runtime owner. App should remain the composition root and forward startup, settings, connection, notification, and shutdown events to focused owners.
The future design should preserve these boundaries:
VoiceService: microphone capture, energy VAD, local Whisper lifecycle, silence-bounded utterances, and capture health.
Wake detector: continuous local acoustic keyword spotting, confidence policy, supported phrase identity, and activation events. A transcript implementation can remain available as an explicit fallback.
Wake runtime: wake activation handling, trigger-only command window, and selection of one-shot versus Talk Mode activation.
Talk runtime: the active conversation loop and explicit stop behavior.
Speaker: configured Windows, Piper, or ElevenLabs playback behind the existing abstraction.
Top-level controller: mutual exclusion and transitions between Off, Voice Wake, and Talk Mode. It should not duplicate capture, Chat, or TTS implementation.
While the transcript fallback remains supported, the current VoiceWakeGate boolean extraction result will likely need a richer result that distinguishes:
no wake match;
wake phrase only;
wake phrase with a trailing request.
The exact-run protections from #1071 are invariants, not implementation details to relax. Every Talk Mode turn must own one accepted gateway run, speak at most one matching final response, and cancel only that run.
Proposed delivery phases
Phase 1: prepare mode seams
Characterize the merged one-shot behavior before refactoring.
Separate wake activation, turn execution, and post-turn transition policy without changing the user-visible flow.
Keep App limited to composition and lifecycle forwarding.
Preserve settings compatibility, localization, accessibility, and current one-shot proof.
Phase 2: add model-backed wake detection
Define a wake-detector abstraction that receives local microphone audio and reports phrase identity plus confidence.
Select an engine that supports the required Windows architectures, offline inference, acceptable licensing, and bounded CPU and memory use.
Ship at least one supported model-backed default phrase.
Decide whether custom phrases use generated models, local enrollment, or an experimental transcript fallback.
Keep wake audio local and do not log raw audio or confidence traces that could expose user content.
Tune activation thresholds against positive speech, conversational negatives, media playback, room noise, accents, and varying microphone quality.
Make the detection threshold and debounce policy centralized and testable.
Demonstrate sustained listening without UI degradation, thermal instability, or excessive battery use.
This is the production-readiness boundary for always-on Voice Wake. Transcript-only matching may remain available before this phase, but it should continue to be described as preview behavior with known false-negative and false-positive limitations.
Phase 3: complete Voice Wake
Use the acoustic activation event to open a bounded command-capture window.
Continue supporting phrase and request in one utterance when the detector and buffered audio allow the command tail to be recovered safely.
Add clear states for waiting for wake, waiting for command, dispatching, waiting for reply, and speaking.
Return to passive wake listening after success, timeout, cancellation, or a recoverable failure.
Keep microphone ownership and capture-health diagnostics visible to native Chat.
Initial timing should follow the researched behavior unless Windows proof indicates otherwise:
approximately 2 seconds of silence to finish command speech;
approximately 5 seconds to begin a command after a trigger-only wake;
a bounded hard limit for command capture;
a short debounce before passive listening resumes.
These should be centralized runtime policy values rather than scattered UI constants.
Phase 4: manual Talk Mode
Add explicit Start Talk Mode and Stop Talk Mode actions.
Pin the selected native Chat session when Talk Mode starts.
Implement the sequential loop: listen, send, wait for the owned response, speak, resume listening.
Allow only one owned turn at a time.
Stop and release capture promptly from every state.
Recover to listening after nonfatal transcription, gateway, timeout, or TTS errors when safe.
Show the current Talk Mode state and pinned conversation.
This phase should not include barge-in.
Phase 5: wake into Talk Mode
Add a Trigger Talk Mode setting under Voice Wake.
Route a wake activation into the same Talk runtime used by manual activation.
If the wake utterance contains trailing request text, allow it to become the first Talk Mode turn.
Return to Voice Wake, rather than Off, when a wake-started Talk session ends.
Keep manual and wake-started Talk sessions behaviorally identical after activation.
Phase 6: interruption and polish
Add optional barge-in with explicit echo and false-trigger handling.
Allow a documented key or UI action to stop speech without ending Talk Mode.
Add audio feedback and accessible visual state for transitions.
Evaluate a Windows system-TTS fallback policy separately from configured-provider errors.
Measure and tune latency, ambient false activation, sustained CPU use, and model memory on supported Windows architectures.
Safety and privacy invariants
Voice features remain off by default.
Persistent microphone ownership is always visible and can always be stopped.
A production-ready Voice Wake path uses a local model-backed detector rather than depending on exact transcription spelling.
A no-data capture device fails within a bounded time, releases resources, and leaves the UI responsive.
Raw audio and ambient transcripts are not logged.
Voice Wake sends only command speech captured after activation or safely recovered from the wake utterance.
Talk Mode sends only finalized user turns while the mode is visibly active.
Disabling Voice Wake or stopping Talk Mode disposes subscriptions, cancels only owned work, and releases microphone capture.
An unrelated response in the same Chat session is never claimed, spoken, or cancelled.
TTS failure cannot strand the runtime in Speaking or prevent microphone release.
Session switching cannot silently move an active Talk Mode conversation to another session.
Validation expectations
Each phase should include:
focused policy and state-machine tests;
deterministic fake-audio tests for silence, trigger-only timeout, cancellation, and capture failure;
a versioned wake-word corpus with positive, near-match, conversational negative, media playback, accent, distance, and noise cases;
explicit false-reject and false-activation targets for each supported model-backed phrase;
gateway event-ordering and exact-run correlation regressions;
settings persistence, localization, accessibility, and lifecycle coverage;
current-head Windows proof of the user-visible flow;
CPU and responsiveness proof for sustained wake listening;
microphone release proof after Off, Stop, failure, disconnect, and app shutdown.
Non-goals
Cloud speech-to-text for passive wake listening.
A background Windows service that listens while the Tray app is not running.
New gateway, MCP, or Windows node voice commands.
New TTS providers or credential storage changes.
Barge-in in the first Talk Mode release.
A reliability guarantee for arbitrary free-form phrases without a generated model or user enrollment.
Exact implementation parity with Apple Speech or macOS-only MLX TTS.
Completion criteria
This proposal is complete when Windows supports:
one-shot Voice Wake with both same-utterance and trigger-then-command activation;
local model-backed wake detection with measured false-reject and false-activation behavior;
manual continuous Talk Mode;
optional wake into Talk Mode;
explicit stop and reliable recovery from every runtime state;
exact per-turn gateway-run ownership across both modes;
current-head Windows evidence that sustained listening is responsive, bounded, and releases the microphone correctly.
Summary
After #1097 is fixed and #1071 is merged, evolve the Windows Voice Assistant from its initial one-shot wake flow into two explicit experiences:
#1071 should remain the foundation. It already establishes the important Windows-specific building blocks: local Whisper transcription, energy VAD, transcript-based wake matching, exclusive microphone ownership, canonical native Chat routing, exact gateway-run response correlation, configured TTS playback, settings readiness, and lifecycle cleanup.
Its transcript gate should be treated as a prototype and fallback, not the final wake-detection architecture. Generic speech-to-text is not optimized to produce a stable spelling for short names or invented words. A phrase such as "Hey Claw" may be transcribed as "Hey Klaw," "Hey Klaue," or another phonetically similar form, causing an exact text gate to miss a valid activation.
Reliable always-on Voice Wake will probably require a dedicated acoustic wake-word model that detects the target sound pattern before command transcription.
This proposal separates future modes instead of incrementally adding every behavior to the one-shot coordinator.
Entry conditions
Longer-lived capture or continuous conversation should not ship before both conditions are met.
Background
#1071 intentionally implements one narrow flow:
It does not add a wake-word model, continuous conversation, barge-in, or a new gateway or node protocol.
Research against the macOS implementation in
openclaw/openclaw@030dbe9shows that OpenClaw treats Voice Wake and Talk Mode as separate experiences:listening -> thinking -> speaking -> listeningloop.Windows should follow that product separation while retaining its native speech stack. Windows uses local Whisper and energy VAD where macOS uses Apple Speech.
Why transcript matching is not sufficient
The macOS implementation uses deterministic transcript matching, but that does not establish that transcript matching will be reliable enough on Windows. The #1071 prototype exposes a predictable failure mode:
VoiceWakeGaterequires the configured phrase to match the opening transcript tokens.Adding aliases, edit distance, or phonetic matching could improve recall in the short term, but it also expands the false-activation surface and becomes difficult to reason about across accents and languages. These techniques are useful fallback experiments, not a substitute for acoustic keyword spotting.
A dedicated wake-word detector evaluates audio against a phrase-specific model and emits a confidence score without depending on the transcription spelling. This should improve recognition of names and invented words such as "Claw," but it is not automatic or universal. The model still needs representative positive and negative audio, noise and accent coverage, threshold tuning, packaging, and sustained CPU measurements.
There is also a product tradeoff with #1071's arbitrary one-to-three-word wake phrase setting. Most dedicated detectors support fixed model-backed phrases, generated phrase-specific models, or user enrollment. The first reliable release should therefore do one of the following:
Free-form custom phrases that continue using transcript matching should be labeled experimental and should not carry the same reliability claim as model-backed phrases.
Proposed user experience
Voice Wake should support both:
The Windows one-shot behavior should continue speaking its response. This preserves #1071 behavior even though the macOS one-shot forwarder does not itself own speech output.
Recommended product decisions
wake-one-shotcompatibility. Existing feat: add wake phrase voice assistant preview #1071 settings should continue to enable Voice Wake without migration or surprise behavior changes.voice.*, MCP, or Windows node commands.Architecture direction
Do not grow
App.xaml.csinto the runtime owner.Appshould remain the composition root and forward startup, settings, connection, notification, and shutdown events to focused owners.The future design should preserve these boundaries:
VoiceService: microphone capture, energy VAD, local Whisper lifecycle, silence-bounded utterances, and capture health.While the transcript fallback remains supported, the current
VoiceWakeGateboolean extraction result will likely need a richer result that distinguishes:The exact-run protections from #1071 are invariants, not implementation details to relax. Every Talk Mode turn must own one accepted gateway run, speak at most one matching final response, and cancel only that run.
Proposed delivery phases
Phase 1: prepare mode seams
Applimited to composition and lifecycle forwarding.Phase 2: add model-backed wake detection
This is the production-readiness boundary for always-on Voice Wake. Transcript-only matching may remain available before this phase, but it should continue to be described as preview behavior with known false-negative and false-positive limitations.
Phase 3: complete Voice Wake
Initial timing should follow the researched behavior unless Windows proof indicates otherwise:
These should be centralized runtime policy values rather than scattered UI constants.
Phase 4: manual Talk Mode
This phase should not include barge-in.
Phase 5: wake into Talk Mode
Phase 6: interruption and polish
Safety and privacy invariants
Validation expectations
Each phase should include:
Non-goals
Completion criteria
This proposal is complete when Windows supports: