跳到主要内容
AI教程

使用 watermarks-remover 移除文本和文件中的 AI 来源标记

了解如何对您拥有的内容使用 watermarks-remover,涵盖本地与 Docker 部署、文本和文件清理、HTTP 请求、可选检测与改写、批处理、身份验证及高级图像工具。

使用 watermarks-remover 移除 AI 来源标记

什么是 watermarks-remover?

watermarks-remover 是一项 Python 服务和代理技能,用于检查并移除文本和文件中受支持的 AI 来源标记。它旨在帮助您对自己拥有的材料进行隐私保护和内容清理。

该项目将清理分为多个层级。A 层以确定性方式移除不可见 Unicode、特殊空格、双向字符、标签字符及相关文本伪影。B 层通过代理改写或可选的 rewrite_text.py 钩子处理基于统计令牌采样的水印。文件清理器负责处理受支持的元数据和文档属性,包括 C2PA、EXIF、XMP 和 Office 文档元数据。

请仅将该项目用于您拥有或获准修改的内容。检测和清理是相互独立的操作,部分可选检测器属于研究工具,并非权威的供应商验证系统。

主要功能

  • 基于标准库的核心:本地 HTTP 服务和核心脚本需要 Python 3.10 或更高版本,且没有必须安装的 Python 依赖项。
  • 广泛的文件路由支持:支持的格式包括文本、HTML、Markdown、PNG、JPEG、WebP、AVIF、HEIC、BMP、GIF、TIFF、SVG、PDF、DOCX、XLSX、PPTX、EPUB、ODT、MP4、MOV、M4A、M4V、WAV 和 MP3。
  • 统一命令:inspect_file.pyclean_file.py 可检测受支持的格式并选择合适的处理管线。
  • HTTP 集成:无需将 Python 实现直接纳入项目,即可使用检查、检测、清理和批处理端点。
  • 更安全的格式处理:文本工具会拒绝疑似二进制文件,而无法识别的格式会被归类为 unknown,不会被自动清理。
  • 可选检测:已配置的文本检测器和 SynthID 图像评分可独立运行,也可在清理前后运行。
  • 可选的高级后端:通过单独安装,该项目支持 MarkLLM 验证框架、反向 SynthID 评分以及 CtrlRegen 像素域图像处理。

安装并启动服务

1. 克隆仓库

git clone https://github.com/guillaumemeyer/watermarks-remover.git
cd watermarks-remover

2. 启动基于标准库的 HTTP 服务器

最快的部署方式是使用本地 Python 服务。默认情况下,它监听本机回环地址:

make serve

您也可以直接启动它:

python3 service/scripts/server.py --host 127.0.0.1 --port 8765

验证服务是否可用:

curl -s http://127.0.0.1:8765/health

响应中包含 ok: true 和服务版本。使用 GET /capabilities 可查看哪些可选工具和后端可用,使用 GET /openapi.json 可获取生成的 OpenAPI 3.0.3 规范。

3. 安装可选的代理技能

代理技能本身不包含服务实现。它只是调用 HTTP 服务器的轻量客户端,因此请先启动服务,再使用该技能。

mkdir -p .grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks

对于用户全局 Grok 安装,请在主目录下创建链接:

mkdir -p ~/.grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks

使用 /remove-ai-marks 调用它,或要求代理移除受支持的 AI 水印或来源元数据。如果服务不在 http://127.0.0.1:8765,请设置 WATERMARKS_SERVICE_URL

4. 安装可选的 Cursor 纯文本技能

该仓库还包含一个独立的 Cursor 技能,可用于获准处理的稿件、文档和网页文案。它不包含文件元数据、图像、C2PA、HTTP 服务和外部模型工具。

python3 install_skill.py

在 Windows 上,请使用 py install_skill.py。除非提供 --force,否则会保留现有安装。

通过命令行检查和清理文件

使用统一文件工具

为脚本目录设置一个简短变量,然后检查或清理受支持的文件:

SCRIPTS=service/scripts

python3 "$SCRIPTS/inspect_file.py" draft.md
python3 "$SCRIPTS/clean_file.py" draft.md -o draft.cleaned.md
python3 "$SCRIPTS/clean_file.py" photo.png -o photo.cleaned.png
python3 "$SCRIPTS/clean_file.py" notes.docx -o notes.cleaned.docx

