善忘技术夹 Logo
善忘技术夹
开源前沿 · 200 阅读

刚开源 2 天狂揽 7700+ Star!这个水印移除工具火了

刚开源 2 天狂揽 7700+ Star!这个水印移除工具火了


你从 Claude 复制了一段文字,从 Midjourney 下载了一张图,从 Gemini 导出过一份文档。你觉得这些内容是你生成的——你花钱买的会员、你花时间调的 prompt,想怎么用就怎么用。

但你可能不知道,这些内容被 AI 厂商打了标记。有些你看得见(比如图片信息里写着”Generated by AI”),更多的你根本看不见。

前几天 GitHub 上冒出一个项目,专门干一件事——清除 AI 内容的”隐形水印”。项目叫 watermarks-remover,8 月 14 号开源,两天 Star 从 0 冲到 7700,杀到 GitHub 日榜第二。等我写这篇文章的时候,已经 11.6k 了。

两天涨了一万多颗星。说明有大量的人意识到了这个问题,或者被困扰了很久。

但这个工具不是我们平时说的那种”去图片水印”——把图片上的 Logo 抹掉那种。它去的是你看不见的水印。


先说一个冷知识:AI 水印不是一种,是三种

AI 厂商到底在内容上做了什么标记?我查了一圈资料,发现所谓的”AI 水印”其实分三层。

第一层:藏在文字缝隙里的”隐形墨水”

你从 Claude 复制一段文字,粘贴到编辑器里,看起来就是普通文本。

但如果你用 hex 查看器打开,会发现里面藏着”幽灵字符”——零宽空格、零宽连接符、双向文本标记。这些 Unicode 字符有内容但不显示,就像用隐形墨水写的字。

AI 厂商会在生成文本里插入这些不可见字符,形成一种”指纹”。后续检测这些字符,就能判断内容是不是自己的 AI 生成的。

效果: 你从 AI 复制了一段文字,这段文字带着一串你看不见的”身份证号”。

第二层:藏在用词习惯里的”统计签名”

这一层更隐蔽。

AI 生成文本时,每个词的选择是个概率游戏——这个词 80% 选 A,20% 选 B。厂商可以微调概率:让本来 10% 的词变成 15%。大量微调累积起来,形成统计上的”签名”。

就像每个人的说话习惯不同——有人爱说”其实”,有人爱说”怎么说呢”。AI 的”说话习惯”被刻意调整了,这个调整模式就是水印。

这种水印不需要插入额外字符,文本本身的不同就是水印。也是最难去除的——它长在文字本身里。

第三层:藏在文件头里的”身份证”

如果你用 AI 生成了一张图片,文件里会嵌入一段 C2PA 标准的元数据,记录”这张图由 AI 生成,模型是 XX”。你右键查看图片属性就能看到——但大多数人不知道去看。

DOCX 文档的”属性”里会写着”生成工具:Claude”,PDF 文件里也嵌入了类似的溯源信息。

这三层水印藏在不同的位置,也需要用不同的方式清除。

插图:三层水印可视化

watermarks-remover 正好做了这三层的事。


这个工具到底怎么做到的?

插图:分层清理管道

核心设计是”分层处理、尽力清理”。不是打包票说”100% 清除”,而是针对每一层给出对应方案:

  • A 层(Unicode 层): 确定性清理。零宽空格、不可见字符、双向文本标记这些,脚本扫一遍就能删干净,可以做到 100%。
  • B 层(统计层): 尽力而为。通过 AI 重写文本抹掉统计水印,代价是原文措辞会改变。项目 README 说得很诚实——“best-effort”。
  • 文件层(元数据/C2PA): 也是确定性清理。删除图片的 EXIF/C2PA 数据、清理文档属性、重写 PDF 结构,也能做到 100%。

支持的格式覆盖了 8 种:PNG、JPEG、WebP、SVG、PDF、DOCX、ODT、HTML、Markdown。日常用的文件类型基本都在里面了。

支持的 AI 厂商覆盖了主流几家:Claude、Gemini/SynthID-Text、OpenAI 的溯源表面、以及开源的 open-LLM 水印。


