She stops listening the instant you pause for breath #94
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#94
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?
She stops listening the instant you pause for breath.
Reported 2026-08-17, on the first real use of 呼びかけ受信 (
#90): the wake phrase works, and then the sentence after it gets cut off partway through.Why
Detector::observe(src-tauri/src/audio/engine.rs) ends an utterance on the first frame whose probability falls below the negative threshold:A silero frame is 512 samples, which at 16 kHz is 32 ms. So a single 32 ms dip closes the utterance and transmits whatever had accumulated. Thirty-two milliseconds is shorter than the gap between two ordinary words, shorter than an unvoiced stop, and far shorter than someone drawing breath mid-sentence. The detector is not mistuned; it has no hangover at all.
The knob for this already exists and does nothing
VADSettings.redemptionFramesis still in the settings screen, still stored, still defaulting to 35 — and inert since capture moved to Rust.vad-context.tsx:48says so outright:That comment was written to stop somebody losing an afternoon to it. This issue is that afternoon arriving: the control the operator would reach for is exactly the right one, and it is disconnected.
What to do
Require N consecutive sub-threshold frames before emitting
Edge::End, and reset the counter on any frame back above the threshold. That is the redemption the JS VAD had, in the place the detector now lives.Wire
redemptionFramesthroughmic_startalongside the two thresholds andwake_threshold(#90just did this for the wake threshold and is the pattern to copy). The stored default of 35 frames is 1.12 s of silence before she decides you have finished, which is a reasonable starting point precisely because it is the number the setting has claimed all along.Two things to get right:
MAX_UTTERANCE_SAMPLESstill applies. A longer hangover makes a stuck-open detector likelier, and the 60 s ceiling is what stops that growing the buffer until the process dies.Related
#90— the settings plumbing pattern, and where a live control belongs#89— the gate, which is downstream of this and unaffected: it decides whether to send an utterance, not where the utterance ends#43— speech start and end meaning the same thing in both modes