inspect_file.py 会报告检测到的类型和可疑内容,但不会修改输入文件。clean_file.py 会将文件路由到适当的清理器,并把结果写入通过 -o 指定的路径。

清理 A 层文本伪影

对于已知的文本文件,请使用专用文本命令:

python3 "$SCRIPTS/inspect_text.py" draft.md
python3 "$SCRIPTS/clean_text.py" draft.md -o draft.cleaned.md --stats

--stats 选项会报告确定性文本清理所做的更改。

避免将二进制文件传递给文本工具

文本脚本会拒绝看起来属于 ZIP 容器、PDF、图像或其他二进制数据的文件。这可以防止压缩字节被解码并作为损坏的文本写回。

python3 "$SCRIPTS/inspect_text.py" report.docx

对于此类文件,请使用 inspect_file.pyclean_file.py。尽管 --force-text 可以绕过此保护,但仅应在您确实希望扫描原始字节时使用。

同样,统一清理器会拒绝被归类为 unknown 的文件。适用时请提供可识别的文件扩展名,或者通过 --as text--force-text 明确选择按文本处理。

使用 B 层改写钩子

统计文本水印需要通过改写处理,而不是清理 Unicode。默认情况下,改写脚本只会输出提示词,不会调用模型:

python3 "$SCRIPTS/rewrite_text.py" draft.md \
  --backend print-prompt \
  --strength paraphrase

可选的本地 Ollama 后端可以生成改写后的输出:

WATERMARKS_REWRITE_BACKEND=ollama \
WATERMARKS_REWRITE_MODEL=llama3.2 \
python3 "$SCRIPTS/rewrite_text.py" draft.md -o draft.rewritten.md

默认允许使用回环端点。远程模型端点需要设置 WATERMARKS_REWRITE_ALLOW_REMOTE=1 或使用 --allow-remote。API 凭据必须通过 WATERMARKS_REWRITE_API_KEY 提供,绝不能作为命令行参数传入。

调用 HTTP API

清理单个文件

该 API 接受经过 Base64 编码的文件字节,并使用所提供的文件名辅助格式路由:

WM="http://127.0.0.1:8765"
curl -s -X POST "$WM/clean" \
  -H 'Content-Type: application/json' \
  -d "{\"file\": \"$(base64 < notes.md | tr -d '\n')\", \"name\": \"notes.md\"}"

成功的响应包含检测到的 kind、经过 Base64 编码的 cleaned 文件以及清理 report

仅检查或检测,不执行清理

使用 POST /inspect 进行结构检查,使用 POST /detect 调用已配置的水印检测器。检测需要主动启用,并且与清理相互独立;除非明确请求并完成配置,否则服务不会调用供应商或外部检测器 API。

curl -s -X POST "$WM/inspect" \
  -H 'Content-Type: application/json' \
  -d "{\"file\": \"$(base64 < notes.md | tr -d '\n')\", \"name\": \"notes.md\", \"detect\": true}"

如需进行清理前后的测量,请在清理选项中传入 detect_beforedetect_after

{"file":"BASE64_DATA","name":"notes.md","options":{"detect_before":true,"detect_after":true}}

检测器故障采用软失败机制。如果检测器不可用、超时或返回错误,报告会记录 available: false,同时继续执行清理。

批量处理

POST /inspect/batchPOST /clean/batch 使用相同的逐文件处理管线处理多个条目。默认请求上限为 50 个文件,可通过 WATERMARKS_MAX_BATCH_FILES 更改。

{"files":[
  {"file":"BASE64_DATA_1","name":"notes.md"},
  {"file":"BASE64_DATA_2","name":"photo.png","options":{}}
]}

格式错误的批处理条目会收到 ok: false 和错误消息,但不会中止其余条目的处理。

使用 Docker 运行项目

已发布的核心镜像包含服务、清理器、ExifTool、qpdf 和 c2patool。构建本地核心镜像,并仅通过回环地址公开服务:

make docker-core-build
docker run --rm \
  -p 127.0.0.1:8765:8765 \
  --read-only \
  --tmpfs /tmp \
  watermarks-remover

您也可以直接在容器内运行清理器:

docker run --rm -v "$(pwd):/data" watermarks-remover \
  /app/scripts/clean_file.py /data/notes.md \
  -o /data/notes.cleaned.md

默认情况下,Docker Compose 仅启动核心服务。可选 profile 可以添加研究框架或重量级图像后端:

