bcd48a3443a922eba26548365ed564168e2aa426
- playback.zig: sentence queue + playback thread — agent reply chunks are split on sentence boundaries and each sentence is synthesized+played as it completes, so voice starts after the first sentence, not after the reply - melo_server.py v2: WAV written to /dev/shm, raw s16le PCM + sample rate streamed over stdout (WAV n rate header + bytes), file deleted immediately; melo stdout chatter rerouted to stderr to keep the protocol clean - melo.zig: speakRaw returns in-memory PCM; pw-play fed via stdin pipe (no on-disk TTS files at all) - whisper: --language auto - fix: double-close of pw-play stdin panicked Threaded Io in debug - fix: quit-path frees for transcript cache, bubble lists, sentence queue, reply buffer (debug allocator leak panic) 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code <noreply@letta.com>
inferon
Voice interface daemon for Letta Code agents. Lives in your system tray; click to talk, click to send — your speech is transcribed, sent to an agent, and the reply is spoken back.
name: inference + infernal + inferon (a particle), with symbolic inference planned for later.
Pipeline
tray click → pw-record (16kHz mono WAV)
→ whisper.cpp server (spawned & owned by inferon, :50153)
→ letta CLI (agent conversation, multi-turn)
→ MeloTTS (melo_server.py subprocess, British English voice)
→ pw-play
All backends are subprocesses owned by inferon: they die when it dies (tray quit, SIGINT, SIGTERM — signal handlers included).
Requirements
- Zig 0.16
- Qt 6 (qt6-base) + GCC toolchain
- PipeWire (
pw-record,pw-play) - whisper.cpp built with
whisper-server(defaults expect~/Projects/whisper.cpp, large-v3-turbo q5_0) lettaCLI on PATH, logged in- Python 3.11 (via uv) for MeloTTS
Setup
./setup.sh # clones MeloTTS, builds venv, downloads checkpoint
zig build
zig-out/bin/inferon
Paths (whisper binary/model, MeloTTS root, agent ID) are constants at the top of src/whisper.zig, src/melo.zig, scripts/melo_server.py, and src/main.zig.
Usage
- Left-click: start / stop recording. After you stop, the pipeline runs: transcribe → agent → spoken reply → idle.
- Right-click → End conversation / Quit: menu.
- Tray dot color = state: grey idle · red recording · orange transcribing · blue thinking · green speaking · magenta backend error.
Temp audio lives in /tmp/inferon/ and is cleaned up as it's consumed (logs stay).
Description
A true voice assistant in my tray, backed by Letta Code, self-hosted
349 KiB
0 Stars
1 Watchers
0 Forks
Languages
Zig
90.2%
Python
7.2%
Shell
2.6%