humanizar-es

agent
Guvenlik Denetimi
Gecti
Health Gecti
  • License — License: NOASSERTION
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Community trust — 10 GitHub stars
Code Gecti
  • Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Gecti
  • Permissions — No dangerous permissions requested

Bu listing icin henuz AI raporu yok.

SUMMARY

Local AI text humanizer for Spanish & English, built on controlled experiments: a base model without chat training rewrites, a fidelity guard keeps every concept and quote, the rhythm is rebuilt, and flagged paragraphs are re-sampled and selected. 0% in Grammarly, ZeroGPT and GPTZero. No API · Humanizador IA local.

README.md

humanizar-es · Local AI text humanizer for Spanish and English

tests
license: MIT
macOS · Linux · Windows
Español · English

English · Español

humanizar-es: make AI text read as human, on your own computer, for free

humanizar-es takes a text written with ChatGPT, Claude, Gemini or DeepSeek and gives
it back saying the same thing, in prose that the three detectors we measured read as
human: 0% in Grammarly, 0% in ZeroGPT and 0% AI / 98% human in GPTZero, on the same
1,990-word essay that started at 45%. It runs on your own computer with an open model: no
API, no keys, no per-word fees, and your text never leaves your machine. Use it by hand or
as a skill for your coding agent (Claude Code, Codex, OpenCode, Antigravity).

It is not a synonym spinner, a "rewrite it in a human tone" prompt, or a typo generator.
It is a four-stage pipeline, and every stage exists because a controlled experiment showed
what a detector actually measures: one variable at a time, the same text in every
condition, and a human-written control and the AI original in every session.


Results

AI-generated essay Grammarly ZeroGPT GPTZero
Aristotle: act and potency · 1,990 words · before 45% 45.3% 37% AI
Aristotle: act and potency · after 0% and 0% 0% 0% AI · 98% human
Tourism and AI in Chiapas · 1,150 words 77% → 0% — —
An AI classification model · 690 words → 0% — —
Dragon Ball and its generation · 910 words 84% → 10% — —
🇬🇧 Remote work (English) · 601 words — 100% → 0% —
🇬🇧 Electric vehicles (English) · 673 words — 100% → 0% —

October 2026. The first essay keeps 24 of 24 key names, terms and figures, and its two
quotations of Aristotle word for word. Grammarly reads ~1,400 words, so it was measured in
halves. The Dragon Ball essay ran on an earlier version of the pipeline.


The method

 original ─► 1. rewrite ──► 2. fidelity ──► 3. rhythm ──► 4. selection ──► final
             base model     concepts,       blocks of      candidates,
             without chat   quotes, copy,   uneven         measured in the
             training       ≤3-word fixes   length         whole document

What the detectors measure

Three detectors, three different signals. The pipeline exists because each one was
taken apart with experiments:

Detector What it reacts to What does not move it
GPTZero the fingerprint of chat training; its newer English model (4.1o) also reads base-model text, our next milestone —
Grammarly rhythm: sentences of even length, each closed by its own period double spaces (typos do move it, but leave visible errors)
ZeroGPT individual sentences that read like a textbook; it scores sentence by sentence and weighs by words joining sentences of a human text (Unamuno joined: 0%)

1. Remove the chat-training fingerprint

Xu et al. (2026), Base Models Look Human To AI Detectors,
showed that text from a base model scores 97–99% human on GPTZero and Pangram, and the
same model after chat training 17–30%. Our tests agree: every rewrite we tried with a chat
model stayed between 64% and 100% in Grammarly. rewrite.py paraphrases with
Qwen3-4B-Base plus the paper's HIP adapter, through llama.cpp, on your CPU.

2. Keep it faithful, without putting the fingerprint back

Each paragraph gets one pass, and a try is rejected and retried when it:

  • loses a concept you listed (names, terms, figures, key negations);
  • changes a quotation of the original or adds a reference the original never had
    (on a test essay the model wrote «(De Anima, libro i, cap. vi)», which does not exist);
  • copies the original: more than 60% of its words in runs of 8+ identical words;
  • eats Spanish accents («comunio'n», «oraci n», «composicin», «Espiritu»);
  • switches language mid-sentence («VER significa listening and understanding…»);
  • drops the negations an idea rests on («el criterio no sería solo la asistencia» →
    «el criterio sería el de la asistencia»);
  • invents a quotation or repeats a sentence it made up;
  • comes out truncated or runs away.

check.py then compares concepts and negations, and a person fixes one to three words
at most. Anything bigger is regenerated by the model (--only), never written by hand and
never pasted back from the original: hand fixes of four or more words kept half an essay
at 3% in Grammarly; regenerating those paragraphs brought it to 0%.

3. Rebuild the rhythm

People write in bursts, some sentences long, some short. join.py --pauses 2 leaves two or
three periods per paragraph, in blocks of uneven length of at least two sentences,
cutting first where a sentence already opens with a discourse marker («Sin embargo»,
"For example", «Segundo»). Inside a block it links with "and" or ";". No content word is
touched.

4. Select by measurement

The base model is a sampler: the same paragraph comes out differently every time, and a
detector can score two samples 0% and 100%. So the paragraphs a detector still flags are
regenerated several times (--candidates), each candidate is joined and measured inside
the whole document
(context changes the score), and the one that passes is adopted
(--take). All candidates come from the same base model, so selection adds no chat
fingerprint. Two findings made this work:

  • The opening words matter. To keep writing in Spanish, the model starts each paragraph
    with the original's first two words. When those are a stock opening («Uno de los
    problemas más importantes…», «Aristóteles distingue…»), the model rebuilds the stock
    sentence and ZeroGPT flags it. Starting with other words (--lead "Desde la") fixed it:
    22 candidates of one paragraph with the original opening scored 100%; with another
    opening, 0%.
  • Every edit is measured again. ZeroGPT is deterministic but brittle: a one-word fix
    took a paragraph from 0% to 62%.

