Every connection receives the full event stream (vad_start, vad_end,
transcript, error) from the moment it connects — no subscription
handshake required. The asyncio WebSocket server runs in a daemon thread
alongside the VAD loop and transcription thread. Events still go to
stdout unchanged.
Port is configurable via STT_PORT env var (default: 11501).
Add websockets to both setup scripts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the old stdin/stdout transcription-only server. Now handles the
full pipeline in Python:
- Launches parec or arecord for mic capture
- Runs Silero VAD (via silero-vad, already a faster-whisper dep — no sherpa-onnx needed)
- Pre-roll ring buffer (0.2s) prepended to each segment for context
- Transcribes with faster-whisper in a separate thread (GPU not blocking VAD)
- Emits JSON line events to stdout: ready, vad_start, vad_end, transcript, error
Event protocol is designed to map directly to WebSocket subscriptions later.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>