Most voice UIs punish the way people actually talk. They cut you off at a breath. Or they keep talking after you have already started the next sentence.

Loud Enough does the opposite on purpose. Talk over a reply and playback stops. You do not wait for it to finish its sentence. Pause while you find the words and your turn does not end. Silence is held open.

That is AssemblyAI turn-taking on one WebSocket, plus the Web Audio work to stop what is already playing. I wrote the rest of the pipeline in the product log. This is the listening rule.

Two products, two meanings of stop

On the Flutter visit app, stop had to mean stop. A doctor visit needs a file with an edge. If the recording never ends, the transcript never starts, and the LLM never sees a visit.

Loud Enough is not trying to save a visit. It is trying to stay in a conversation long enough to name a problem and a request. Ending the turn on a pause would throw away the useful half of “I told them three times, and now there’s mold, and they just —”. The dash is where the product lives.

It still has to become a message

Interruptible audio is not the output. The output is a draft from verified fields. If listening is a form, people go quiet. If listening never becomes a checked message, you have a nice conversation and nothing to send.

The demo on the site plays the leak situation out loud without needing your microphone. The transcript and the message are produced live from that audio, including the gap. That is the shape I wanted: you can cut in, it will wait, and it still will not invent the date.