OpenTranscribe — Speaker Clustering & Naming

OpenTranscribe — Speaker Clustering & Naming A workflow diagram generated by Archify. 01 / Embedding (this server) 02 / Matching 03 / Clustering 04 / Human Review Automatic Human-in-the-loop Voiceprint · after any detector · Embedding (this server) › Automatic Voiceprint after any detector Match · cosine vs known profiles · Matching › Automatic Match cosine vs known profiles Auto-assign · above threshold · Matching › Automatic · unless blocked Auto-assign above threshold unless blocked Cluster · no match — group across files · Clustering › Automatic Cluster no match — group across files Profile · named, reusable SpeakerProfile · Clustering › Human-in-the-loop Profile named, reusable SpeakerProfile Review · merge / split / unassign · Human Review › Human-in-the-loop Review merge / split / unassign match found no match feeds future matches promote Legend Agent logic Context / trace External system

One voiceprint stage

  • • Native vectors from this server's engine, or services/voiceprint_extractor.py on the cpu queue after a vendor, pyannote.ai or a post stage
  • • Vendor voiceprints are never used; v0.8.0 swaps the extractor for a Rust one behind the same interface (#1231)

Removing a voice is one implementation

  • • services/speaker_cleanup.py: capture impact before the write, reconcile clusters, centroids and profile embeddings after the commit
  • • Unassign (detach_from_cluster): leaves the cluster and its profile, blacklisted by default; the cluster and profile stay for everyone else

Naming and corrections

  • • promote_cluster_to_profile creates the durable identity; merge_clusters / split_cluster fix grouping first
  • • Every assignment path skips a blacklisted speaker; only naming one speaker explicitly lifts its blacklist