项目详情

watermarks-remover

隐私优先的去水印工具——从你自己拥有的内容里剥掉 AI 厂商埋下的溯源标记:隐形 Unicode、统计水印、C2PA 元数据

GitHub 地址 MIT 21.8k Stars · 33 天 Python stdlib 零依赖 v0.7.0

更新于 2026-09-13

← 返回汇总
项目速览

一句话定位

AI 溯源水印的「反编译器」

Agent skill + 纯 stdlib Python 服务,多层剥离 AI 内容溯源标记:Layer A 确定性清除隐形 Unicode(零宽字符、双向控制、标签密文);Layer B 用改写博弈对抗统计型文本水印(SynthID-Text / Kirchenbauer / keyed-Gumbel 类);文件层清除 C2PA / EXIF / XMP 元数据,覆盖 20+ 格式。定位「content you own」的隐私与卫生需求。配套 MarkLLM/CtrlRegen 等研究级验证链。伦理敏感:它同时是透明度基建的对手方。

项目速览

核心数据

21.8k
Stars
33 天
项目年龄
2.5k
Forks
20+
支持格式
为什么存在

一场被法规点燃的军备竞赛

EU AI Act Art.50 / SB 942 强制披露 → 厂商埋两层水印 → 用户要拿掉自己内容上的标记 → 本项目:三层反制
厂商的两层水印模型
  • 硬绑定层:C2PA 清单(图像/文档元数据),行业标准,可验证
  • 软绑定层:SynthID 类不可感知水印——文本改 token 采样分布,图像藏像素域信号
需求侧的真实焦虑
  • 「AI 味」污名:带水印=被识别为 AI 生成,内容贬值
  • 隐私:内容会暴露用了哪家模型、什么时候用的
  • 所有权边界:自己付费生成的 内容,标记算谁的?

注:Google 已于 2026-08 在 API 上退役 SynthID 文本水印(项目 vendor-notes 有记录);行业攻防仍在演变。

🔥 核心架构

三层武器库:确定性 → 统计博弈 → 元数据

Layer A · 确定性清除(纯 stdlib) 隐形 Unicode:零宽字符(ZWSP/ZWNJ/ZWJ)· 软连字符 · 双向控制(LRM/RLM/BIDI)· 变体选择符 标签字符 U+E0000 区(可藏 ASCII 密文,可解码)· 异形空格族(排版上下文可选保留) 特点:逐字符扫描,零误伤可证明,速度快——本页末有浏览器版 Playground Layer B · 统计水印博弈(LLM 改写) 对抗 SynthID-Text / Kirchenbauer 绿名单 / keyed-Gumbel:token 采样偏置无法逐字符定位 默认策略 paraphrase@0.8 + mlm@0.2(RoBERTa 掩码重写),检测引导迭代直到评估通过 关键约束:必须用非同源模型改写,否则水印会被重新盖上(--restamp-control 度量) 文件层 · 元数据清除 C2PA 清单 / EXIF / XMP / 文档属性:PNG JPEG WebP AVIF HEIC BMP GIF TIFF SVG PDF DOCX XLSX PPTX EPUB ODT HTML Markdown MP4 MOV M4A WAV MP3 FLAC(20+ 格式) PDF 需 qpdf 结构重建才算真清除;未知格式拒绝自动清洗(exit 2),不写回损坏字节 Claude 系 隐形 Unicode 标记(文本) → Layer A 直接清除 C2PA(图像输出)→ 文件层 Gemini / SynthID SynthID-Text(文本统计水印) → Layer B 改写博弈 SynthID 像素域 → CtrlRegen open-LLM 生态 Kirchenbauer 绿名单 / keyed-Gumbel → Layer B + 同 key 重放验证 (arbi-serve 自托管引擎场景)
Layer A 确定性 Layer B 统计博弈 文件层元数据
🔥 分发设计

Skill 是薄客户端,Hook 是确定性轨道

Agent 宿主(5+ 种) Claude Code · Cowork/claude.ai Cursor · Grok · 云会话 Skill(纯 Markdown) 指令驱动 · 模型自主决定调用 概率轨道(best-effort) PostToolUse Hook 挂 Write|Edit 每次落盘必跑 确定性轨道(check/clean 两模式) HTTP 服务(stdlib) /inspect /detect /clean /watermark + batch + OpenAPI 3.0.3 Bearer 鉴权 · 环回绑定默认 CLI 直用clean_file.py / inspect_file.py 外挂研究后端 MarkLLM(验证) CtrlRegen(像素再生) reverse-SynthID(评分) 全部 pinned + 运行时加载
主链路 确定性 Hook(不依赖模型配合) 概率/可选路径
核心机制

