ShadowAqueduct/watermark-remover:多厂商AI水印清除利器,从Unicode到C2PA的全栈净化
> 一个用于清除多厂商AI生成内容水印(Unicode、C2PA、元数据)的Python开源工具库。
## 背景:AI水印的“猫鼠游戏”与真实痛点
随着ChatGPT、Claude、Gemini、Midjourney等AI生成工具的普及,厂商为了保护版权、追踪内容来源,开始在输出中嵌入各种形式的“水印”。这些水印并非传统图片上的可见logo,而是隐藏在文本字符、文件元数据、图像像素甚至C2PA(Coalition for Content Provenance and Authenticity)标准中的数字指纹。
对于普通用户来说,这些水印带来几个实际困扰:
1. **文本水印破坏排版与语义**:某些AI模型会在输出中插入零宽字符(Zero-Width Characters)或同形异义字(Homoglyphs),这些字符肉眼不可见,但在复制粘贴、文本处理或发布到某些CMS时会导致格式错乱、搜索索引异常,甚至被内容安全系统误判。
2. **C2PA元数据泄露来源**:很多AI工具(如OpenAI的DALL·E 3、Adobe Firefly)会在生成的图片中嵌入C2PA签名,记录“由AI生成”及模型版本、时间戳等信息。如果用户希望匿名发布或二次创作,这些信息会成为隐私隐患。
3. **文件级元数据残留**:PNG、JPEG、SVG、PDF、DOCX等文件格式中,AI工具会写入自定义的元数据字段(如`prompt`、`model`、`seed`),这些字段可能包含用户输入的关键词,造成敏感信息泄露。
**ShadowAqueduct/watermark-remover**正是针对上述痛点,提供了一套统一的、可扩展的Python接口,帮助开发者或高级用户批量清除这些水印,同时保留文件的核心内容与可用性。
## 项目核心功能与技术架构
### 1. 多类型水印清除管线
项目采用**模块化管线**设计,每个水印类型对应一个独立的处理模块,通过统一的`PurgeResult`返回处理状态。核心模块包括:
- **Unicode文本净化**:检测并移除零宽空格(`\u200B`)、零宽非连接符(`\u200C`)、零宽连接符(`\u200D`)、零宽断行符(`\uFEFF`)等。同时支持同形异义字替换(例如将Cyrillic字母'а'替换为Latin 'a'),需配合`--unicode-normalize`选项。
- **统计重写钩子(Statistical Rewrite Hooks)**:这是项目的一大特色。对于无法通过字符映射清除的文本水印(如基于词频或句法特征的隐式水印),项目提供了一套基于统计的改写接口。用户可以注入自定义的改写函数(例如同义词替换、句式变换),通过`--rewrite-hook`参数指定Python模块路径。
- **C2PA清除**:解析PNG、JPEG文件的C2PA chunk(`CAI`、`C2PA`等),移除整个manifest块,并重写文件头以保持格式合法。
- **元数据清理**:针对不同格式提供专用清理逻辑:
- PNG:删除`tEXt`、`zTXt`、`iTXt`中的AI相关键(如`prompt`、`parameters`)。
- JPEG:删除EXIF、XMP中的特定标签。
- SVG:移除`<metadata>`元素及`data-*`属性。
- PDF:通过`pikepdf`重写对象流,剔除`/Metadata`引用。
- DOCX:删除`docProps/core.xml`和`docProps/app.xml`中的自定义属性。
- HTML:移除`<meta name="generator">`及`data-*`属性。
- Markdown:清除YAML front-matter中的AI字段。
### 2. 命令行与Python API双接口
项目提供两种使用方式,满足不同场景需求。
#### 命令行安装与使用
bash
# 安装(推荐使用虚拟环境)
pip install watermark-remover
# 清除单个文件的所有水印
watermark-remover purge image.png
# 递归处理目录下所有文件
watermark-remover purge ./docs/ --recursive
# 仅清除文本中的Unicode水印,不处理文件元数据
watermark-remover purge text.txt --unicode-only
# 使用自定义统计改写钩子
watermark-remover purge article.md --rewrite-hook my_rewriter.py
# 输出JSON格式的详细报告
watermark-remover purge image.png --report-json
#### Python API 示例
python
from watermark_remover import WatermarkRemover, PurgeOptions
# 初始化清理器
remover = WatermarkRemover()
# 定义选项
options = PurgeOptions(
unicode_normalize=True,
remove_c2pa=True,
metadata_fields=["prompt", "seed", "model"],
rewrite_hook="my_rewriter" # 可选,指定模块路径
)
# 执行清理
result = remover.purge("generated_image.png", options)
# 检查结果
print(result.success) # True
print(result.removed_watermarks) # ['c2pa', 'png_textual_metadata']
print(result.rewritten_text) # 如果应用了文本改写,这里返回新文本
# 处理内存中的文本
cleaned_text = remover.purge_text("Hello\u200BWorld")
assert cleaned_text == "HelloWorld"
### 3. 核心亮点
- **多厂商覆盖**:内置针对OpenAI、Anthropic、Google、Midjourney、Stability AI等主流厂商水印的特征库,并允许用户通过JSON规则文件扩展。
- **无损处理优先**:对于图片和PDF,项目尽可能保留原始像素和排版,仅删除水印相关数据块,避免重新编码导致的质量损失。
- **可审计性**:每次清理操作都会生成详细的`PurgeResult`,记录移除的水印类型、位置、字节数,方便用户验证。
- **性能优化**:使用`lxml`处理XML(SVG/HTML),`pikepdf`处理PDF,`Pillow`处理图片,均为C扩展,处理速度远超纯Python实现。
- **安全设计**:默认不修改原始文件,而是生成`_cleaned`后缀的新文件,避免误操作。
## 适用场景
1. **内容创作者与博主**:从AI工具生成文章后,需要去除隐藏的Unicode字符,确保在WordPress、Medium等平台正常排版。
2. **数据科学家与NLP研究者**:清洗从AI模型采集的文本语料,去除零宽字符干扰,保证模型训练数据的纯净性。
3. **匿名发布者**:对AI生成的图片进行C2PA剥离,防止通过元数据追踪到作者身份。
4. **企业内容安全团队**:在将AI输出集成到内部知识库前,批量清除元数据,防止提示词泄露。
5. **文档管理系统管理员**:批量清理上传的DOCX/PDF文件,确保合规性。
## 与同类项目的对比
| 特性 | watermark-remover | exiftool | c2pa-toolkit | text-unidecode |
|------|-------------------|----------|--------------|----------------|
| 支持Unicode零宽字符清除 | ✅ 原生支持 | ❌ | ❌ | ✅ 仅字符映射 |
| 支持C2PA清除 | ✅ 自动检测并移除 | ❌ | ✅ 但仅限C2PA | ❌ |
| 支持PDF元数据重写 | ✅ 通过pikepdf | ✅ 有限支持 | ❌ | ❌ |
| 支持统计改写钩子 | ✅ 插件机制 | ❌ | ❌ | ❌ |
| 批量处理目录 | ✅ 递归 | ✅ | ❌ | ✅ 文本文件 |
| 输出审计报告 | ✅ JSON/文本 | ✅ 文本 | ✅ 部分 | ❌ |
| 多厂商特征库 | ✅ 内置+可扩展 | ❌ | ❌ | ❌ |
**exiftool**是元数据处理的瑞士军刀,但它不处理Unicode文本水印,也不理解C2PA的语义结构。**c2pa-toolkit**是官方C2PA参考实现,功能强大但仅限C2PA格式,且依赖Rust环境。**text-unidecode**仅做字符转写,无法处理零宽字符和统计水印。
**watermark-remover**的独特优势在于:**统一处理文本、图片、文档三类载体**,且提供**可扩展的改写钩子**,这是其他工具无法比拟的。
## 局限性与注意事项
- **统计改写钩子需要自定义**:内置的改写逻辑仅提供基础的同义词替换模板,针对特定模型(如GPT-4的隐式水印)需要用户自行训练或编写规则。
- **C2PA清除可能违反服务条款**:某些AI厂商明确禁止移除水印,请务必遵守当地法律和平台协议。
- **对图像像素级水印无效**:如果AI在图片像素中嵌入隐式水印(如通过傅里叶变换),本工具无法检测或清除,需依赖专用算法。
- **PDF重写可能导致格式微调**:使用pikepdf重写对象流时,极少数复杂PDF可能出现字体或布局细微变化。
## 项目活跃度与社区
项目在GitHub上已获得829颗星,Python实现,依赖较少(Pillow、pikepdf、lxml),安装简单。目前维护活跃,Issue响应较快。适合有Python基础的中高级开发者使用,也适合作为安全研究或内容治理的工具链组件。
## 总结
ShadowAqueduct/watermark-remover并非一个“破解AI版权保护”的灰色工具,而是一个**内容治理与隐私保护**的实用库。它解决了AI生成内容在真实世界落地时的格式污染、元数据泄露和溯源追踪问题。对于需要批量处理AI输出的开发者、内容平台运营者以及注重隐私的个人用户,这是一个值得纳入工具箱的高效解决方案。
**项目地址**:https://github.com/ShadowAqueduct/watermark-remover