
watermarks-remover là gì?
watermarks-remover là một dịch vụ Python và kỹ năng tác nhân dùng để kiểm tra, xóa các dấu vết nguồn gốc AI được hỗ trợ khỏi văn bản và tệp. Công cụ này phục vụ quyền riêng tư và việc làm sạch nội dung trên các tài liệu thuộc sở hữu của bạn.
Dự án phân chia quá trình làm sạch thành nhiều lớp. Lớp A loại bỏ theo cách xác định các ký tự Unicode vô hình, khoảng trắng đặc biệt, ký tự hai chiều, ký tự thẻ và những thành phần văn bản tương tự. Lớp B xử lý watermark lấy mẫu token theo thống kê thông qua tác nhân viết lại hoặc hook rewrite_text.py tùy chọn. Các trình làm sạch tệp xử lý siêu dữ liệu và thuộc tính tài liệu được hỗ trợ, bao gồm C2PA, EXIF, XMP và siêu dữ liệu tài liệu Office.
Chỉ sử dụng dự án này trên nội dung thuộc sở hữu của bạn hoặc nội dung bạn được phép chỉnh sửa. Phát hiện và làm sạch là hai thao tác riêng biệt; một số trình phát hiện tùy chọn là công cụ nghiên cứu chứ không phải hệ thống xác minh chính thức của nhà cung cấp.
Tính năng chính
- Cốt lõi dùng thư viện chuẩn: dịch vụ HTTP cục bộ và các tập lệnh cốt lõi yêu cầu Python 3.10 trở lên, không bắt buộc có dependency Python nào.
- Định tuyến tệp đa dạng: các định dạng được hỗ trợ gồm văn bản, HTML, Markdown, PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF, SVG, PDF, DOCX, XLSX, PPTX, EPUB, ODT, MP4, MOV, M4A, M4V, WAV và MP3.
- Lệnh thống nhất:
inspect_file.pyvàclean_file.pyphát hiện các định dạng được hỗ trợ và chọn pipeline phù hợp. - Tích hợp HTTP: các endpoint kiểm tra, phát hiện, làm sạch và xử lý hàng loạt có sẵn mà không cần đóng gói kèm phần triển khai Python.
- Xử lý định dạng an toàn hơn: công cụ văn bản từ chối các tệp có khả năng là tệp nhị phân, trong khi các định dạng không được nhận diện được phân loại là
unknownvà không tự động được làm sạch. - Phát hiện tùy chọn: các trình phát hiện văn bản đã cấu hình và tính điểm ảnh SynthID có thể chạy độc lập hoặc trước và sau khi làm sạch.
- Backend nâng cao tùy chọn: dự án hỗ trợ bộ kiểm tra MarkLLM, tính điểm reverse-SynthID và xử lý ảnh trong miền pixel bằng CtrlRegen thông qua các cài đặt riêng biệt.
Cài đặt và khởi động dịch vụ
1. Clone repository
git clone https://github.com/guillaumemeyer/watermarks-remover.git
cd watermarks-remover
2. Khởi động máy chủ HTTP dùng thư viện chuẩn
Thiết lập nhanh nhất là sử dụng dịch vụ Python cục bộ. Theo mặc định, dịch vụ lắng nghe trên loopback:
make serve
Bạn cũng có thể khởi chạy trực tiếp:
python3 service/scripts/server.py --host 127.0.0.1 --port 8765
Xác minh dịch vụ đang khả dụng:
curl -s http://127.0.0.1:8765/health
Phản hồi chứa ok: true và phiên bản dịch vụ. Sử dụng GET /capabilities để xem các công cụ và backend tùy chọn nào khả dụng, hoặc GET /openapi.json để xem đặc tả OpenAPI 3.0.3 được tạo tự động.
3. Cài đặt kỹ năng tác nhân tùy chọn
Kỹ năng tác nhân không chứa phần triển khai dịch vụ. Đây là một client mỏng gọi đến máy chủ HTTP, vì vậy hãy khởi động dịch vụ trước khi sử dụng kỹ năng.
mkdir -p .grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks
Để cài đặt Grok cho toàn bộ người dùng, hãy tạo liên kết trong thư mục home của bạn:
mkdir -p ~/.grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks
Gọi bằng /remove-ai-marks, hoặc yêu cầu tác nhân xóa các watermark AI hay siêu dữ liệu nguồn gốc được hỗ trợ. Nếu dịch vụ không chạy tại http://127.0.0.1:8765, hãy đặt WATERMARKS_SERVICE_URL.
4. Cài đặt kỹ năng Cursor chỉ dành cho văn bản
Repository cũng bao gồm một kỹ năng Cursor độc lập dành cho bản thảo, tài liệu và nội dung web được phép chỉnh sửa. Kỹ năng này không xử lý siêu dữ liệu tệp, hình ảnh, C2PA, dịch vụ HTTP hay công cụ dùng mô hình bên ngoài.
python3 install_skill.py
Trên Windows, sử dụng py install_skill.py. Các bản cài đặt hiện có được giữ nguyên trừ khi cung cấp --force.
Kiểm tra và làm sạch tệp từ dòng lệnh
Sử dụng các công cụ tệp thống nhất
Đặt một biến ngắn cho thư mục tập lệnh, sau đó kiểm tra hoặc làm sạch các tệp được hỗ trợ:
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 báo cáo loại đã phát hiện và nội dung đáng ngờ mà không sửa đổi dữ liệu đầu vào. clean_file.py chuyển tệp đến trình làm sạch phù hợp và ghi kết quả vào đường dẫn được cung cấp sau -o.
Làm sạch thành phần văn bản của Lớp A
Đối với các tệp văn bản đã biết, hãy sử dụng các lệnh văn bản chuyên dụng:
python3 "$SCRIPTS/inspect_text.py" draft.md
python3 "$SCRIPTS/clean_text.py" draft.md -o draft.cleaned.md --stats
Tùy chọn --stats báo cáo những thay đổi do quá trình làm sạch văn bản xác định thực hiện.
Không truyền tệp nhị phân cho công cụ văn bản
Các tập lệnh văn bản từ chối những tệp có vẻ là container ZIP, PDF, hình ảnh hoặc dữ liệu nhị phân khác. Điều này ngăn các byte nén bị giải mã rồi ghi lại dưới dạng văn bản đã hỏng.
python3 "$SCRIPTS/inspect_text.py" report.docx
Hãy sử dụng inspect_file.py hoặc clean_file.py cho các tệp như vậy. Mặc dù --force-text có thể bỏ qua cơ chế bảo vệ, bạn chỉ nên dùng tùy chọn này khi cố ý muốn quét các byte thô.
Tương tự, trình làm sạch hợp nhất sẽ từ chối các tệp được phân loại là unknown. Khi phù hợp, hãy cung cấp phần mở rộng tệp được nhận dạng hoặc chủ động chọn xử lý dưới dạng văn bản bằng --as text hoặc --force-text.
Sử dụng hook viết lại Layer B
Watermark văn bản thống kê cần được viết lại thay vì chỉ làm sạch Unicode. Theo mặc định, tập lệnh viết lại sẽ in lời nhắc và không gọi mô hình:
python3 "$SCRIPTS/rewrite_text.py" draft.md \
--backend print-prompt \
--strength paraphrase
Bạn có thể sử dụng backend Ollama cục bộ để tạo đầu ra đã viết lại:
WATERMARKS_REWRITE_BACKEND=ollama \
WATERMARKS_REWRITE_MODEL=llama3.2 \
python3 "$SCRIPTS/rewrite_text.py" draft.md -o draft.rewritten.md
Các endpoint loopback được cho phép theo mặc định. Endpoint mô hình từ xa yêu cầu WATERMARKS_REWRITE_ALLOW_REMOTE=1 hoặc --allow-remote. Thông tin xác thực API phải được cung cấp thông qua WATERMARKS_REWRITE_API_KEY, không bao giờ truyền dưới dạng đối số dòng lệnh.
Gọi HTTP API
Làm sạch một tệp
API chấp nhận các byte của tệp được mã hóa bằng Base64 và sử dụng tên tệp được cung cấp để hỗ trợ định tuyến định dạng:
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\"}"
Phản hồi thành công bao gồm kind được phát hiện, tệp cleaned được mã hóa bằng Base64 và report về quá trình làm sạch.
Kiểm tra hoặc phát hiện mà không làm sạch
Sử dụng POST /inspect để kiểm tra cấu trúc và POST /detect cho các trình phát hiện watermark đã cấu hình. Việc phát hiện là tùy chọn và tách biệt với quá trình làm sạch; dịch vụ không gọi API của nhà cung cấp hoặc API phát hiện bên ngoài trừ khi được yêu cầu và cấu hình.
curl -s -X POST "$WM/inspect" \
-H 'Content-Type: application/json' \
-d "{\"file\": \"$(base64 < notes.md | tr -d '\n')\", \"name\": \"notes.md\", \"detect\": true}"
Để đo lường trước và sau, hãy truyền detect_before và detect_after trong các tùy chọn làm sạch:
{"file":"BASE64_DATA","name":"notes.md","options":{"detect_before":true,"detect_after":true}}
Lỗi của trình phát hiện được xử lý theo cách không làm gián đoạn quy trình. Nếu trình phát hiện không khả dụng, hết thời gian chờ hoặc trả về lỗi, báo cáo sẽ ghi nhận available: false và quá trình làm sạch vẫn tiếp tục.
Xử lý một lô
POST /inspect/batch và POST /clean/batch xử lý nhiều mục thông qua cùng một quy trình theo từng tệp. Giới hạn yêu cầu mặc định là 50 tệp và có thể thay đổi bằng WATERMARKS_MAX_BATCH_FILES.
{"files":[
{"file":"BASE64_DATA_1","name":"notes.md"},
{"file":"BASE64_DATA_2","name":"photo.png","options":{}}
]}
Một mục trong lô không hợp lệ sẽ nhận ok: false cùng thông báo lỗi mà không hủy các mục còn lại.
Chạy dự án bằng Docker
Image core được phát hành bao gồm dịch vụ, các trình làm sạch, ExifTool, qpdf và c2patool. Hãy xây dựng image core cục bộ và chỉ mở cổng trên loopback:
make docker-core-build
docker run --rm \
-p 127.0.0.1:8765:8765 \
--read-only \
--tmpfs /tmp \
watermarks-remover
Bạn cũng có thể chạy trực tiếp một trình làm sạch bên trong container:
docker run --rm -v "$(pwd):/data" watermarks-remover \
/app/scripts/clean_file.py /data/notes.md \
-o /data/notes.cleaned.md
Docker Compose chỉ khởi động dịch vụ core theo mặc định. Các profile tùy chọn sẽ bổ sung harness nghiên cứu hoặc backend hình ảnh cần nhiều tài nguyên:
docker compose up -d
docker compose --profile harness up -d
docker compose --profile heavy up -d
docker compose --profile harness --profile heavy up -d
Xác thực stack đang chạy bằng make compose-check. Lệnh này kiểm tra endpoint health của core và xác minh rằng các dịch vụ tùy chọn đã bật có thể chạy lệnh trợ giúp của chúng.
Cấu hình và bảo mật
Không cần biến môi trường nào cho việc làm sạch văn bản thông thường. Các cài đặt tùy chọn có thể được sao chép vào tệp .env ở cấp repository, tệp này sẽ được Docker Compose tự động tải:
cp .env.example .env
docker compose up -d
Tệp này đã được gitignore và không bao giờ được commit. Các cài đặt quan trọng gồm:
WATERMARKS_SERVER_API_KEYyêu cầu xác thực bearer cho HTTP API.WATERMARKS_SERVICE_URLcho client biết nơi kết nối đến dịch vụ.WATERMARKS_REWRITE_BACKEND,WATERMARKS_REWRITE_MODELvà các biến liên quan cấu hình các lệnh gọi trực tiếp đến mô hình Layer B.WATERMARKS_SYNTHID_SCORER_URLkết nối dịch vụ core với sidecar chấm điểm hình ảnh SynthID tùy chọn.HF_TOKENcung cấp token Hugging Face chỉ tồn tại trong môi trường cho các backend tùy chọn sử dụng mô hình yêu cầu quyền truy cập.
Máy chủ mặc định bind vào loopback và được thiết kế cho mạng tin cậy. Nếu thay đổi --host để cho phép truy cập từ bên ngoài máy cục bộ, hãy cấu hình WATERMARKS_SERVER_API_KEY và bổ sung các biện pháp bảo vệ mạng phù hợp.
Mẹo nâng cao
Cài đặt công cụ metadata tùy chọn để chạy trên máy chủ
Các tập lệnh Python core sử dụng thư viện chuẩn, nhưng các công cụ bên ngoài sẽ cải thiện một số quy trình cụ thể. c2patool kiểm tra manifest C2PA, exiftool xóa metadata còn sót lại, đặc biệt là trong PDF, và qpdf là bắt buộc để loại bỏ cấu trúc PDF thực sự. Các công cụ này đã có sẵn trong image Docker core.
Chấm điểm các tín hiệu hình ảnh lớp SynthID
Tích hợp reverse-SynthID tùy chọn có thể tạo điểm tin cậy trong miền pixel. Tính năng này chỉ dùng để phát hiện và không loại bỏ watermark pixel. Mã nguồn upstream không được đóng gói vì sử dụng giấy phép nghiên cứu phi thương mại.
SCRIPTS=service/scripts
"$SCRIPTS/setup_synthid.sh"
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python \
"$SCRIPTS/inspect_image.py" shot.png
Profile Compose nặng có thể chạy bộ chấm điểm này dưới dạng sidecar HTTP. Hãy cấu hình WATERMARKS_SYNTHID_SCORER_URL và WATERMARKS_SYNTHID_SCORER_API_KEY dùng chung, sau đó yêu cầu phát hiện trước và sau khi làm sạch.
Sử dụng CtrlRegen để xử lý trong miền pixel
CtrlRegen là backend bên ngoài tùy chọn dành cho các watermark trong miền pixel thuộc lớp SynthID, StegaStamp, Tree-Ring và StableSignature. Backend này không được đóng gói hoặc phát hành vì kho lưu trữ upstream của nó không có tệp giấy phép. Quy trình thiết lập tạo một môi trường biệt lập với các phần phụ thuộc được ghim theo phiên bản từ thời kỳ nghiên cứu.
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
Cường độ mặc định là 0.25, theo hướng thận trọng. Các preset được ghi nhận nằm trong khoảng từ 0.15 cho mức tái tạo tối thiểu đến 0.7 cho cường độ tối đa. Giá trị cao hơn có thể loại bỏ nhiều tín hiệu hơn, nhưng cũng tái tạo nhiều nội dung hình ảnh hơn.
CtrlRegen hoạt động tự nhiên ở kích thước 512 x 512 pixel. Các ảnh đầu vào lớn hơn sẽ được tự động chia thành các ô, vì vậy thời gian xử lý và mức sử dụng bộ nhớ tăng theo số lượng ô. GPU được khuyến nghị mạnh mẽ; dự kiến cần tải xuống khoảng 10 GB mô hình. Khi thực tế cho phép, nên giảm kích thước các ảnh rất lớn trước khi xử lý.
Xác minh các thử nghiệm văn bản có kiểm soát bằng MarkLLM
Harness MarkLLM tùy chọn có thể tạo và phát hiện lại văn bản thử nghiệm bằng các cấu hình scheme KGW hoặc SynthID tương ứng. Công cụ này hữu ích cho các thử nghiệm có kiểm soát, nhưng không phải là bộ kiểm chứng của nhà cung cấp và không thể chứng minh rằng bộ phát hiện của nhà cung cấp sẽ từ chối văn bản đã được viết lại.
SCRIPTS=service/scripts
"$SCRIPTS/setup_markllm.sh"
Để có kết quả có ý nghĩa, hãy sử dụng cùng cấu hình scheme và các khóa tương ứng cho cả quá trình tạo và phát hiện.
Kết luận
watermarks-remover cung cấp quy trình thận trọng, nhận biết định dạng để làm sạch các lớp provenance được hỗ trợ khỏi nội dung được cấp quyền. Hãy bắt đầu bằng các lệnh kiểm tra hợp nhất, sử dụng quy trình làm sạch Layer A mang tính tất định khi có thể, chỉ thêm bước viết lại Layer B khi cần, và bật các bộ phát hiện hoặc backend pixel bên ngoài một cách có chọn lọc. Đối với việc tích hợp ứng dụng, API HTTP cục bộ và đặc tả OpenAPI được tạo ra cung cấp giao diện linh hoạt nhất.
