speaker-attribution: gate flywheel on per-segment acoustic overlap
Adds a pyannote-based speech-conditioned overlap fraction to the transcribe
pipeline and uses it to guard the voiceprint flywheel. Per-segment attribution
is unchanged; only long-term identity accumulation (accumulate_voiceprints
and the owner HDBSCAN bootstrap) skips segments with overlap > 0.10.
- Vendor pyannote-segmentation-3.0 ONNX (5.7 MB) under
observe/transcribe/assets/; Makefile .installed verifies its SHA-256.
- observe/transcribe/overlap.py runs sliding-window inference (10 s window,
5 s stride) and computes count(argmax in {4,5,6}) / count(argmax >= 1)
with explicit 0.0 for silent segments.
- process_audio writes overlap_fraction (4dp) and overlap_detector into the
chronicle JSONL header alongside the existing noisy_* fields.
- apps/speakers/_overlap.py reads the header (missing/invalid → 0.0 for
pre-overlap back-compat).
- accumulate_voiceprints short-circuits when overlap > 0.10; owner bootstrap
excludes those sources before subsampling and HDBSCAN.
- encoder_config.py is the canonical home for NOISY_FLYWHEEL_OVERLAP_MAX,
OVERLAP_DETECTOR_ID, and OVERLAP_DETECTOR_SHA256; transcribe and tests
import rather than duplicate the literals.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This is a binary file and will not be displayed.