Skip to content

Endpointing: how does the auto-submit factor in pFinishedSpeaking? (server eval shows submits decorrelated from the score) #519

Description

@rosscado

Context

On the API side we've stood up a server-side endpointing eval to measure and improve pFinishedSpeaking (the float the finishedSpeaking decorator returns on each /transcribe response). The missing piece was a non-circular ground-truth label for "did the user actually finish their turn?", which the extension now provides via the turn-outcome emitter shipped in #505 (POST /turn-outcome, carrying user_resumed, last_sequence_number, submitted_at, last_speech_ended_at).

We now have the first real data — 40 auto-submitted turns from live sessions — and before we invest in recalibrating pFinishedSpeaking, we need to understand how (or whether) the extension actually consumes that score when deciding to submit a turn. The eval is only meaningful if model improvements would change endpointing behavior.

What the data shows

Two findings that we can't interpret without knowing the client's submit logic:

1. Submits are decorrelated from pFinishedSpeaking. 48% of the utterances that drove an auto-submit had pFinishedSpeaking ≤ 0.40 — i.e. the model was actively signalling "not finished." If the submit were gated on a p ≥ threshold test, almost every submit would sit at p ≥ 0.8. Instead they're spread across the whole range. Several are clearly mid-sentence fragments the model correctly scored ~0.2 ("of", "start this", "So one of the…"), yet they were submitted and the user then resumed speaking.

2. The submit delay doesn't look score-modulated. We measured the endpointing wait as submitted_at − last_speech_ended_at per turn:

submit-driving p n mean wait median wait
low (≤0.4) 18 1.65s 1.35s
high (≥0.8) 22 1.95s 1.15s

Pearson r(p, wait) = +0.11 — essentially uncorrelated (slightly positive). The working hypothesis on our side was that the extension waits something like max_delay * (1 - pFinishedSpeaking), which would predict a strong negative correlation (low p → long wait). The data doesn't show that; the wait is ~flat regardless of the score.

Questions

  1. What actually triggers the auto-submit of a transcribed turn — a Silero-VAD silence timeout, a pFinishedSpeaking threshold, or some combination? If a combination, how are they weighted?
  2. Does pFinishedSpeaking factor into the submit decision or its timing at all today? If so, what's the formula (is our max_delay * (1 - p) guess close)? If not, is it currently informational only?
  3. For the turn-outcome signal's last_sequence_number — is it the utterance whose pFinishedSpeaking drove the submit decision, or just the last /transcribe response received in the turn? These can differ: if a low-confidence trailing fragment arrives right around submit time, last_sequence_number may point at it rather than at the utterance the decision was actually based on — which would explain both findings above, and would mean our eval is joining the wrong score to each turn.

The answer determines whether the right next step is model work (recalibrate pFinishedSpeaking), client work (adjust the submit policy), or a fix to which sequence number the turn-outcome reports. Not urgent — we just don't want to optimize a signal the product isn't listening to. Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    VADVoice Activity DetectionquestionFurther information is requested

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions