Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
103f79f
Keep voice-mode work on canonical InferNode
Ticed Jul 6, 2026
4e8071c
Make voice mode provider-backed and interruptible
Ticed Jul 7, 2026
36150b0
Make speech audio remoting namespace-composable
Ticed Jul 7, 2026
d290ba0
Install real speech helpers and make voice mode echo-safe
Ticed Jul 10, 2026
a114638
Add an LLM-free speech test mode, headless and GUI tools/speech-test.…
Ticed Jul 11, 2026
9f7ed55
Release the microphone when voice mode is off
Ticed Jul 12, 2026
2f6ce32
Never let an API key bypass the login screen
Ticed Jul 13, 2026
5b3709d
Deliver STT finals and say why when speech breaks
Ticed Jul 13, 2026
d4992e6
feat(speech): complete voice-mode gap closure
Ticed Jul 13, 2026
12d3747
feat(speech): install Parakeet streaming by default
Ticed Jul 14, 2026
08a8f9a
feat(voice): add a cancellable utterance grace window
Ticed Jul 14, 2026
fa1ef49
fix(lucia): make the compose voice control toggle mode
Ticed Jul 14, 2026
f76c2a6
fix(speech): use a supported Kokoro output rate
Ticed Jul 14, 2026
9088865
fix(speech): harden Whisper fallback installation
Ticed Jul 14, 2026
8b5ac49
fix(voice): cap queued follow-up turns
Ticed Jul 14, 2026
9a18ded
docs(speech): define Phase 1 exit and Phase 2 scope
Ticed Jul 14, 2026
639147d
merge: integrate Phase 1 voice mode candidate
Ticed Jul 14, 2026
7502e43
test(speech): gate targeted regressions in CI
Ticed Jul 14, 2026
2e7cdb9
fix(ci): make speech regression temp paths portable
Ticed Jul 14, 2026
aa36a90
fix(ci): trust speech suite completion markers
Ticed Jul 15, 2026
c7f32c8
test(speech): add deterministic voice mode e2e
Ticed Jul 17, 2026
b94e8ec
merge(voice): sync Phase 1 candidate with canonical dev
Ticed Jul 22, 2026
c8eeba2
docs(speech): mark remote audio as development-only
Ticed Jul 22, 2026
6da8184
fix(voice): restore streaming and clarify pending turns
Ticed Jul 22, 2026
fefa19a
merge: sync dev with upstream/master
Ticed Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,9 @@ jobs:
exit 1
fi

- name: Run speech regression and E2E suite
run: bash tools/speech-regress.sh

- name: Run namespace audit checks
run: |
echo "Running nsaudit security checks..."
Expand Down
41 changes: 41 additions & 0 deletions QUICKSTART.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,47 @@ After building (see Building section below):

**Note:** The runtime `.dis` files in `dis/` are tracked in git, so basic commands work after clone. If you see `link typecheck` errors, run `./hooks/install.sh` and pull again, or rebuild manually with `mk install` in the affected `appl/` subdirectory.

## Voice Mode

Once Veltro's LLM API key is set up (keyring → factotum inside InferNode),
talking to Lucia takes one host-side install:

```sh
tools/install-speech-helpers.sh # from the repo root, on the host
```

then restart InferNode. The installer downloads/builds everything and writes
its configuration to `~/.local/share/infernode-speech/speech.ctl.sh`, which
`boot.sh` applies automatically — no manual ctl writes. The default stack is
the most lightweight high-quality option at each stage:

| Stage | Default | Notes |
|-------|---------|-------|
| TTS | **Kokoro** (`af_bella`, kokoro-onnx) | natural voice; the robotic macOS `say` is only a fallback when no helpers are installed |
| STT | **Parakeet** realtime EOU 120M (`tools/parakeet_stream.cpp` adapter, built against [parakeet.cpp](https://github.com/mudler/parakeet.cpp)) | streaming transcription; the model itself detects end-of-utterance. Falls back to whisper.cpp `base.en` when parakeet can't be built |
| Wake | openWakeWord | wake phrase is **"hey jarvis"** (the only pretrained model) |

### Using it

- **Enter/exit voice mode:** `Esc` `v`, Option/Alt+V (SDL), the **Voice chip**
in the context panel, the **voice button** on the chat input row, or
Ctrl+Space in the conversation view. All toggle the same thing:
`/mnt/ui/input-mode` between `k` and `v`.
- Say **"hey jarvis"**, speak, and pause. The transcript appears in the
compose box and on the Voice chip, then sends after a **3-second grace
window** — say **"cancel"** to discard it, or keep talking to extend it.
(`voicemode -g 0` restores instant send.)
- Low-confidence transcripts ask for a spoken yes/no first.
- `Esc` exits voice mode at any point and releases the microphone.

### Verifying without an LLM

`tools/speech-test.sh` exercises microphone → STT → TTS with no login, no
API key, and no per-turn cost (`-g` for the GUI variant). See
`docs/SPEECH-ARCHITECTURE.md` for the full architecture, remote-audio
topologies, and every ctl knob, and `docs/SPEECH-REMOTE-AUDIO.md` for
running the microphone and the speech engines on different machines.

## Building

### Linux x86_64 (Intel/AMD)
Expand Down
Loading
Loading