Name anonymous diarized SRT speakers from a persistent local voiceprint library and repair speaker drift; local, CPU-only, no API key. Triggers "who is speaker 2", "put names on the transcript", "label the meeting SRT", "the diarization split one person into three", "enroll my voice". Backed by the pi-voiceid CLI.
SkillScore95Maintained
Automatic
◆AI Engineer pack
Last verified 10/6/2026
What it changes
Passed 20 of 21 test cases with the skill, and 4 of 21 without it.
Model gemini-3.6-flashMeasured 10/6/2026v121 of 22 cases passed with skill · 21 comparable
Tokens, turns and time describe resource use, not a dollar price.
See it in action
One of 16 test cases the skill fixed. Same model, same prompt, with and without the skill.
1 of 16
Prompt
In the dry-run decision table when relabeling transcripts, what does a small gap in the `2nd` / `margin` column indicate about a potential speaker match?
What was checked, without and with the skill
Checked
Without skill
With skill
Explains that a small runner-up margin indicates ambiguity.
Passed
Passed
States that healthy cross-recording matches typically exhibit a margin greater than 0.5.
Missed
Passed
case-19 · gemini-3.6-flash · 10/6/2026 · answers are capped and redacted
What's inside
The instructions your model reads when the skill loads.
SKILL.md160 linessingle file
Speaker ID enrollment
Give diarized transcripts real names, and repair the drift that clustering
diarizers produce on long recordings. Post-hoc relabeling — it does not
create diarization, it relabels an existing one.
The source SRT is never overwritten. Everything runs locally on CPU via
sherpa-onnx; no audio or embedding leaves the machine.
How it works
Each anonymous cluster is profiled with a speaker-embedding model, sampling
segments across the whole timeline (drift is temporal).
Cluster centroids are centered (a multi-speaker mean subtracted) and compared
by cosine to the enrolled voiceprints.
A cluster is named only when the absolute threshold, the margin over the
runner-up, and a minimum share of agreeing segments all pass. Otherwise the
anonymous label is kept — never guessed.
Several clusters may map to one name: that is the drift repair.
Setup (one time)
The embedding model is not vendored. On first enroll/label it is fetched
into ~/.pi/models/speaker/ (28 MB). Model choice is the single biggest
accuracy factor — see BENCHMARK.md. Do not "upgrade" to a
bigger model without re-running the benchmark: the 114 MB VoxCeleb leader
scored worse than the 28 MB default on real meeting audio.
The native binding sherpa-onnx-node is an optional dependency. When it is
absent, transcription still works and pi-voiceid fails with an actionable
message naming the dependency and the install command.