User · Voice
JARVIS
The reference application that proves the engine: mic to VAD to STT to LLM to TTS to speaker, all in-process, pure C++, with the LLM on any backend. The engine is the app.
The pipeline
mic -> VAD -> STT (libwhisper) -> LLM (engine) -> TTS (piper) -> speaker
Every stage is in-process and pure C++, and the LLM stage runs on any engine backend: NPU, GPU, CPU.
JARVIS v2 (rebuild 2026-08-06)
v1 was a C++ port of a deleted Python package that carried the whole deleted product stack (auth, billing, usage, beacon, personas, RAG, an HTTP agent server). v2 gutted all of it:
- One process n/a in-process
BackendManager; the engine IS the app. - Pure C++ n/a only subprocesses are
arecord,aplay,piper. - Thin n/a
tools/jarvis/is 9 files, ~1300 lines.
Default stack: Zyphra
Without --model, JARVIS picks the first Zyphra model in the weights dir (preference: ZAYA1-8B to ZAYA1-74B to BlackMamba-2.8B to BlackMamba-1.5B to Zamba2 to ZR1-1.5B). --model <any> bypasses it.
Run it
$ cmake --build build --target jarvis_app # build/jarvis
$ ./build/1bit jarvis --model "Qwen3-0.6B" --text # text chat
$ ./build/1bit jarvis --model "Qwen3-0.6B" \
--whisper models/whisper-tiny.gguf \
--piper-model ~/piper/en_US-lessac-medium.onnx # voice
Status
| Stage | Status |
|---|---|
| VAD | energy-based, 20 ms frames |
| LLM | in-process, any backend, last-6-turns; default Zyphra |
| TTS | piper (fork/exec, 22050 Hz); codec voice = P2 |
| STT | GPU-accelerated; WHISPER_GPU=0 forces scalar |
| Barge-in | not yet; utterances during a reply are dropped (P1) |
STT is GPU-accelerated when a HIP device is present, scalar CPU fallback otherwise. Verify on hardware before you trust it.