The experiments behind each stage

Same essay, one change at a time.

Grammarly
Rewritten by the base model only 84%
… plus random double spaces 84%
… removing ~35% of the commas 60%
… joining ~60% of the sentences 40%
… joining every sentence of each paragraph 8%
The original, without the base model, joining every sentence 57%
Rewriting with a chat model (four different recipes) 64–100%
Pauses, with a sentence left alone between two periods 6%
Pauses, blocks of two or more sentences 0% and 0%
ZeroGPT (deterministic: the same text always gives the same score)
The AI original 34.3%
Rewritten by the base model, sentences unjoined 33.9%
… all sentences joined 44.0%
… with pauses 52.4%
A human text (Unamuno, 1914), joined the same way 0%
After selection: candidates measured in the whole document 0%

The tension is real: Grammarly wants long sentences, ZeroGPT punishes a long sentence that
contains one textbook clause. Rhythm alone cannot satisfy both; rhythm plus selection does.
Every measurement: references/evidence.md.

How we measure

  • Two controls in every session: a human text must come out human, and the AI original
    must come out as AI. A detector that fails either one does not count: QuillBot scored
    the AI original 100% human, and GPTZero, after many scans from one browser, scored a
    1914 text 100% AI.
  • The reference is re-measured in the same session, never compared with a number from
    hours before.
  • The final format is the one measured: with headings and bibliography, ZeroGPT can
    give a different score than for the bare text.

Install

With your agent (easiest)

git clone https://github.com/ervin-mo/humanizar-es.git
cd humanizar-es
python3 install.py          # on Windows: python install.py

Open a new session and ask: "humanize this text" (or «humaniza este texto»). The skill
walks the agent through every stage: install what's missing (it asks before downloading the
model), list with you what must not be lost, rewrite, show you every change, rebuild the
rhythm, and select candidates for whatever your detector still flags.

Agent Skills folder Covered by install.py?
Claude Code ~/.claude/skills yes
Codex ~/.agents/skills yes
OpenCode ~/.agents/skills, ~/.claude/skills yes
Antigravity (agy) ~/.agents/skills yes
DeepSeek Harness (dsh) ~/.agents/skills yes
Gemini CLI ~/.gemini/skills with --agent gemini

The model (once, ~4.6 GB)

You need Python 3.9+ (no extra packages) and llama.cpp:

macOS and Linux Windows
llama.cpp brew install llama.cpp winget install llama.cpp
The model python3 scripts/install_model.py python scripts\install_model.py

The installer checks every file against its sha256 and resumes if the download is cut.
It runs on CPU: 8 GB of free RAM is enough, no GPU. On an M4 Mac it takes about 30–60
seconds per paragraph; on a few-years-old PC, 1 to 3 minutes.


Use it by hand

On Windows, type python where it says python3.

1. List what must not be lost in concepts.txt: full proper names, figures, terms.
One per line, variants with |, * for prefixes.

Aristotle
act and potency | act and potentiality
self-regulat*

2. Rewrite with the base model:

python3 scripts/rewrite.py my-text.txt -o rewritten.txt --concepts concepts.txt

3. Check, and fix one to three words at most. For anything bigger, regenerate that
paragraph:

python3 scripts/check.py my-text.txt rewritten.txt --concepts concepts.txt
python3 scripts/rewrite.py my-text.txt -o rewritten.txt --concepts concepts.txt --only 6,11

Don't ask ChatGPT to fix it: it puts back the fingerprint the base model removed.

4. Rebuild the rhythm (the language is detected automatically):

python3 scripts/join.py rewritten.txt -o final.txt --concepts concepts.txt --pauses 2

5. Measure the final text in your detector, in the format you will hand in, with a
human text as control (references/detectors.md).

6. Select, for what is still flagged. Generate candidates of those paragraphs, with
other opening words if the paragraph starts with a stock phrase:

python3 scripts/rewrite.py my-text.txt -o rewritten.txt --concepts concepts.txt \
        --only 4 --candidates 6 --lead "Desde la" --temperature 1.1

Join each candidate into the full text, measure, adopt the one that passes, and join again:

python3 scripts/rewrite.py my-text.txt -o rewritten.txt --take 4=rewritten.txt.candidates/p04-3.txt
python3 scripts/join.py rewritten.txt -o final.txt --concepts concepts.txt --pauses 2

Reread the adopted paragraph against the original: passing a detector is worth nothing if
it dropped an idea.

Before measuring, prepare what you paste: halves under 1,400 words, a check phrase that only
the final has, and the clipboard in UTF-8 (a plain pbcopy breaks accents):

python3 scripts/halves.py final.txt --original my-text.txt --copy 1

Worked examples, with every hand fix listed, are in examples/.


Languages

Rewrite Rhythm Check Measured
Español ✅ ✅ «y», «;», «pero»… ✅ ✅ four essays, three detectors
English ✅ (the HIP adapter was trained in English) ✅ "and", ";", "but"… ✅ ✅ ZeroGPT, two essays · GPTZero: next milestone

Other languages: the rewrite may work (the base model is multilingual), but join.py
only knows Spanish and English connectors. Adding one is a small dictionary in
scripts/join.py; pull requests welcome.

Detectors

Detector Status
Grammarly ✅ 0% on three of four essays (10% on one run with an older version)
GPTZero ✅ 0% AI · 98% human (Spanish) · English: next milestone (what we tried)
ZeroGPT ✅ 0% in Spanish and English, with stage 4 (selection) where needed
QuillBot not usable in Spanish: it scored the AI original 100% human

Each detector runs its own model, so a version that passes one may not pass another; the
first essay passes all three at once. Measurements on more detectors and more kinds of
text are the contribution we need most.


FAQ

Is it free? Do I need an OpenAI key or any account?
Free and keyless. The model downloads once and runs on your computer.

Does it change what my text says?
It is built not to: tries that lose a concept, change a quote, invent a reference, eat
accents, switch language or drop key negations are rejected, check.py compares concepts and negations, and you reread every paragraph.

Does it add typos on purpose, like other "humanizers"?
No. It changes who wrote the sentences and their rhythm, not the spelling.

Are the results consistent?
Three of four essays reached 0% in Grammarly, and the latest one passes Grammarly, GPTZero
and ZeroGPT at once. The pieces that can be deterministic are (the joining is seeded;
ZeroGPT gives the same score for the same text), output that copies the original is
refused, and 48 tests run on every change on Ubuntu, macOS and Windows. Detectors drift
over time, which is why every session carries controls.

Does the selection step send my text anywhere?
The tool never does. Measuring is your step, in your detector, as with any text you check.

Do I need a GPU?
No. It runs on CPU, at low priority, so your computer stays usable.


Limits

  1. GPTZero in English is the next milestone. Its newer English model (4.1o) reads
    base-model text from ~250 words on; three model families were tested
    (evidence). Emails, marketing and technical writing are not
    measured yet.
  2. Rereading is not optional. The base model sometimes changes a detail or flips an
    idea. The pipeline catches lost concepts, changed quotes and invented references; a
    person catches the rest.
  3. Selection costs time. Each candidate is a model run (30–60 s per paragraph on an M4).
  4. Detectors change. This is a snapshot of October 2026.

Responsible use

Made for text you sign and answer for: brand content, outreach, documentation, emails,
drafts written with AI help. Don't use it to hand in graded work as your own where AI is
banned or must be disclosed.
That problem isn't technical; it's academic honesty.


Project layout

humanizar-es/
├── SKILL.md                 the skill for agents
├── install.py               installs the skill (install.sh: shortcut for macOS/Linux)
├── scripts/
│   ├── install_model.py     downloads the model (once)
│   ├── rewrite.py           stages 1, 2 and 4: rewrite, guard fidelity, candidates
│   ├── check.py             stage 2: concepts and negations, original vs rewrite
│   └── join.py              stage 3: rebuild the rhythm of each paragraph
├── examples/                worked examples in Spanish and English
├── references/              every measurement, and how to measure
└── tests/                   48 tests on Ubuntu, macOS and Windows (no network, no model)

The old script names (hip.py, unir.py, verificar_fidelidad.py, instalar_hip.py)
still work.

Contributing

What's missing most is evidence: the pipeline measured on more texts, more languages
and more detectors, always with a human control and the AI original. Open an issue or a
PR with the numbers in references/evidence.md.

python3 -m unittest discover -s tests -v

Credits and license

Code and docs: MIT, © ervin-mo. The HIP method and adapter are by Xu et al.
(2026); the base model is Alibaba's Qwen3-4B-Base. Both are Apache-2.0 and downloaded
separately: see THIRD_PARTY.md. If you use this in your work, cite the
repo (CITATION.cff) and the HIP paper.

Yorumlar (0)

Sonuc bulunamadi