← Journal
Tech·May 5, 2026

The Real Push-to-Talk

A hand holds a smartphone vertically, thumb pressed to the screen, in a blue-toned evening living room

A button you hold should keep the microphone open as long as you hold it. Ours didn't really do that: the problem wasn't in our code, but in a limitation we couldn't see until we hit it.

A button that promised more than it delivered

The principle of push-to-talk is simple: you press, you speak, you release, it's transmitted. Except that the on-device speech recognition in Android has its own timer, invisible from our code: after about a second and a half of silence, it considers you've finished speaking and cuts off listening, whether your finger is still on the button or not. A hesitation, a slightly long breath while searching for words, and the sentence was truncated without warning. Worse: to continue listening despite this cut-off, we had to restart the engine stealthily, which produced audible beeps and gaps in the transcription. The button said "I'm listening as long as you hold me," but in reality, it cut you off after a pause that was a little too natural.

A wall we can't move

We first tried to bypass this timer: disable it, extend it, hide it behind a more discreet restart. Nothing worked. It's a system-imposed limit, documented as such, and replicated identically on several recent Android phones. A push-to-talk worthy of the name must be able to last as long as the user decides, including pauses: a dictated reminder, a shopping list thought aloud, a thought that hesitates before being formulated. No setting allowed us to achieve this with that engine. We had to move on.

Capture, send, transcribe elsewhere

So we changed our approach at the root. Rather than recognizing speech directly on the phone, XNeuronal now records raw audio, in a compact format, for as long as the button is held, with no system-imposed duration limit. Upon release, this file is sent to the server, along with your identifier, to be transcribed by our cloud speech recognition. During recording, a "🎙 listening..." bubble remains displayed directly in the conversation thread; upon release, it becomes "transcribing..." during the network round trip, then transforms into your final message: a single visual cue from start to finish, where before the indication floated under the orb, separated from the thread.

This switch was also an opportunity to make the gesture stricter: as long as the button is held, no error alert disturbs listening, and releasing it unambiguously triggers sending, even if you removed your finger a moment too early or too late. It's this reliable, sustained gesture that remains at the heart of voice and conversation with XNeuronal. Sending a file rather than listening live also shifts the risk: the failure is no longer in the microphone, it can come from the network. Without a network, dictation simply cannot be transcribed. Behind the scenes, the voice module handles temporary connection drops: if the session breaks mid-way, it restarts it with increasing wait times, up to eight attempts, so that an isolated micro-cut doesn't turn into lost dictation.

What we gain, what we pay

The gain is clear: transcription no longer depends on an engine limited by a timer we don't control, and its fidelity is better, including for long, hesitant sentences, or those full of proper nouns that a generic on-device engine struggled to recognize. The price, we accept it: since the audio goes to a server, there's no instant feedback while you speak, no words displayed live, just the promise of an accurate transcription once the button is released, and a de facto dependence on the network for that transcription to arrive. We prefer this honesty to a button that seemed responsive on the surface but cut you off without saying so.

Read next
Voice-powered web searchOne Dock, Two Modes