From human-voice
Rewrites AI-sounding prose to read human by removing hedging, filler words, structural tells, and vacuity. Accepts file path or pasted text.
How this skill is triggered — by the user, by Claude, or both
Slash command
/human-voice:human-voice <file-path | pasted-text> [fix|generate] [register: technical|business|marketing|academic|casual|creative]When to use
When prose "sounds like AI" or "sounds like ChatGPT", when humanizing or de-slopping a draft, when a report/email/README/landing-page reads robotic, or when drafting copy that should read human from the start. Not for: translation, summarization, or grammar-only fixes.
<file-path | pasted-text> [fix|generate] [register: technical|business|marketing|academic|casual|creative]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill whenever the user wants prose that does not read as AI-written:
STYLE-GUIDE.mdexamples/academic-after.mdexamples/academic-before.mdexamples/after.mdexamples/annotated-walkthrough.mdexamples/before.mdexamples/casual-after.mdexamples/casual-before.mdexamples/cliche-metaphor-after.mdexamples/cliche-metaphor-before.mdexamples/email-after.mdexamples/email-before.mdexamples/generate-example.mdexamples/marketing-after.mdexamples/marketing-before.mdexamples/over-corrected-after.mdexamples/over-corrected-before.mdexamples/refusal-to-fabricate.mdexamples/restraint-case.mdreferences/ai-tells.mdUse this skill whenever the user wants prose that does not read as AI-written:
rewriting an AI-sounding draft (fix), or drafting new copy that reads human
from the start (generate). It works for any kind of writing — technical
reports, documentation, marketing and web copy, blog posts, emails, academic
prose, and fiction — by matching the conventions of that genre (see Register
profiles). A universal core of AI tells is fixed in every genre; the rest flex.
The job is not to swap a few words. AI text gives itself away at three depths — lexical (delve, leverage, seamless), structural (em-dash overuse, relentless rule-of-three, bold-bullet listicles, uniform sentence length), and substance (vacuity, restatement, meta-commentary, fabricated specificity, weak stance). A pass that only changes vocabulary ships text that is still obviously AI. Fix the deep tells first.
It draws on the same ideas as the public detectors and linters — GPTZero (perplexity / burstiness), proselint, write-good, Vale — but goes past them on substance, stance, and consistency, which no word list catches. Note that banned-word lists age: "delve" spiked after ChatGPT then faded once writers learned to avoid it, so treat the lexical checks as a floor, never as proof.
AI-text detectors combine a few measurable signals. We optimize each by writing
genuinely better — never by gaming. See references/ai-tells.md
for the full landscape and sources.
Scope and ethics. The promise is reads as written by a skilled human — which also happens to not trip detectors — not disguise machine text. Never use the adversarial tricks the evasion literature describes: Unicode homoglyphs, zero-width characters, deliberate typos, meaning-degrading synonym swaps, or fabricated facts/quotes/stats. Those wreck the text and violate principle 3. Detectors are also demonstrably unreliable in ways that matter ethically: Liang et al. (2023) found they disproportionately misclassify non-native-English writing as AI. That is the strongest reason no detector is ground truth, and another reason the goal is genuinely better writing, not a passing score.
The tells readers actually cite and the tells a keyword scanner matches
diverge sharply (a ~90k-post study of how people spot AI writing). Generic words
— however, thus, hence, nuanced, comprehensive, robust, when it comes to — match constantly but are cited as a tell almost never; people just
write that way, and flagging them is how detectors wrongly catch careful and
non-native writers. So the linter parks them in soft_filler/transitions at a
low weight. What readers do catch is structural: flat uniform rhythm, the "not
just X, it's Y" antithesis, the five-paragraph "in conclusion" mold, sycophancy
("great question!", reflexive "you're absolutely right"), and saying nothing at
length (fluent, confident prose that makes no claim). The last two are the two
highest tells no word list can see — only your read catches them. Fix structure
and substance first; treat a generic-word hit as a whisper, not a verdict. Full
rationale and the weight tiers: references/cited-vs-matched.md.
creative register, treat it as a strong tell and replace nearly all of
them. The trick that keeps this from becoming its own uniform signature is to
vary the replacement — a comma here, a period there, a colon or parentheses
or an outright restructure elsewhere — so the rhythm stays bursty even as the
dashes go. Emoji are not human in most registers either; cut them.Parse $ARGUMENTS for a mode token and an optional register: token. Parsing is
order-independent and case-insensitive: accept fix/generate in any position,
register: marketing, register=marketing, or a bare register name; treat
anything that resolves to an existing path as the input file, not a mode.
fix (default when the input is an existing file path or pasted prose):
rewrite the supplied text to remove tells while preserving every invariant.generate (when the input is a brief/spec, or the user says "write" /
"draft"): produce new copy that reads human from the first draft, then run it
through the same self-critique loop before returning it. Load
references/structural-craft.md for the
generative moves (vary length and density, don't follow the outline, get
specific) — the linter catches tells but can't teach voice.Resolution decision tree:
input is a brief/spec, or user said "write"/"draft"? → generate
otherwise → fix
contains code, metrics, or config? → register: technical
has a call-to-action / sells to "you"? → register: marketing
has citations / measured "we"? → register: academic
first-person anecdote, casual contractions? → register: casual
greeting + sign-off? → register: email
versioned, past-tense, bulleted change list? → register: release_notes
numbered "how-to" steps? → register: tutorial
cues conflict and change the voice? → ask one short question
If a file path is given, do not overwrite it blindly. First confirm the file is
tracked by git (so the change is recoverable); if it is not, write a <file>.bak
copy before editing. Show the rewrite (or a before/after diff) and the
Humanization Audit, then edit in place once the rewrite passes the loop. If only
pasted text is given (no file), print the rewrite plus the audit — do not write
any file.
Default register is inferred from the content (see Register profiles); if
genuinely ambiguous and it changes the voice materially, ask one short question.
"Human" depends on genre. Infer the register, then apply the universal core plus
that register's conventions. Pass the matching --register to the linter so it
mutes checks that don't apply (e.g. warmth in marketing). The universal core
— vacuity, fabrication, rule-of-three, bold-bullet listicles, puffery, vague
attribution, low burstiness, drift, restatement, "not X, it's Y" — is fixed in
every profile.
| Register | Voice | What's allowed here that isn't elsewhere | Still wrong |
|---|---|---|---|
technical (default) | Professional, direct, present tense | — (strictest) | warmth, "you"-selling, hype |
business | Professional with a little warmth | a brief courteous opener/closer | gush, filler, hedging |
marketing | Conversational, addresses "you" | "you"/"we", contractions, light enthusiasm | puffery and hype (the AI failure mode here), fake stats |
academic | Formal, measured | measured hedging, "we"/passive, citations | unsourced "studies show", clichés |
casual | Personal, conversational | contractions, "I"/"you", rhetorical questions, fragments | listicle padding, meta-commentary |
creative | Narrative voice | em-dashes, fragments, wide cadence, any vocabulary in service of voice | clichés, pleonasm, puffery as lazy writing |
email | Brief, courteous, direct | a one-line greeting/sign-off, "you"/"I" | jargon, padding, burying the ask; chatbot sign-offs |
release_notes | Terse, user-facing, past tense | imperative/past bullets, fragments | marketing hype, vague "various improvements" |
ux_microcopy | Minimal, plain, "you" | fragments, dropped articles, terseness | full-sentence padding, cleverness over clarity |
tutorial | Instructional, second person, present | "you", imperatives, numbered steps | over-explaining the obvious, rhetorical filler |
Each register has a worked before/after pair in examples/ — read the
one matching your genre before you start.
Register-specific constraints (beyond voice). Honor the format the genre demands: a commit message uses imperative mood and a ~50-character subject; a release note is past-tense and user-facing ("Fixed a crash when…", not "We refactored…"); UX microcopy is terse and may drop articles; an email leads with the ask. These are hard conventions, not stylistic preferences.
Register detection cues (when inferring). Code blocks, metrics, or config →
technical. A call to action, "you", or product benefit → marketing.
Citations, "we", measured hedging → academic. First-person anecdote, casual
contractions → casual. A greeting + sign-off → email. Versioned, bulleted,
past-tense change list → release_notes. Numbered "how to" steps → tutorial.
When the cues genuinely conflict and it changes the voice, ask one short question.
When registers blend (a technical blog post is technical + casual): the
universal core still holds; resolve voice toward the dominant audience and hold
one voice rather than switching mid-document. The calibration test: write as the
most respected human author in that genre would, and ask whether this voice would
survive in the publication it's bound for.
Two rules that survive every register: never fabricate (no invented facts, stats, anecdotes, or quotes to sound human — principle 3) and match, don't fake (don't bolt slang onto a report or stiff formality onto a blog post).
The highest-signal tells, with one-line fixes. The full catalog with BAD →
GOOD pairs for every category is in
references/ai-tells.md — load it for the rewrite.
creative,
replace nearly all of them with a comma, period, colon, or parentheses (vary
the mark; don't swap every one for a comma). Keep the hyphen for compounds and
the en-dash for ranges (10–20). Never -- or a spaced - as a dash. The
--fix autofixer rewrites em-dashes, --, spaced hyphens, and non-numeric
en-dashes to commas automatically (skipped in creative). See category 9 in
references/ai-tells.md.references/structural-craft.md.- **Term:** ... on every item) → convert some to
prose; drop ornamental bold.academic ("the data show").academic).references/over-correction.md.--- between every section → remove. (--fix
strips decorative emoji outside creative/casual.),;:!?; one terminal mark (not
"!!" / "?!?"); one quote and ellipsis style throughout. See category 9.Concrete anchors for the most common tells. The full catalog with a pair for every
category is in references/ai-tells.md.
The whole skill on one screen. The detailed procedure, loop, and protocol below expand each step.
fix/generate) and register. List the
invariants and build the claim inventory (numbers, dates, named entities,
citations, causal/comparative claims). Baseline-lint for a floor score.Never fabricate to sound human. Match the register; don't bolt on a voice the genre rejects.
Work in this order (principle 1). Do not jump to diction first.
references/ai-tells.md.creative, replace
nearly all em-dashes with a varied mark (comma, period, colon, parens), keep
the hyphen for compounds and en-dash for ranges, no --/spaced-hyphen dashes,
no doubled words, no space before ,;:!?, one terminal mark. Running the
linter with --fix clears the mechanical ones (em-dashes, --, spaced
hyphens, emoji) before you do the judgment work. Skip swaps that leave the
sentence vague. See category 9.After the rewrite, do not return it yet. Run an adversarial pass.
Review from three angles, not one. A single hostile reviewer misses whole classes of tells. Read the rewrite as each of:
Score each dimension 0–2, where 0 = clearly AI, 1 = passable, 2 = genuinely human: Substance, Rhythm, Stance, Consistency, Sourcing, Diction, Register. The bar to return: no dimension below 1, and the mechanical ones (Rhythm, Diction) not the only thing carrying it. This makes "good enough" measurable instead of a vibe.
Hit concrete targets, not "improve it":
creative (replace nearly all with varied marks);fix mode, expect to cut 15–25% of the words;Final self-check (the rhythm is the tell your ear catches before your eye): read the rewrite aloud. If it sounds like a metronome, vary it. Then scan: (a) shortest vs longest sentence — under a ~15-word gap? add a short punch; (b) any three consecutive sentences sharing a shape (all Subject-Verb-Object)? break one; (c) did the register shift at least once between plain and precise? (d) em-dashes
1 outside
creative? replace the extras; (e) any sycophancy, "in conclusion" recap, or "not X, it's Y"? cut it; (f) one concrete detail a generic model wouldn't have written? If a Reddit commenter would call it slop, it isn't done.
Then:
--dialect american or
--dialect british to catch spelling drift against your chosen dialect).These must survive the rewrite unchanged. Diff-check before applying:
If a rewrite would change any invariant, revert that span and keep the original.
Humanizing prose is exactly when fabrication creeps in: a flat sentence gets "fixed" with a vivid invented detail, a hedge becomes a confident false claim, a vague gesture grows a fake statistic. The rewrite must add voice, never facts. Follow these steps every time.
{claim, value, source-span} triple — numbers, dates,
named entities, citations, causal/comparative assertions ("X is faster than
Y"). These are the invariants. Nothing on this list may change in value, and
nothing new may join it. This list is the artifact you diff against in step 7.[SOURCE NEEDED], [FIGURE?], [VERIFY] — and
call it out. A visible gap is honest; an invented filler is a hallucination.
Every placeholder must be enumerated in the audit, and any output that
still contains one is flagged as draft-pending, never presented as finished.
Placeholders are removed only by the author, never silently by you.generate mode is held to the same bar — the brief is the invariant set.
Drafting from a brief does not license invented statistics, quotes, case
studies, or citations. Write only what the brief supports; anything asserted
beyond it is a placeholder, and the audit must list every fact stated that
the brief did not provide so the author can verify or cut it.A regex cannot catch a fabricated fact, so this protocol is judgment, not a linter check — the linter only flags the vague-attribution and fabricated-specificity-shaped phrasings that often accompany it.
Jargon is the corporate cousin of filler, and the linter flags a jargon
category for it ("synergy", "leverage", "circle back", "move the needle",
"low-hanging fruit", "actionable", "best-in-class", "operationalize",
"paradigm shift"). Cutting words is not enough; apply the rules.
creative,
varying the replacement mark so the rhythm doesn't flatten.STYLE-GUIDE.md).over_correction/internet_tells (muted only in
casual/creative). The fix is a real deliberate voice, not the absence of
the old tell. See references/over-correction.md.fix or
generate; infer register.generate's first draft):
# pick the register that matches the genre (default technical)
python3 scripts/detect_ai_prose.py --register marketing <file>
# add an optional dialect consistency check:
python3 scripts/detect_ai_prose.py --dialect american <file>
# pasted text:
printf '%s' "$TEXT" | python3 scripts/detect_ai_prose.py --register casual -
# score-only / machine-readable, and an after-vs-before comparison:
python3 scripts/detect_ai_prose.py --quiet <file>
python3 scripts/detect_ai_prose.py --json <file>
python3 scripts/detect_ai_prose.py --baseline <original> <rewrite> # prints the delta
Run the same command on the rewrite to confirm the score and verdict band drop,
and quote both numbers in the audit (--baseline prints the delta directly).
The script covers tells (filler, hedging, meta, em-dash, bold-bullet,
burstiness, n-gram repetition, lexical diversity) and consistency drift
(spelling, heading case). Phrase and spelling lists live in
scripts/ai_prose_patterns.json. It is the deterministic floor only — it
cannot see vacuity, weak stance, or terminology drift. If the script is
unavailable, degrade gracefully to pure judgment using
references/ai-tells.md and this no-tool checklist: (a) read the
sentence-length sequence and flag any run of 3+ similar lengths; (b) scan the
first word of each sentence for repeated openers; (c) grep your draft for the
top filler words (delve, leverage, robust, seamless, crucial, comprehensive,
landscape); (d) count em-dashes (outside creative, essentially any is a
tell); (e) check every list for the bold-lead-in - **Term:** pattern.python3 scripts/detect_ai_prose.py --fix --register <reg> <file> rewrites em-dashes, --, spaced hyphens, and non-numeric
en-dashes to commas, strips decorative emoji, and applies 1:1 filler/jargon
swaps (em-dash + emoji fixes are skipped in creative; emoji also kept in
casual). Use --fix-dry-run to preview. This never touches code, numbers,
or links. It does not vary the replacement mark, so still do the rewrite pass.references/ai-tells.md..bakd), show the rewrite/diff, then edit in place; for pasted text, print the
rewrite. Always print the Humanization Audit.git diff or a before/after of numbers,
code, links).## Humanization Audit — <file or "pasted text">
Register: <technical|business|marketing|academic|casual|creative|email|release_notes|ux_microcopy|tutorial>
Score: <before> → <after> [<band>] (linter floor; not ground truth)
Words: <before> → <after> (−NN%)
Passes run: <n>/3
Tells removed (by category):
- Substance: <n> e.g. cut 2 vacuous paragraphs; removed restated conclusion
- Structure: <n> e.g. de-triadic 4 sentences; raised burstiness 0.31→0.58
- Stance: <n> e.g. committed to FSDP recommendation; fixed false balance
- Consistency: <n> e.g. "the LLM"/"the model" → "the model"; 3 dialect fixes
- Sourcing: <n> e.g. "studies suggest"→cited eval; cut "end result"
- Diction: <n> e.g. leverage→use, robust→(cut), landscape→(cut)
- Formatting: <n> e.g. removed 2 emoji headings, 3 section rules
Dimension scores (0–2): Substance _ · Rhythm _ · Stance _ · Consistency _ · Sourcing _ · Diction _ · Register _
Invariants preserved: numbers ✓ code ✓ links ✓ claims ✓ PII-safe ✓ (claim diff: +0 added / 0 strengthened / 0 weakened / 0 dropped)
Placeholders left for author: <list of [SOURCE NEEDED]/[VERIFY], or "none">
Residual risk: <why a skeptical human might still flag this, or "none">
## Rewrite
<the humanized text>
For generate, skip the "removed" counts (there is no before); report the final
score, the register, and confirm no fabricated specifics were introduced.
npx claudepluginhub stephenoffer/human-voice --plugin human-voiceRemoves signs of AI-generated writing from text to make it sound more natural and human. Detects patterns like promotional language, passive voice, and filler phrases.
Removes signs of AI-generated writing from text to make it sound more natural and human. Detects and fixes patterns like inflated symbolism, promotional language, passive voice, and filler phrases.
Audits and rewrites content to remove AI writing patterns ("AI-isms"). Supports detect-only mode, file edit-in-place, voice profiles, and iterative refinement.