docker compose up -d
docker compose --profile harness up -d
docker compose --profile heavy up -d
docker compose --profile harness --profile heavy up -d

使用 make compose-check 验证正在运行的服务栈。它会检查核心健康端点,并验证已启用的可选服务能否运行其帮助命令。

配置与安全

普通文本清理不需要任何环境变量。可将可选设置复制到仓库级 .env 文件中,Docker Compose 会自动加载该文件:

cp .env.example .env
docker compose up -d

该文件已被 gitignore 忽略,绝不应提交到仓库。重要设置包括:

  • WATERMARKS_SERVER_API_KEY 要求 HTTP API 使用 Bearer 身份验证。
  • WATERMARKS_SERVICE_URL 告知客户端服务的访问地址。
  • WATERMARKS_REWRITE_BACKENDWATERMARKS_REWRITE_MODEL 及相关变量用于配置 B 层模型的直接调用。
  • WATERMARKS_SYNTHID_SCORER_URL 将核心服务连接到可选的 SynthID 图像评分 sidecar。
  • HF_TOKEN 以仅环境变量的方式向使用受限模型的可选后端提供 Hugging Face 令牌。

服务器默认绑定到回环地址,适合在受信任网络中使用。如果您更改 --host,使其可从本机以外访问,请配置 WATERMARKS_SERVER_API_KEY 并添加适当的网络保护措施。

高级技巧

为主机端运行安装可选元数据工具

核心 Python 脚本使用标准库,但外部工具可以改善特定工作流程。c2patool 用于检查 C2PA 清单,exiftool 用于移除残留元数据,尤其是 PDF 中的元数据,而真正执行 PDF 结构剥离则需要 qpdf。核心 Docker 镜像已包含这些工具。

为 SynthID 类图像信号评分

可选的反向 SynthID 集成可以生成像素域置信度评分。它仅用于检测,不会移除像素水印。由于其上游代码采用非商业研究许可证,因此未捆绑在项目中。

SCRIPTS=service/scripts
"$SCRIPTS/setup_synthid.sh"

REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python \
"$SCRIPTS/inspect_image.py" shot.png

重量级 Compose profile 可以将该评分器作为 HTTP sidecar 运行。配置 WATERMARKS_SYNTHID_SCORER_URL 和共享的 WATERMARKS_SYNTHID_SCORER_API_KEY,然后请求在清理前后进行检测。

使用 CtrlRegen 进行像素域处理

CtrlRegen 是一个可选的外部后端,用于处理 SynthID 类、StegaStamp、Tree-Ring 和 StableSignature 像素域标记。由于其上游仓库没有许可证文件,因此该后端未被捆绑或发布。其安装流程会使用固定版本的研究时期依赖项创建隔离环境。

SCRIPTS=service/scripts
"$SCRIPTS/setup_ctrlregen.sh"

NOAI_WATERMARK_DIR=~/noai-watermark \
~/noai-watermark/.venv/bin/python \
"$SCRIPTS/clean_image.py" shot.png \
-o shot.cleaned.png --remove-pixel ctrlregen

默认强度为较保守的 0.25。文档中的预设范围从用于最小程度再生成的 0.15 到用于最大强度的 0.7。更高的值可以移除更多信号,但也会重新生成更多图像内容。

CtrlRegen 原生处理 512 × 512 像素的图像。较大的输入会自动分块,因此处理时间和内存使用量会随分块数量增加。强烈建议使用 GPU,预计需要下载约 10 GB 的模型;在可行的情况下,应先缩小超大图像。

使用 MarkLLM 验证受控文本实验

可选的 MarkLLM 框架可以使用匹配的 KGW 或 SynthID 方案配置生成并重新检测测试文本。它适用于受控实验,但并非供应商判定工具,也无法证明供应商检测器一定会拒绝改写后的文本。

SCRIPTS=service/scripts
"$SCRIPTS/setup_markllm.sh"

为了获得有意义的结果,请在生成和检测时使用相同的方案配置和密钥。

总结

watermarks-remover 为清理授权内容中受支持的来源信息载体提供了一套谨慎且可感知格式的工作流程。请从统一检查命令开始,尽可能使用确定性的 A 层清理,仅在必要时添加 B 层改写,并有选择地启用外部检测器或像素处理后端。对于应用程序集成,本地 HTTP API 和生成的 OpenAPI 规范提供了最灵活的接口。