feat: speaker diarization via pyannote.audio (cf_voice.context) #8
Labels
No labels
a11y
backlog
blocked
bug
cf-core-dep
design
enhancement
infrastructure
internal
privacy
tier:free
tier:paid
ux
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Circuit-Forge/linnet#8
Loading…
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?
Enable multi-speaker attribution so annotations are labeled per speaker, not per utterance.
Requirements:
Gotcha: pyannote/speaker-diarization-3.1 requires HuggingFace license acceptance before download. Must be done manually on Heimdall. Document in CLAUDE.md and deploy runbook.
Tier gate: local diarization = Free (slower). Cloud-assisted diarization = Paid (higher accuracy, lower latency).
Code exists:
cf_voice.diarize.Diarizerwrapspyannote/speaker-diarization-3.1with async thread pool. Gated byCF_VOICE_DIARIZE=1+HF_TOKEN. Lazy-loaded in_classify_real_asyncalongside tone + STT.Not yet confirmed working end-to-end (model acceptance on HuggingFace required, 2s windows may be too short for reliable diarization). Keeping open until tested in a real session.
Implementation complete (cf-voice side)
cf-voice#1 implemented and closed:
SpeakerTracker— maps pyannote IDs (SPEAKER_00) to stable per-session friendly labels (Speaker A,Speaker B, ...). Resets on session stop. No biometric data stored.speaker_at()updated: single speaker → friendly label, 2+ covering same timestamp →"Multiple", silence →"speaker_a"ContextClassifiernow holds a per-sessionSpeakerTracker, passes it intospeaker_at()on every window, resets onstop()cf_voice/tests/test_diarize.py, all passingRemaining before closing this issue
Manual step required on Heimdall: HuggingFace gated model acceptance. Must be done by hand at:
Then set
CF_VOICE_DIARIZE=1+HF_TOKEN=<token>in the linnet.envand run a live session to confirm end-to-end attribution.Once the live test passes, close this issue.