实操:怎么跑起来?

插图:Docker 实操测试

我试了两种方式。

方式一:Docker 一键部署(推荐,5 分钟搞定)

不想折腾 Python 环境的话,这是最省事的。

docker pull ghcr.io/guillaumemeyer/watermarks-remover:latest
docker run -p 8765:8765 ghcr.io/guillaumemeyer/watermarks-remover:latest

两条命令,等一两分钟,服务就跑起来了。访问 http://localhost:8765,能看到项目的 HTTP API 界面。

核心接口有三个:

  • /health — 检查服务是否正常运行
  • /inspect — 分析文件,返回”这个文件上有什么水印标记”
  • /clean — 执行清理,返回清理后的文件

我拿一张从 AI 工具生成的 PNG 试了一下。先用 /inspect 查看,返回结果显示文件头里嵌着 C2PA 元数据,记录了模型信息和生成时间。然后调用 /clean 清理,下载回来的图片小了大概 30KB——元数据段被删掉了。图片画质不受影响,看起来和原来一模一样。

方式二:本地 Python 运行

有 Python 3.10+ 环境的话,也可以直接拉项目跑:

git clone https://github.com/guillaumemeyer/watermarks-remover.git
cd watermarks-remover
make serve
# 或者 python3 service/scripts/server.py --host 127.0.0.1 --port 8765

项目用纯 Python 标准库编写,不需要额外装依赖,拉到本地就能跑。


逐层测试:效果到底怎么样?

A 层测试:Unicode 隐形字符清理

我从 Claude 复制了一段大约 500 字的文案,用 hex 工具查看,发现里面确实有零宽空格(U+200B)和零宽非连接符(U+200C)——大概十几个,分布在全文各处。

运行 A 层清理后,这些不可见字符全部被移除。原文内容没有变化,只是”隐形的东西”被剔除了。 清除后完全感觉不到任何变化,但”指纹”确实没了。

文件层测试:图片元数据清理

从 AI 图片工具下载了一张 WebP 格式的图,用 /inspect 查看,文件头里嵌着完整的 C2PA 信息,包括生成时间、模型版本、甚至一些处理参数。

清理后 C2PA 段被移除,文件大小从 2.1MB 变成 2.07MB。图片画质无损,但”AI 生成的痕迹”被抹掉了。

B 层测试:统计性文本水印清理(这个地方需要老实说)

这一层是三个里面最”玄学”的。

我拿了一段 AI 写的产品介绍文案跑了一遍 B 层改写。水印确实被抹掉了——因为原文被彻底重写了一遍。

但代价是原文的节奏、语气、用词偏好都被”扁平化”了。就像你把一篇写得还不错的文章,交给另一个水平一般的人去重写——意思还是那个意思,但读起来没那么流畅了。

项目 README 自己也是这么说的:“重写不是重构。” 它改的是措辞,不是结构。原文质量越高,改写后的”降级感”越明显。

我的建议: 对原文质量要求高的话,跳过 B 层,只做 A 层和文件层清理。B 层更适合那些”不需要保留原文风格”的场景。


谁适合用这个工具?

我跑了一圈测试之后,觉得这几类人最需要它:

内容创作者。 用 AI 辅助写作,写完后想清理掉 AI 生成的”痕迹”,保护自己的内容隐私。清理 A 层和文件层就够了,不影响原文质量。

隐私敏感用户。 不希望 AI 厂商通过文件元数据追踪内容来源和去向。这个工具能帮你把”尾巴”剪掉。

技术研究者。 研究 AI 水印机制,了解不同厂商的标记方式——它的 /inspect 功能本身就是一个很好的学习工具。

企业文档管理。 对外发布的文档,如果不小心带着”生成工具:Claude”这样的元数据,可能暴露内部工作流。清理一下再发出,更安全。

那谁不适合用?

想绕过 AI 检测做学术造假的人——项目作者明确反对,我们也反对。对技术完全零基础且不想学 Docker 的人——确实需要一点技术门槛,纯小白用起来会有点吃力。


