
watermarks-remover의 기능
watermarks-remover는 텍스트와 지원되는 파일 형식에서 AI 출처 표시를 검사하고 제거하는 에이전트 스킬이자 Python 서비스입니다. 사용자가 소유하거나 처리 권한을 가진 자료를 대상으로 개인정보 보호, 연구 및 콘텐츠 위생을 위해 설계되었습니다.
에이전트 스킬은 얇은 HTTP 클라이언트입니다. 정리 기능 자체를 포함하지 않으며 에이전트 호스트에 Python이 필요하지도 않습니다. 대신 Python 표준 라이브러리로 구축된 별도 실행 서비스에 작업을 전송합니다.
이 프로젝트의 기능은 다음 세 영역으로 나뉩니다.
- 텍스트 레이어 A: 보이지 않는 유니코드 전달자, 특수 공백, 양방향 제어 문자 및 태그 문자를 결정론적으로 제거합니다.
- 텍스트 레이어 B: 통계적 토큰 샘플링 워터마크를 줄이기 위해 상당한 수준의 재작성을 수행합니다. 최선의 결과를 지향하는 기능이며 스타일이나 문체가 바뀔 수 있습니다.
- 파일 정리: 다양한 파일 형식에서 지원되는 C2PA, EXIF, XMP, 문서 속성 및 컨테이너 메타데이터를 제거합니다.
어떤 도구도 공급업체의 탐지기가 콘텐츠 식별을 중단한다고 보장할 수 없습니다. 원본 파일을 보관하고, 정리된 결과를 항상 검토하며, 자신이 소유하거나 처리 권한을 받은 콘텐츠에만 이 프로젝트를 사용하세요.
주요 기능 및 지원 형식
핵심 스크립트는 Python 3.10 이상이 필요하며 표준 라이브러리만 사용합니다. c2patool, exiftool, qpdf와 같은 선택적 도구는 사용 가능한 경우 활용됩니다.
지원되는 정리 대상
- 이미지: PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF 및 SVG.
- 문서: PDF, DOCX, XLSX, PPTX, EPUB 및 ODT.
- 텍스트 및 웹 파일: HTML과 Markdown. 지원되는 메타데이터, JSON-LD, AI 프런트매터 키 및 레이어 A 텍스트 표시를 포함합니다.
- 미디어 컨테이너: MP4, MOV, M4A, M4V, WAV, MP3 및 FLAC.
인식되지 않는 형식은 자동으로 정리되지 않습니다. 텍스트 전용 명령은 바이너리 파일도 거부하며 일반 파일 도구를 사용하도록 안내합니다.
중요한 제한 사항
핵심 정리 기능은 소프트 바운드 C2PA 또는 순수 픽셀, 오디오 및 비디오 워터마크를 처리하지 않습니다. PDF 정리에는 구조적 제거를 위해 qpdf가 필요합니다. 증분 메타데이터 수정만 수행하면 복구 가능한 바이트가 남을 수 있기 때문입니다. 선택적 Ghostscript 처리를 사용하면 삽입된 PDF 이미지 내부의 메타데이터를 처리할 수 있습니다.
탐지와 정리는 별개의 기능입니다. MarkLLM, keyed-Gumbel, Claude seams 및 이미지 SynthID 점수를 위한 선택적 탐지기는 사용자가 선택해 활성화하며, 사용할 수 없을 때도 오류를 조용히 처리하도록 설계되었습니다.
에이전트 스킬 설치
저장소를 복제하거나 다운로드한 뒤 해당 디렉터리로 이동하여 설치 프로그램을 실행하세요. 다음 명령은 개인 Claude Code 구성에 서비스 기반 전체 스킬을 설치합니다.
python3 install_skill.py --skill remove-ai-marks --target claude-code사용 가능한 설치 대상은 다음과 같습니다.
--target claude-code는~/.claude/skills/<skill>아래에 설치합니다.--target claude-project --project-dir PATH는PATH/.claude/skills/<skill>아래에 설치합니다.--target cowork는 클라우드 Skills 인터페이스를 통해 업로드할 수 있는dist/<skill>.zip을 생성합니다.--target cursor는~/.cursor/skills/<skill>아래에 설치합니다.
python3 install_skill.py --list를 사용하면 제공된 스킬 목록을 확인할 수 있습니다. 저장소에는 전체 remove-ai-marks 스킬과 독립 실행형 텍스트 전용 clean-user-facing-text 스킬이 포함되어 있습니다. --force를 사용하지 않으면 기존 설치 항목이 백업됩니다. 체크아웃에서 실시간으로 편집하려면 --link를 추가하세요.
Claude Code 플러그인 설치
Claude Code 사용자는 마켓플레이스 플러그인을 직접 설치할 수 있습니다.
/plugin marketplace add guillaumemeyer/watermarks-remover
/plugin install watermarks-remover@watermarks-remover그러면 스킬이 /watermarks-remover:remove-ai-marks 및 /watermarks-remover:clean-user-facing-text로 로드됩니다. 다음 명령으로 플러그인을 업데이트하세요.
/plugin marketplace update watermarks-removerGrok용 스킬 연결
mkdir -p ~/.grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks서비스 시작
저장소에서 로컬 HTTP 서비스를 실행하세요.
make serve또는 서버 스크립트를 명시적으로 실행할 수 있습니다.
python3 service/scripts/server.py --host 127.0.0.1 --port 8765기본 주소는 http://127.0.0.1:8765입니다. 서비스가 다른 위치에서 실행되는 경우 스킬에 WATERMARKS_SERVICE_URL을 설정하세요. 서버는 기본적으로 루프백에 바인딩되므로 다른 시스템에 직접 노출되지 않습니다.
서비스가 응답하는지 확인하세요.
curl -s http://127.0.0.1:8765/health상태 확인 엔드포인트는 ok와 서비스 버전이 포함된 객체를 반환합니다.
명령줄에서 파일 검사 및 정리
가장 안전한 작업 방식은 먼저 파일을 검사하고, 정리된 출력을 새 경로에 기록한 다음, 원본과 결과를 비교하는 것입니다.
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를 사용하세요. 이 명령은 파일에 맞는 지원 클리너를 자동으로 선택합니다.
레이어 A 텍스트 표시 정리
일반 텍스트 입력의 경우 다음 명령으로 보이지 않거나 편집 기반의 유니코드 전달자를 검사할 수 있습니다.
python3 "$SCRIPTS/inspect_text.py" draft.md그런 다음 정리된 복사본을 만들고 통계를 출력합니다:
python3 "$SCRIPTS/clean_text.py" draft.md -o draft.cleaned.md --stats레이어 A는 결정론적이며 표시되는 본문과 관련해 무손실 처리를 목적으로 합니다. 이러한 텍스트 명령에 DOCX, PDF, 이미지 또는 기타 바이너리 입력을 전달하지 마세요. 해당 파일에는 파일 명령을 사용하세요.
레이어 B 재작성 준비
통계적 텍스트 워터마크에는 단순한 문자 제거가 아니라 재작성이 필요합니다. 기본적으로 재작성 명령은 프롬프트를 출력합니다:
python3 "$SCRIPTS/rewrite_text.py" draft.md --backend print-prompt --strength paraphrase레이어 B는 반복적으로 수행되는 최선 노력 방식입니다. 원래 스타일과 문체에 대한 충실도가 낮아질 수 있습니다. 워터마크 제거보다 품질이 더 중요한 경우, 프로젝트에서는 원문을 보존하면서 레이어 A와 파일 정리를 사용할 것을 권장합니다.
HTTP API 사용
이 서비스는 검사, 탐지, 정리, 일괄 처리, 기능 탐색 및 OpenAPI 사양을 제공합니다.
GET /health는 서비스 상태와 버전을 보고합니다.GET /capabilities는 사용 가능한 선택적 도구와 백엔드를 보고합니다.GET /openapi.json은 OpenAPI 3.0.3 사양을 반환합니다.POST /inspect는 입력 종류, 의심 상태 및 보고서를 반환합니다.POST /detect는 구성된 탐지기 결과를 반환합니다.POST /clean은 정리된 base64 데이터와 보고서를 반환합니다.POST /inspect/batch및POST /clean/batch는 요청당 최대 50개의 파일을 처리합니다.
다음 예시는 Markdown 파일을 base64로 인코딩하여 정리 엔드포인트로 전송합니다:
WM="http://127.0.0.1:8765"
curl -s "$WM/health"
curl -s -X POST "$WM/clean" -H 'Content-Type: application/json' \
-d "{\"file\": \"$(base64 < notes.md | tr -d '\n')\", \"name\": \"notes.md\"}"Bearer 인증을 요구하려면 WATERMARKS_SERVER_API_KEY를 설정하세요. 로컬 개발 머신을 넘어 배포하는 경우 인증과 적절한 네트워크 제어를 유지하세요.
Docker로 서비스 실행
읽기 전용 파일 시스템과 임시 디렉터리를 사용해 핵심 이미지를 빌드하고 실행합니다:
make docker-core-build
docker run --rm -p 127.0.0.1:8765:8765 --read-only --tmpfs /tmp watermarks-removerDocker Compose는 여러 프로필을 지원합니다:
docker compose up -d
docker compose --profile harness up -d
docker compose --profile heavy up -d- 기본 설정은 핵심 서비스를 시작합니다.
harness프로필은 MarkLLM 및 MarkDiffusion 구성 요소를 추가합니다.heavy프로필은 로컬에서 빌드한 CtrlRegen 및 SynthID 구성 요소를 추가합니다.
Core, MarkLLM 및 MarkDiffusion 이미지는 GHCR에 게시됩니다. CtrlRegen과 SynthID scorer는 업스트림 라이선스 문제로 인해 로컬 전용으로 유지됩니다. 선택적 구성을 사용하려면 .env.example을 .env로 복사하세요. 기본 텍스트 정리에는 추가 설정이 필요하지 않습니다.
훅으로 자동 검사 활성화
에이전트 스킬은 지시사항이므로 모델이 이를 호출할지 결정합니다. 훅은 더 결정론적이며, 일치하는 도구 호출이 발생할 때마다 실행됩니다.
Claude Code 플러그인은 Write, Edit, MultiEdit 및 NotebookEdit에 대한 PostToolUse 훅을 등록합니다. 이 훅은 service/scripts/hook_written_file.py를 다음 두 모드 중 하나로 호출합니다:
- check: 기본 모드로, 표시를 보고하지만 파일은 수정하지 않습니다.
- clean: 지원되는 표시를 파일에서 직접 제거하고 모델에 알립니다.
플러그인의 Hook mode 설정에서 모드를 선택하거나 다음을 설정하세요:
WATERMARKS_HOOK_MODE=clean플러그인 없이 ~/.claude/settings.json에 훅을 수동으로 등록할 수 있습니다. 훅은 에이전트가 작성한 파일과 pre-commit 게이트를 처리하지만, 채팅 기록의 텍스트를 직접 정리하는 작업은 최선 노력 방식이며 스킬에 따라 달라집니다.
pre-commit 검사 추가
표시된 파일이 Git 커밋에 포함되는 것을 막으려면 저장소의 검사 훅을 .pre-commit-config.yaml에 추가하세요:
repos:
- repo: https://github.com/guillaumemeyer/watermarks-remover
rev: v0.5.0
hooks:
- id: watermarks-remover-checkwatermarks-remover-check 훅은 표시가 발견되면 실패합니다. 대안인 watermarks-remover-clean 훅은 파일을 직접 정리하며 명시적으로 선택해야 합니다.
고급 팁
원본 보존 및 결과 비교
가능한 경우 정리된 데이터를 별도의 출력 경로에 기록하세요. 이는 레이어 B 재작성과 복잡한 문서 컨테이너에서 특히 중요합니다. 이러한 처리로 본문, 포함된 자산 또는 애플리케이션별 속성이 영향을 받을 수 있기 때문입니다.
적절한 PDF 도구 설치
실제 구조적 PDF 제거가 필요할 때는 qpdf를 사용하세요. README에서는 exiftool만 사용하면 증분 업데이트가 수행되어 기존 바이트를 복구할 수 있는 상태로 남길 수 있다고 경고합니다. 포함된 이미지 내부에 메타데이터가 있을 수 있는 경우 선택적 Ghostscript 심층 처리를 사용하세요.
탐지와 정리를 별도의 작업으로 취급
정리 작업은 지원되는 전달 매체와 메타데이터를 제거하는 반면, 탐지기는 구성된 워터마크 방식이 존재하는지 추정합니다. 예를 들어 MarkLLM 검증은 동일한 구성에서만 의미가 있으며, 키가 있는 Gumbel 재현에는 생성 키가 필요합니다. 이러한 도구는 모든 공급업체를 대상으로 하는 보편적인 판별기가 아닙니다.
레이어 B를 신중하게 선택
레이어 B를 사용하는 경우 동일한 유형의 표시를 다시 적용할 가능성을 줄이기 위해 비원본 모델을 사용할 것을 프로젝트에서 권장합니다. 과도한 의역은 어조와 정확성을 훼손할 수 있으므로, 글의 품질 보존이 더 중요한 경우에는 사용하지 마세요.
선택적 백엔드 살펴보기
service/scripts/ 아래의 부트스트랩 스크립트는 이미지 점수 산정을 위한 reverse-SynthID, 픽셀 영역 워터마크 제거를 위한 CtrlRegen, 구성된 텍스트 워터마크 검증을 위한 MarkLLM, 이미지 워터마크 실험을 위한 MarkDiffusion을 설정할 수 있습니다. 이러한 백엔드는 요구 사항과 제한 사항이 서로 다르므로, 활성화하기 전에 설정 스크립트를 확인하세요.
책임 있는 사용
watermarks-remover는 본인이 소유하거나 처리 권한을 부여받은 콘텐츠에 대해 개인정보 보호, 연구 및 위생 목적으로만 사용하세요. 학술 부정행위나 AI 생성 자료를 사람이 작성했다는 허위 주장을 위한 도구가 아닙니다. 관련 법률과 기관 정책을 준수하세요.
이 프로젝트는 MIT 라이선스로 제공됩니다. 릴리스와 소스 코드는 watermarks-remover GitHub 저장소에서 확인할 수 있습니다.
결론
watermarks-remover는 결정론적 텍스트 정리, 다양한 파일 컨테이너의 메타데이터 제거, 선택적 탐지 백엔드, 에이전트 통합, 훅 및 HTTP API를 결합합니다. 먼저 검사하고, 원본을 보존하며, 적절한 가장 제한적인 정리 계층을 적용한 다음, 어떤 탐지 결과도 보장된 것으로 간주하지 말고 결과를 검토하세요.
