Spoken replies use the browser's system voices; the optional server voice (Server voice model under Settings → Local models → Voice, e.g. kokoro) is fetched per sentence as a whole audio blob. Streaming the server voice (start playing before the sentence finishes synthesizing) would cut the pause before the first spoken word on long replies.
Constraints: the Speaker chain (web/src/lib/audio/speaker.ts) must keep its idle/stop semantics — conversation mode reopens the mic on idle, and Stop must cut audio immediately; the microphone must stay closed while audio plays (an open capture makes the OS duck the voice).
Done means: with a server voice configured, the first audible word of a multi-sentence reply arrives within ~1 s of the first sentence completing, Stop cuts it within 200 ms, and conversation mode still reopens the mic only after the last chunk ends.
Spoken replies use the browser's system voices; the optional server voice (
Server voice modelunder Settings → Local models → Voice, e.g.kokoro) is fetched per sentence as a whole audio blob. Streaming the server voice (start playing before the sentence finishes synthesizing) would cut the pause before the first spoken word on long replies.Constraints: the Speaker chain (web/src/lib/audio/speaker.ts) must keep its idle/stop semantics — conversation mode reopens the mic on idle, and Stop must cut audio immediately; the microphone must stay closed while audio plays (an open capture makes the OS duck the voice).
Done means: with a server voice configured, the first audible word of a multi-sentence reply arrives within ~1 s of the first sentence completing, Stop cuts it within 200 ms, and conversation mode still reopens the mic only after the last chunk ends.