Skip to content

Name speakers from 1:1 participants and unique voiceprints - #7100

Merged
ComputelessComputer merged 5 commits into
mainfrom
cursor/auto-assign-one-on-one-speakers-b269
Aug 26, 2026
Merged

Name speakers from 1:1 participants and unique voiceprints#7100
ComputelessComputer merged 5 commits into
mainfrom
cursor/auto-assign-one-on-one-speakers-b269

Conversation

@ComputelessComputer

@ComputelessComputer ComputelessComputer commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

When a transcript has only you on the mic and one other participant, we should label their turns instead of leaving them as Speaker 1. In larger meetings, named voiceprints should identify people only when the match is unique and high-confidence.

The summary already inferred names (Marco (Speaker 1)), but the transcript did not:

  • Enhance attribution required two named non-owner participants and two speaker clusters, so a John + Marco meeting never ran.
  • The live participant list used for channel assignment also counted excluded people and calendar copies of the current user, so the “unique remote” path never fired.
  • Voiceprints were collected only if “Remember speakers” was turned on, and extracted embeddings were never matched against known people.

Changes

  • Assign the only other participant to the only unassigned remote/mixed speaker after enhance, without calling the LLM.
  • Ignore excluded participants and owner/self-email duplicates when collecting human IDs for transcript rendering, live capture, enhance candidates, and the speaker-hint write guard. Self-copy matching uses coalesced human.email / participant.email, so a calendar copy whose address lives only on the participant row still drops from the remote count.
  • Turn Remember speakers on by default for this update. An explicit off stays off — we do not overwrite a stored preference.
  • After candidate extraction, match new embeddings against this meeting’s participants only (same model and capture domain). Assign a speaker only when they uniquely match one person above a score floor and margin. Skip your mic channel, already-named speakers, and 1:1 meetings (those still use the participant list). Thin margins or two speakers wanting the same person stay unlabeled.
  • Score and write assignment against the extract-time words snapshot. If a hints-write conflict shows a newer diarization (words_json changed), abort instead of labeling the wrong clusters. Stored candidates are skipped when their speaker keys are missing from the current transcript.

Validation

  • pnpm -F desktop typecheck
  • pnpm -F desktop exec vitest run on speaker-attribution, content-queries, content-mutations, and stt/queries tests
  • pnpm exec oxlint --quiet --format=github on the changed desktop files
  • pnpm exec dprint check on the changed files
  • cargo test -p tauri-plugin-transcription could not run here (gdk-3.0.pc missing)
Open in Web Open in Cursor 

When the participant list is just you plus one other person, label their remote/speaker turns instead of leaving them as Speaker 1. Do not guess when more people or speakers are present.

Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
@netlify

netlify Bot commented Aug 26, 2026

Copy link
Copy Markdown

Deploy Preview for anarlog canceled.

Name Link
🔨 Latest commit 41accbe
🔍 Latest deploy log https://app.netlify.com/projects/anarlog/deploys/6a8e4e4686a3730008adb756

Remember speakers is now on for anyone who has not opted out. After extracting embeddings, uniquely matching voices among this meeting's participants are assigned automatically. 1:1 meetings still use the participant list, and thin or colliding matches stay unlabeled.

Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
@cursor cursor Bot changed the title Auto-assign the other speaker in 1:1 meetings Name speakers from 1:1 participants and unique voiceprints Aug 26, 2026
The persist loop was consuming the vectors, so assignment could not borrow them afterward.

Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
@ComputelessComputer
ComputelessComputer marked this pull request as ready for review August 26, 2026 01:39
Comment thread apps/desktop/src/services/enhancer/speaker-attribution.ts
Comment thread plugins/transcription/src/voiceprint.rs
Enhance now drops owner-email duplicates so a John + Marco meeting still has one remote candidate. Voiceprint assignment also retries from stored embeddings when extract has already run or the hints write races.

Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 000e717. Configure here.

Comment thread plugins/transcription/src/voiceprint.rs Outdated
Comment thread apps/desktop/src/session/content-mutations.ts
Keep assignment on the transcript snapshot used for extraction, abort if words change under a hints-write conflict, and skip stored candidates whose speaker keys no longer exist. Treat participant-row email as equivalent to human email when dropping calendar self-copies.

Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
@ComputelessComputer
ComputelessComputer merged commit 760f9e4 into main Aug 26, 2026
24 checks passed
@ComputelessComputer
ComputelessComputer deleted the cursor/auto-assign-one-on-one-speakers-b269 branch August 27, 2026 06:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants