a14c885e38f5365c9fe13ad1155f975c71e697d6
- Add AudioFocusManager: holds audio focus for entire conversation with 4-second grace period after TTS finishes - Default to MODE_PAUSE (AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) so stereo fully stops instead of just ducking - Wire into VoiceLoop: acquire on PTT, schedule release on TTS done, immediate release on wrap-up and destroy - Remove per-utterance focus from TTSManager (was causing stereo to bounce on/off between each exchange) - Add musicBehavior property to AppConfig (pause/duck/none)
ClippyAuto 📎🚗
Voice-first Android Auto app for talking to Clippy via Matrix.
Overview
ClippyAuto gives Jeremy a hands-free voice conversation with Clippy (AI Chief of Staff) during his commute. No typing, no "Hey Google," no Element — just tap and talk.
How it works: You talk → on-device STT → Matrix message to Clippy → Claude responds → FCM push → car speakers read it back. Target: under 5 seconds to first audio.
Prerequisites
- Android Studio Ladybug (2024.2+)
- JDK 17
- Android device with Android Auto support (or Desktop Head Unit for testing)
- Firebase project with FCM enabled
- Access to
mess.hobbs.farmMatrix homeserver
Setup
1. Clone & Open
git clone https://git.hobbs.farm/spirit/clippy-auto.git
cd clippy-auto
# Open in Android Studio
2. Firebase
- Create a Firebase project at https://console.firebase.google.com
- Add an Android app with package name
farm.hobbs.clippyauto - Download
google-services.json→ place inapp/ - Enable Cloud Messaging (v1 API)
3. Matrix Homeserver
mess.hobbs.farmmust be reachable externally (HTTPS via Traefik) ✅- Jeremy's account needs access to
#clippy-voice:hobbs.farmroom
4. n8n FCM Bridge
- Import
n8n/clippy-fcm-bridge.jsonworkflow into n8n - Register Matrix pusher on Jeremy's account pointing to n8n webhook
- Configure FCM server key in n8n credentials
5. Build & Run
./gradlew installDebug
Testing with Desktop Head Unit (DHU)
$ANDROID_HOME/extras/google/auto/desktop-head-unit
Project Structure
app/src/main/java/farm/hobbs/clippyauto/
├── ClippyAutoApp.kt # Application entry, DI
├── auto/
│ ├── ClippyCarAppService.kt # Android Auto entry point
│ ├── ClippySession.kt # Auto session lifecycle
│ └── ClippyScreen.kt # Auto UI (talk button + status)
├── voice/
│ ├── VoiceState.kt # State enum
│ ├── VoiceStateMachine.kt # State transitions
│ ├── SpeechManager.kt # STT (SpeechRecognizer)
│ └── TTSManager.kt # TTS with queue + audio focus
├── matrix/
│ └── MatrixRestClient.kt # Lightweight Matrix REST API client
├── push/
│ └── ClippyFCMService.kt # FCM receiver + dedup
├── connectivity/
│ ├── NetworkMonitor.kt # Online/Weak/Offline detection
│ └── MessageQueue.kt # Offline message queuing
└── ui/
└── SetupActivity.kt # Phone setup + session indicator
Architecture
See docs/ARCHITECTURE.md for the full spec.
Status
🚧 v1 MVP in progress
- Project scaffold
- Android Auto CarAppService + Screen
- Voice state machine
- STT manager (SpeechRecognizer)
- TTS manager (queue + audio focus + interruption)
- Matrix REST client (login, send, sync)
- FCM push receiver + dedup
- Network monitor + message queue
- Wire voice pipeline end-to-end
- Phone setup UI (login flow)
- n8n FCM bridge workflow
- Confirmation chime + thinking tone audio assets
- Session lifecycle signals
- Voice command recognition (go quiet, wrap up, etc.)
- Real-car testing
License
Private — hobbs.farm internal use.
Description
Languages
Kotlin
100%