A fully local voice assistant running entirely on the robot — no cloud, no internet required. Wake it, command it, hear it respond — all in Italian.
The custom wakeword model (trained on Google Colab via OpenWakeWord) listens 24/7 on the ReSpeaker 2-Mic HAT. Stereo GCC-PHAT estimates the direction of arrival and can orient the robot toward the speaker (±20° deadzone).
OpenWakeWord ONNX model (hey_no_va.onnx) runs on CPU via ONNX Runtime. 32ms chunks, 16kHz mono. Threshold 0.7, 3s cooldown to prevent re-triggering. Buffer cleared immediately after detection.
Raw PCM16 audio streamed via WebSocket to external server at 100.120.32.86:5000. Pure binary — no headers, no timestamps, no framing metadata. Float32 → int16 LE conversion.
faster-whisper (int8 quantized, CPU) transcribes the audio to text. Optimized for Italian. Runs on the external PC to offload the Pi.
faster-whisper · int8Transcribed text sent to Ollama running on the external PC. Model selection flexible — Llama, Mistral, Gemma etc. Response streamed back to Pi.
Ollama · local LLMResponse synthesized by Piper TTS with the "Miro" Italian voice (~/AIsburra/piper_voci_italiano/Miro/). Audio played via ReSpeaker output (plughw:CARD=seeed2micvoicec,DEV=0).
Nova has a Pygame-based face display with 12+ emotional sequences. When the wakeword fires, it switches to SEQ_WAKEWORD (124): a two-phase animation with animated microphone, pulsing sound arcs, and blinking "In ascolto…" text.
Task completed successfully
SEQ_WAKEWORD — pulsing arcs
Processing command or obstacle
Cliff / obstacle / emergency stop