Speakers¶
Rex tells the people on a call apart (diarization) and, once you have named someone, recognises their voice in later meetings. Names are yours to give; Rex only remembers them.
How a voice gets a name¶
Every voice on the system track gets a voiceprint: a compact summary of how it sounds in
that meeting, stored in transcript.json. After each transcription Rex compares the meeting's
voices with the speakers you have named before:
- With an invite list (Teams attendance), only the invitees count as candidates. A voice that matches an invitee's voiceprint above the auto threshold is named without asking.
- Without one, matches are suggestions only and wait for you in the Review queue.
- Two-person meetings: when the invite list is just you and one other person and there is exactly one other voice, that voice is enrolled as the invitee, marked named automatically.
- A voice split in two by diarization is merged when both halves match the same speaker.
Rex never renames a speaker you named yourself, and a voice match never changes a voiceprint on its own: only names you give or confirm add to a speaker's voice samples.
Transcripts show first names. When two first names collide in a meeting, Rex adds a last initial,
and the full name when even that is ambiguous. meeting.json keeps the full name and email.
Naming a speaker in a transcript¶
Click a speaker chip above the transcript. The picker offers, in order: voice-match suggestions with their confidence, invitees not yet assigned, "Same as …" for another voice in the meeting that is really the same person, every other known speaker, and a new speaker by name and email. Add the email when you can: it is how invite lists match people.
The Speakers window¶
⇧⌘S, the menu-bar item, or the people icon in the toolbar.
Speakers lists everyone Rex knows: meetings, voice samples, when last heard, and a badge when a name came from the two-person rule. The email shows on hover. Right-click to rename (every meeting updates), merge into another speaker, forget the voice (keeps the name), or delete.
Review is the backlog: unnamed voices, voices named automatically, and weak matches, newest first. Each card plays that voice's longest moments, shows what was said, and offers the same candidates as the picker. Looks right confirms an automatic name and adds the voice to that speaker's voiceprint; Skip hides a card for this session.
Import / Export move every speaker, voiceprint and assignment as one JSON file — the way to carry them to a new Mac.
Privacy¶
Voiceprints are biometric data. They live in ~/Library/Application Support/Rex/speakers.sqlite
and in each meeting's transcript.json, never in transcript.md or any export (the JSON export
strips them). Turn recognition off in Settings › Speakers; existing records stay until you forget
or delete them. Lose the database and rex speakers rebuild recovers every speaker who appears in
a meeting folder.
Settings¶
| Setting | Config key | What it does |
|---|---|---|
| Your email | speakers.youEmail |
Keeps you out of the invite-list candidates |
| Recognise speakers | speakers.voiceMatching |
Master switch (on by default) |
| Name automatically above | speakers.autoAssignThreshold |
Similarity for an unasked name, invite list required (0.80) |
| Suggest above | speakers.reviewThreshold |
Weaker matches become Review suggestions (0.65) |
| Minimum speech to enrol | speakers.minEnrollSec |
Two-person rule needs this much speech (30 s) |
Command line¶
rex speakers mirrors the window: list, show <who>, assign <folder> S2 --name "…" [--email …]
or --speaker <who>, unassign, merge <a> <b>, rename, forget, delete, rebuild,
export <file>, import <file>. <who> is an id, an email, or an exact name.
rex speakers eval (or scripts/speaker-eval.sh) scores the matching against the speakers you
have already named, leave-one-meeting-out, and prints precision and recall per threshold — run it
after naming a few people who recur, and use it to choose the thresholds above.