Press-to-talk transmits nothing on a short press #33
Labels
No labels
needs-info
needs-triage
ready-for-agent
ready-for-human
v2
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
wayfinder:ticket
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
aiko/denpa#33
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Press-to-talk in the mobile dock cycles its states correctly and transmits nothing. The control looks right, the tests pass, and the feature does not work.
#12built the dock's PTT key to drive the mic throughVADContext—startMic()on pointerdown,stopMic()on pointerup. But the only path that actually sends audio upstream is VAD's ownonSpeechEnd, andstopMic()destroys the VAD instance without flushing (src/renderer/src/context/vad-context.tsx:322).So a release before VAD detects speech-end sends nothing at all. A short utterance, or any press where VAD does not fire in time, is silently discarded.
This was found and reported by the agent that implemented
#12, not by a user hitting it — it is in.denpa-work/QUESTIONS.md. It was correctly judged out of scope for a chrome issue: fixing it needs a recorder in the mic layer, not in the chrome.What is needed
A capture path that does not depend on VAD's speech-end firing. On release, whatever was recorded during the press should go up as
denpa.voiceregardless of VAD's opinion — press-to-talk is an explicit human signal and should not be second-guessed by a voice-activity heuristic.Acceptance
Notes
Reads as done on the board today, which is the real hazard here.
Superseded approach, by human decision on 2026-07-30.
Do not fix this by adding a recorder beside the existing JS VAD. All microphone capture and voice-activity detection are moving out of the webview into Rust — see aiko/denpa#35.
The root cause named here is the same either way: press-to-talk transmits nothing because VAD owns the mic and \stopMic()\ destroys the instance without flushing. That fix now arrives as part of the Rust capture path, where a release can flush what it recorded.
Leaving this issue open as the bug of record; #35 carries the implementation.
Fixed and verified. Closing.
A press now transmits what it captured whether or not the detector ever fired, because the press owns its own buffer in Rust and the release flushes it:
src-tauri/src/audio/desktop.rs—Signal::PressStartseeds a buffer from the pre-roll,Signal::PressReleaseemits it asspeech-endwithfrom_press: true, and the detector abandons its own utterance on release rather than emitting the same audio a second time.use-receiver-chrome.tschains press and release on one promise, so a tap released before the microphone finishes opening cannot leave a press that never ends.Observed in a real conversation on 2026-07-30:
Landed on branch
issue/denpa-35-mic-capture-into-rust, commits0da3018andbffad16. Not merged.Note the mechanism is platform-independent — the press buffer and the release flush live in the shared worker, not in the desktop capture backend — so Android inherits the behaviour when its capture path lands under
#35, rather than needing this fixed again.