assistant

January 30, 2026 · View on GitHub

A hands-free voice assistant that activates on a wake word.

Usage

agent-cli assistant [OPTIONS]

Description

This agent continuously listens for a wake word (e.g., "Hey Nabu"):

  1. Run the command—it starts listening for the wake word
  2. Say the wake word to start recording
  3. Speak your command or question
  4. Say the wake word again to stop recording
  5. The agent transcribes, sends to the LLM, and speaks the response
  6. Immediately returns to listening for the wake word

Examples

# Start with default wake word
agent-cli assistant --input-device-index 1

# With custom wake word
agent-cli assistant --wake-word "hey_jarvis" --input-device-index 1

# With TTS responses
agent-cli assistant --tts --input-device-index 1

# Custom wake word server
agent-cli assistant --wake-server-ip 192.168.1.100 --wake-server-port 10400

Options

Provider Selection

OptionDefaultDescription
--asr-providerwyomingThe ASR provider to use ('wyoming', 'openai', 'gemini').
--llm-providerollamaThe LLM provider to use ('ollama', 'openai', 'gemini').
--tts-providerwyomingThe TTS provider to use ('wyoming', 'openai', 'kokoro', 'gemini').

Wake Word

OptionDefaultDescription
--wake-server-iplocalhostWyoming wake word server IP (requires wyoming-openwakeword or similar).
--wake-server-port10400Wyoming wake word server port.
--wake-wordok_nabuWake word to detect. Common options: ok_nabu, hey_jarvis, alexa. Must match a model loaded in your wake word server.

Audio Input

OptionDefaultDescription
--input-device-index-Audio input device index (see --list-devices). Uses system default if omitted.
--input-device-name-Select input device by name substring (e.g., MacBook or USB).
--list-devicesfalseList available audio devices with their indices and exit.

Audio Input: Wyoming

OptionDefaultDescription
--asr-wyoming-iplocalhostWyoming ASR server IP address.
--asr-wyoming-port10300Wyoming ASR server port.

Audio Input: OpenAI-compatible

OptionDefaultDescription
--asr-openai-modelwhisper-1The OpenAI model to use for ASR (transcription).

Audio Input: Gemini

OptionDefaultDescription
--asr-gemini-modelgemini-3-flash-previewThe Gemini model to use for ASR (transcription).

LLM: Ollama

OptionDefaultDescription
--llm-ollama-modelgemma3:4bThe Ollama model to use. Default is gemma3:4b.
--llm-ollama-hosthttp://localhost:11434The Ollama server host. Default is http://localhost:11434.

LLM: OpenAI-compatible

OptionDefaultDescription
--llm-openai-modelgpt-5-miniThe OpenAI model to use for LLM tasks.
--openai-api-key-Your OpenAI API key. Can also be set with the OPENAI_API_KEY environment variable.
--openai-base-url-Custom base URL for OpenAI-compatible API (e.g., for llama-server: http://localhost:8080/v1).

LLM: Gemini

OptionDefaultDescription
--llm-gemini-modelgemini-3-flash-previewThe Gemini model to use for LLM tasks.
--gemini-api-key-Your Gemini API key. Can also be set with the GEMINI_API_KEY environment variable.

Audio Output

OptionDefaultDescription
--tts/--no-ttsfalseEnable text-to-speech for responses.
--output-device-index-Audio output device index (see --list-devices for available devices).
--output-device-name-Partial match on device name (e.g., 'speakers', 'headphones').
--tts-speed1.0Speech speed multiplier (1.0 = normal, 2.0 = twice as fast, 0.5 = half speed).

Audio Output: Wyoming

OptionDefaultDescription
--tts-wyoming-iplocalhostWyoming TTS server IP address.
--tts-wyoming-port10200Wyoming TTS server port.
--tts-wyoming-voice-Voice name to use for Wyoming TTS (e.g., 'en_US-lessac-medium').
--tts-wyoming-language-Language for Wyoming TTS (e.g., 'en_US').
--tts-wyoming-speaker-Speaker name for Wyoming TTS voice.

Audio Output: OpenAI-compatible

OptionDefaultDescription
--tts-openai-modeltts-1The OpenAI model to use for TTS.
--tts-openai-voicealloyVoice for OpenAI TTS (alloy, echo, fable, onyx, nova, shimmer).
--tts-openai-base-url-Custom base URL for OpenAI-compatible TTS API (e.g., http://localhost:8000/v1 for a proxy).

Audio Output: Kokoro

OptionDefaultDescription
--tts-kokoro-modelkokoroThe Kokoro model to use for TTS.
--tts-kokoro-voiceaf_skyThe voice to use for Kokoro TTS.
--tts-kokoro-hosthttp://localhost:8880/v1The base URL for the Kokoro API.

Audio Output: Gemini

OptionDefaultDescription
--tts-gemini-modelgemini-2.5-flash-preview-ttsThe Gemini model to use for TTS.
--tts-gemini-voiceKoreThe voice to use for Gemini TTS (e.g., 'Kore', 'Puck', 'Charon', 'Fenrir').

Process Management

OptionDefaultDescription
--stopfalseStop any running instance of this command.
--statusfalseCheck if an instance is currently running.
--togglefalseStart if not running, stop if running. Ideal for hotkey binding.

General Options

OptionDefaultDescription
--save-file-Save audio to WAV file instead of playing through speakers.
--clipboard/--no-clipboardtrueCopy result to clipboard.
--log-levelwarningSet logging level.
--log-file-Path to a file to write logs to.
--quiet, -qfalseSuppress console output from rich.
--config-Path to a TOML configuration file.
--print-argsfalsePrint the command line arguments, including variables taken from the configuration file.

Available Wake Words

Available wake words depend on which models you preload. The provided scripts preload ok_nabu by default.

Common models include:

  • ok_nabu (default in provided scripts)
  • hey_jarvis
  • alexa

Add more models via --preload-model when starting OpenWakeWord. Custom wake words can be trained and added to the OpenWakeWord server.

Interaction Flow

┌─────────────────────────────────────────┐
│         Listening for wake word         │
│              "ok_nabu"                  │
└───────────────────┬─────────────────────┘
                    │ Wake word detected

┌─────────────────────────────────────────┐
│            Recording speech             │
│         (speak your question)           │
└───────────────────┬─────────────────────┘
                    │ Wake word again

┌─────────────────────────────────────────┐
│     Transcribe → LLM → TTS (if enabled) │
└───────────────────┬─────────────────────┘


              Back to listening

Tips

  • Speak clearly after the wake word is detected
  • Wait for the TTS response to finish before saying the wake word again
  • Use --tts for a more natural conversation experience