Build a writing profile from 5–20 samples, check drafts against explicit rules, and see which measurements are unavailable.
- Extracts a local voice fingerprint (
~/.voice/<profile>.yaml) from your actual writing: sentence-length distribution, function-word signature, punctuation rates, sentence openers, register, signature phrases. Computed fields carry their method; unavailable statistics stay null. This is an instruction skill, not a bundled calibrated measurement engine. - Checks any draft against the fingerprint and returns rule-level violations — rule id, the exact matched text, character span, severity, fix hint — instead of "this sounds off."
- Acts as a constraint layer for other drafting skills: inject the fingerprint, check the output, retry hard failures twice, and never let a failing draft through silently.
- Works with no fingerprint at all, in a degraded mode: a generic check for placeholders, stock AI scaffolds ("in today's fast-paced world", "it's not just X, it's Y"), and buzzword slop — clearly labelled as fingerprint-free.
- "Make it sound like me."
- "My drafts sound AI-written."
- "This doesn't read like something I'd write."
- "Set up my voice fingerprint." / "Check this draft against my voice."
- 「像不像我?」「太 AI 腔了」
It stays out of the way for generic proofreading, grammar fixes, and tone rewrites that have nothing to do with a personal voice — and it refuses to be a bot-detector evasion tool or to fingerprint someone who isn't participating.
npx skills add m1nga/voice-extractor
Authored fixture; no user samples or measured client results.
Input: “Check my voice: Quick one: meet [INSERT NAME].” No profile exists.
Result: no-fingerprint; fail on stray-placeholder, match [INSERT NAME],
span [16, 29) in the draft “Quick one: meet [INSERT NAME].” (zero-based Unicode
code points). Six of seven generic rules pass. Remove the sentence or supply a
verified name. drift_score: n/a: this checks generic rules, not personal similarity.
Recovery: Supply 5–20 of your own samples to extract a profile. A 40-token draft cannot be compared to a 100-token MATTR baseline; that check is skipped and reported. Missing reference statistics cannot produce a Delta or aggregate score.
- humanizer — humanizer strips generic AI patterns; voice-extractor adds what only you would write. Where they disagree, the fingerprint wins: if your samples show habitual em-dashes, this skill defends them against blanket em-dash bans in the same session.
- brand-voice-enforcement — company-level voice rules. voice-extractor is the sender-level counterpart: the pitch from "Sarah at Acme" should sound like Sarah, not Acme marketing.
- An editorial-judgment skill, if you have one installed — voice-extractor deliberately stops at rule-level findings and hands quality judgment over instead of improvising critique.
- Bands, not vibes. Adjective style guides ("warm, concise, professional") don't survive contact with a drafting model — the model nods and writes model-prose anyway. A number with a tolerance band either passes or fires a rule at a specific span. That's the whole design.
- The measurement limits are explicit. Delta and MATTR have specific data requirements; register proxies and default thresholds here are heuristics. Missing baselines produce skipped checks, not invented numbers. Style rules do not identify AI authorship.
- The em-dash rule is relative. The em-dash became shorthand for "AI wrote this," so editing tools started stripping it everywhere. But it's only a tell against your baseline — a lifelong em-dash writer who suddenly stops is drifting too. The fingerprint records the rate and defends it in both directions.
- It refuses thin input. Fewer than 5 samples is a hard no; user-identified AI-edited samples are reviewed before extraction, because a fingerprint learned from AI prose teaches drafts to sound like AI. This came out of a solo builder sending outreach under their own name and watching reply rates drop as the drafts got smoother — the fix was measurement, not more prompting.
- Fingerprints decay. Every profile is stamped for refresh at 90 days. Voice drifts; the skill says so instead of pretending a 2024 corpus still describes you.
Probed 8 scenarios across 6 personas · 5 fired correctly · 2 correctly stayed quiet · 1 trigger coin-flip flagged for a fix.
"你帮我看看这段回复,像不像我?感觉有点太 AI 腔了" → Fired on the owner's exact dictated phrasing, ran a full fingerprint check, and answered in the user's language with English rule ids intact.
"Check this draft against my voice" — on a fresh machine with no fingerprint on disk → Instead of inventing numbers, it degraded to a clearly-labelled generic check (the seven fingerprint-free AI-tell rules), reported
drift_score: n/a, and told the user to run extract first. No fabricated stats, no silent pass.
"Fix the grammar in this paragraph" → Stayed quiet. Generic proofreading is explicitly out of scope — the skill only wakes up when a personal voice is at stake.
Probe method: scenario-probe
Built by Ming. The design notes above explain the real problem and tradeoffs that shaped this skill.