The browser calls the LLM directly. The voice server only transcribes and synthesizes. Use headphones to prevent feedback.
Voice: Connecting… · LLM: Checking…
Choose each direction independently, then reconnect. Browser Opus uses WebCodecs. PCM16 is uncompressed. The service does not combine separate Opus packets.
One WebSocket carries JSON controls and binary audio. The page sends this exact handshake, then starts independent speech operations:
Waiting for ready…
STT: stt.start → stt.ready → binary packets → stt.finish → stt.final and request.end. TTS: tts.start → tts.ready → numbered tts.text chunks → tts.finish → audio packets and request.end. STT does not call the model. The browser calls https://llm.dlkn.dev/v1/chat/completions itself.
Each binary WebSocket message is an 8-byte network-order header (uint32 stream_id, uint32 sequence) followed by one raw Opus or little-endian PCM16 packet. Opus has no Ogg/WebM wrapper. Request and turn IDs are on JSON controls. A cancelled stream’s late packets are discarded.