All work · Open source
Zero
A local voice assistant with a wake word, speech, tool access and memory, running on your own machine.
Open source · Worldwide
The problem and context
The project explores a personal voice interface to a tool-using agent, with local wake-word detection, speech processing and persistent memory. It keeps the speech loop on the user’s machine while using a configured agent for reasoning.
Who uses it
- The developer running a personal assistant on macOS or Windows
- Developers studying voice, tool-permission and memory integration
What was built
- Wake word and speech-to-text on device
- Natural voice replies
- Windows and macOS
How it works
- Wake word activates listening; voice-activity detection decides when speech ends.
- Speech recognition transcribes the request and passes it to the agent.
- A tool gate allows, asks for confirmation or denies proposed actions according to their scope.
- The assistant streams speech replies and updates a local HUD; selected memories persist between sessions.
How the system fits together
- Python coordinates openWakeWord, Silero VAD, faster-whisper and Kokoro speech.
- Claude Agent SDK/Claude Code subscription access powers reasoning and tools.
- SQLite stores memory; local HTTP/WebSocket surfaces provide the HUD.
- Windows can use CUDA speech recognition; macOS uses its supported local CPU path.
Technology stack
Delivery and current status
- Open-source repository linked for inspection.
- Voice loop, text development mode, tool gating, memory and HUD are implemented.
- Platform setup and startup scripts are documented for Windows and macOS.
Evidence
- Local speech recognition and wake-word pipeline
- Agent tools and local memory
Scope and operating limits
- Local speech processing does not mean the reasoning model runs offline; agent calls need configured access/connectivity.
- The custom wake model is not shipped in the repository; fresh setups use the documented default model.
- Tool access requires deliberate permission boundaries; the assistant is not an unrestricted background operator.