- Raspberry Pi 5 (w/ active cooler)
- Freenove 5 inch touchscreen monitor
- Camera Module 3 Wide NoIR
- USB microphone
- Speaker
- Custom PCB for button control (using Raspberry Pi 5 GPIO)
- Raspberry Pi AI HAT+ 2 (Hailo-10H AI accelerator and 8GB of on‑board RAM)
Target: Raspberry Pi 5 with 8 GB RAM and Raspberry Pi OS 64-bit.
git clone --recurse-submodules <repository-url> bmo
cd bmo
./setup.shFor an existing checkout, just run ./setup.sh. It:
- Creates or reuses
.venv/using the systempython3. - Installs the Python dependencies in
requirements.txt. - Builds
third_party/whisper.cppfor the current machine. - Downloads the Whisper model and Piper voice selected in
config/agent.yamlif missing. - Installs Ollama if needed and downloads the model in
config/agent.yaml.
If Ollama is not running and no systemd service is available, start
ollama serve in another terminal and rerun setup.
Edit config/agent.yaml to select both the assistant and speech models. Both setup and the application read this file. After changing a model or voice, rerun ./setup.sh to download it, then restart BMO.
The ollama section controls the assistant model, prompt, and generation settings.
.venv/bin/python src/fsm.pyFocus the BMO window and press Space. Begin speaking within five seconds, then pause to finish your question. BMO stops after 900 ms of silence or at the 15-second limit. Silent input is skipped. BMO transcribes with Whisper, asks Ollama, generates speech with Piper, and returns to idle after playback. Escape, Q, or closing the window exits. Recording and inference run in workers so face animations remain responsive.
On the Pi, arecord and aplay use the default ALSA devices. To select a
microphone, find its card/device with arecord -l, then use, for example:
BMO_CAPTURE_DEVICE=plughw:2,0 .venv/bin/python src/fsm.pyReplace 2,0 with your microphone's actual card and device numbers.
BMO_PLAYER selects the playback executable; playback uses that player's
default output device.
Upstream documentation: Whisper, Piper, Ollama Linux setup.