Layer A:肉眼不可见 ≠ 检测不到

类别代表码点说明
零宽字符U+200B/C/D · U+FEFF零宽空格/非连接符/连接符——最经典的隐形载体,插在词中完全不可见
软连字符U+00AD只在断行时显示的连字符,正文中隐形
双向控制U+202A-E · U+2066-9文本方向覆盖/隔离,既能藏标记也能做视觉欺骗攻击
变体选择符U+FE00-FE0Femoji 修饰位,16 个可用作信息编码
标签字符U+E0000-E007F可拼出完整 ASCII 密文(如隐藏 TRACK-ID),渲染完全不可见但机器可读——本项目可解码显示
异形空格U+00A0 · U+2000-A · U+3000上下文相关:法文排版合法使用,提供 --no-normalize-spaces 保留选项

工程细节见真章:文本工具拒绝二进制输入(防把 docx 当文本写坏)、未知格式拒绝自动清洗(exit 2 不写输出)、magic number + 控制字节比例双保险识别。

核心机制

Layer B:与统计水印的改写博弈

核心机制

图像域:像素级水印的再生清除

  • CtrlRegen 再生管线(ICLR 2025):ControlNet + DINOv2 条件再生,从干净噪声重建图像——水印埋在生成分布里,重生成即甩掉
  • 强度阶梯保守:0.15 最小 / 0.25 默认 / 0.35 平衡 / 0.5 激进 / 0.7 上限——强度越高去得越净但图像变形越多
  • 512×512 原生 + 自动瓦片:大图 512px 块 + 192px 重叠 + 余弦融合接缝,输出回原尺寸并色彩匹配
  • 验证闭环:reverse-SynthID 评分器(外挂)出 before/after 分数,官方 Google SynthID 检查仍是最终裁判
# 元数据 + 像素域一条龙
python3 clean_image.py shot.png \
  -o shot.cleaned.png \
  --remove-pixel ctrlregen

# 顺序:元数据剥离 →
#   CtrlRegen 像素再生 →
#   SynthID 前后评分(可选)
# ~10GB 模型下载 · GPU 推荐
# 依赖隔离在专用 venv,
# 不污染主服务镜像

另备 MarkDiffusion 的 DiffusionPurification(盲再生)作为对照引擎,默认更保守(0.3)。

研究深水区

stealer:黑盒水印窃取

大量良性 prompt 询问水印模型 → 统计上下文→token 提升比 → 估计 s*(token|context) → 清洗时降权「绿」token
工程质量

这份 README 的诚实度是范本级

适用场景

谁该用,谁离远点

适合
  • 付费生成内容的个人/团队,要求交付物不带厂商遥测(隐私立场)
  • 水印鲁棒性研究者:现成的清除基线 + 验证 harness + benchmark 协议
  • 出版/法务:检测内容里被恶意植入的隐藏字符(如供应链投毒的 tag 密文)——只跑 /inspect 不清除
  • AI 工程师学习 skill/hook 双轨架构与许可证合规分发
跳过
  • 想洗掉他人作品的溯源标记再冒充原创——法律与道德双重红线
  • 平台合规团队:你的对手正在用这类工具,但你不该用它
  • 期望「完美清除」:Layer B 改写有质量代价,像素再生有保真损失
  • 把 detect 的阴性当安全结论——项目自己说了那什么都不是
风险提示

需要警惕

潜力评估

评分:8.0 / 10 · tracking

工程质量
9.5
文档诚实度
9.5
增长势头
9.5
技术深度
8.5
伦理/法律风险
4.5
成熟度
5.5

作为软件:一个月内做到「研究级深度 + 范本级诚实文档 + 零依赖分发」,工程罕见。作为社会现象:它是水印军备竞赛的第一块公开阵地,无论存活与否都会被论文引用。跟踪它的正确姿势:当「攻方能力上限」的仪表盘看,而不是当日常工具囤。


上一个
YuE
下一个
Transformers
在线体验

Layer A 隐形字符检测器

粘贴任意文本,扫描藏在里面的零宽字符、双向控制符和标签密文——试着解码一段藏了 TRACK-ID 的污染样本,再一键清除。与真实项目 clean_text.py 同一套规则语义的浏览器版。

进入 Playground →
1 / 15