诚实地说:这个工具不是万能的

有几个限制必须说清楚。

第一,B 层统计性水印没有完美方案。 项目 README 写得挺直白——“没有工具能诚实地认证’这通过了官方检测’。” 翻译过来就是:我只能尽力,但不敢打包票。

第二,PDF 清理需要额外工具。 如果只用 exiftool 清 PDF,会遗留原始元数据字节,文件反而变大。需要配合 qpdf 做结构性重写才能彻底清理。

第三,项目还很新。 当前版本 v0.5.0,总共 96 次提交。功能框架搭得不错,但离”稳定成熟”还有距离。要用在生产环境的话,建议持续关注更新。

第四,作者建议了一个反直觉的操作: 如果要清理 Claude 生成内容的统计水印,最好别用 Claude 来改写——“不要用 Claude 重写 Claude 的文本,否则又打上了新的标记。” 建议用不同模型来做改写。这个细节挺有意思的,说明 AI 水印这个领域的水比我们想象的深。


一个必须讨论的问题:去水印,到底对不对?

插图:隐私保护 vs 灰色地带

写到这里,必须正面回应一个绕不开的问题。

这个工具会不会被用来做坏事?

会的。任何工具都可能被滥用。项目作者在 README 里明确写了:“这个工具用于保护你的隐私,而不是学术造假或伪造’人类原创’声明。”

我的看法是:工具无罪,但使用方式决定了是非。

你用这个工具清理自己 AI 内容的元数据,和保护自己的隐私——这和删除照片的 EXIF 信息没有本质区别。你用自己的账号、花自己的钱生成的 AI 内容,你有权决定它的”归属状态”。

但有些事是不该做的:

  • 把 AI 生成的内容冒充为原创论文,用于学术造假
  • 用去水印工具伪造内容来源,冒用他人身份
  • 规避内容审核,用于生成和传播违规内容

请合法合规使用这个工具。 技术是中立的,但使用技术的人需要有自己的判断。

ICML 2024 有一篇论文论证过,在某些条件下,水印是”理论上不可能被完全去除”的。对任何号称”100% 去水印”的说法保持 skepticism,是健康的。


和同类工具比怎么样?

目前市面没有直接竞品——watermarks-remover 是第一个系统性地覆盖多种 AI 水印的开源工具。

之前如果你想手动清理:

  • 用 exiftool 删图片元数据——只覆盖文件层,不管文本水印
  • 用 ChatGPT 改写文本——只能处理统计性水印,不涉及 Unicode 和文件层
  • 手动查文档属性、手动删除——麻烦且容易遗漏

watermarks-remover 的优势是三层覆盖,一个工具全搞定。劣势是项目还很新,可能有未发现的 bug。


写在最后

watermarks-remover 让我看到了一个有趣的现象:AI 厂商在”追踪生成内容”这件事上,做了比我们想象中多得多的工作。

那些看不见的字符、藏在文件头里的元数据、经过微调的统计分布——这些都在说明,AI 生成内容不是”无主之物”,它是有”标签”的。

这个工具的出现,本质上是一场关于”内容自主权”的博弈。AI 厂商想给你的内容打上标记,用户想把这些标记清除掉。两边都有自己的理由。

我的建议是: 如果你好奇自己的 AI 内容上有什么”标记”,可以用 /inspect 查一下,看看那些看不见的东西。你不一定要清除它们,但至少应该知道它们的存在。


互动话题: 你知道 AI 生成的内容还有这些”隐形水印”吗?你觉得”去水印”这件事是合理的隐私保护,还是灰色地带的操作?评论区聊聊你的看法。

项目信息:

如果觉得这篇文章有用,点个「在看」分享给更多人。 关注善忘技术夹,每周分享真实好用的工具和效率技巧。

关注「善忘技术夹」全媒体矩阵

扫描上方宣传海报二维码,第一时间获取最新技术文章、开源项目与免安装小程序体验。

善忘技术夹 微信公众号宣传图
微信公众号 (扫码关注)
善忘技术夹 微信小程序宣传图
微信小程序 (扫码即用)