Troly voice preview

The browser calls the LLM directly. The voice server only transcribes and synthesizes. Use headphones to prevent feedback.

Voice: Connecting… · LLM: Checking…

Audio compression and format

Choose each direction independently, then reconnect. Browser Opus uses WebCodecs. PCM16 is uncompressed. The service does not combine separate Opus packets.

Microphone → STT
TTS → speaker
Troly v2 protocol used by this page

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.