craigm26 / craigm26/OpenCastor
Wake word: hands-free voice for a phone bolted to a car
- Dominant language
- Python
- Stars
- 28
- Forks
- 5
- PR merge metrics
- No merged PRs in 30d
Description
## Why
The phone is mounted on the vehicle; tapping the mic is the wrong gesture. Voice is already the fastest control surface (spoken "stop" fires off PARTIAL transcripts with no model in the loop — app build 38) but starting a command still needs a finger.
## What
- Always-listening wake phrase ("hey rover" / robot name) via the existing on-device SFSpeechRecognizer session, gated to the mounted context (phone role = On the robot, or drive screen open)
- Wake → the existing VoiceIntent pipeline (stop words keep their absolute priority and their partial-transcript latency — DO NOT route stop through the wake gate)
- Battery/thermal honesty: wake listening is a visible toggle with state, not an invisible drain
## Acceptance
- With the toggle on and the phone mounted: speak the wake word + "go forward" → lands in chat exactly as a typed message; speak "stop" mid-anything → same stop path and latency as today (pinned by existing VoiceIntent tests, which must not change)
- Voice chat and the Sensors tab's mic meter still coexist (the meter already stops off-tab)
## Pointers
- iOS VoiceSession (onStopHeard partial path), VoiceIntent (stop outranks everything — tested)
Contributor guide
Research direction
Start by reading the iOS VoiceSession partial-transcript stop path and VoiceIntent, including the existing tests that pin stop priority and latency. Trace how the Sensors tab mic meter is managed so wake listening can coexist with it. Done means a visible toggle gates mounted-context wake listening, wake plus a command reaches chat like typed input, and stop behavior and existing tests remain unchanged.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- audio-video-rtc, mobile-dev
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 55/100