Trim only the real click, and surface mid-clip dropouts

Transcripts came back short, but the log showed the whole clip going up:
captured samples matched wall clock and upload duration matched the
recording minus exactly the fixed 150 ms head trim. So nothing was being
cut in transit — the losses had to be at the edges or inside the audio,
and neither was visible.

Trim the stream-open click by measurement instead of by the clock: cut
only the leading frames that are genuinely louder than the rest of the
clip, up to the old cap. Mics that do not click now keep their first
syllable.

Measure each frame against its own mean so a steady DC bias — or a
stream frozen on one value — reads as the silence it is, and report the
longest run of digital silence as dead=. A live mic never goes below
DEAD_AIR_DBFS, so anything there is input that never arrived, which is
what following the system default source invites. Warn on startup when
no device is pinned, log the noise floor next to the speech level, and
log how much of the clip the output limiter had to clamp.

BLURT_SAVE_CAPTURES keeps the raw and uploaded WAVs per clip, so the
next short transcript can be checked against what the API actually got.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 20:45:14 -04:00
co-authored by Claude Opus 5
parent e3faf32f55
commit 9d04427816
3 changed files with 115 additions and 30 deletions
+13 -4
View File
@@ -50,10 +50,19 @@ Set from the tray menu, or via files / env vars:
Devices that refuse 16 kHz (raw ALSA and PipeWire's JACK endpoints do) are
captured at their native rate and resampled.
Every clip is conditioned before upload — the first 150 ms are dropped (mics
click when the stream opens), DC bias is filtered out, and the level is
normalised towards -20 dBFS. Near-silent clips are refused instead of being
sent, since transcription models answer silence with confident hallucinations.
Every clip is conditioned before upload — the stream-open click is trimmed off
the front (only as much of it as is actually there, up to 150 ms), DC bias is
filtered out, and the level is normalised towards -20 dBFS. Near-silent clips
are refused instead of being sent, since transcription models answer silence
with confident hallucinations.
Nothing else is cut: the whole recording is uploaded. If a transcript comes
back missing words, check `blurt.log` — each clip logs its length, speech level,
noise floor, and `dead=`, the longest run of digital silence inside it. A
non-zero `dead=` means the input dropped out mid-clip, which is what following
the system default source invites; pin a device instead. Set
`BLURT_SAVE_CAPTURES=1` (or to a directory) to keep the raw and uploaded WAVs
for every clip and hear exactly what the API got.
## Checking the microphone