Streaming first
Audio flows in continuously and text comes back as you speak — no record-then-upload round trip.
Kural — Tamil for voice — turns a raw microphone stream into understanding — voice activity detection, streaming speech recognition and a local language model, wired end to end over a single WebSocket.
Every stage is small, observable and swappable.
An AudioWorklet resamples the mic to 16 kHz PCM16 and streams it over WebSocket.
Silero VAD scores every 32 ms frame; the endpointer decides when speech starts and ends.
Streaming NeMo ASR emits partial text live, with Whisper.cpp for batch utterances.
A compact LLM served by llama.cpp turns the transcript into a concise, speakable reply.
Speech synthesis closes the loop for a fully spoken conversation.
Audio flows in continuously and text comes back as you speak — no record-then-upload round trip.
Native whisper.cpp, NeMo and llama.cpp servers on CPU. Your audio never has to leave the machine.
Hysteresis thresholds, minimum speech and silence windows keep turns crisp without clipping words.
Framer, VAD, endpointer, buffer, transcriber and reasoner are independent modules you can swap.
Clone the repo, start the servers, press the mic.
Get the code