
watermarks-removerの機能
watermarks-removerは、テキストおよび対応ファイル形式からAI由来の痕跡を検査・除去するためのエージェントスキルとPythonサービスです。プライバシー保護、研究、コンテンツの衛生管理を目的としており、自分が所有する、または処理する権限を持つ素材に使用してください。
エージェントスキルは薄いHTTPクライアントです。除去処理の実装は含まず、エージェントのホストにPythonをインストールする必要もありません。代わりに、Python標準ライブラリで構築された別途起動中のサービスへ処理を送信します。
このプロジェクトの処理は、次の3つの領域に分かれています。
- テキストレイヤーA:不可視のUnicodeキャリア、特殊な空白、双方向制御文字、タグ文字を決定論的に除去します。
- テキストレイヤー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。
- テキストおよびWebファイル:HTMLとMarkdown。対応するメタデータ、JSON-LD、AIフロントマターキー、レイヤーAのテキストマークを含みます。
- メディアコンテナ:MP4、MOV、M4A、M4V、WAV、MP3、FLAC。
認識されない形式は自動的にクリーニングされません。テキスト専用コマンドでバイナリファイルを指定した場合も拒否され、汎用ファイルツールを使用するよう案内されます。
重要な制限事項
コアクリーニングは、ソフトバウンド型C2PAや、純粋なピクセル・音声・動画ウォーターマークには対応していません。PDFのクリーニングでは、構造的な除去にqpdfが必要です。増分メタデータ編集では復元可能なバイトが残る可能性があるためです。オプションのGhostscript処理を使うと、埋め込みPDF画像内のメタデータにも対処できます。
検出とクリーニングは別の処理です。MarkLLM、keyed-Gumbel、Claudeの継ぎ目、画像の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のテキストマークをクリーニングする
プレーンテキストの入力では、次のコマンドを使って不可視のUnicodeキャリアや編集ベースのキャリアを検査できます。
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は、1リクエストにつき最大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\"}"ベアラ認証を必須にするには、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スコアラーは、上流のライセンス上の理由からローカル専用です。オプション設定を行うには.env.exampleを.envにコピーしてください。基本的なテキストのクリーンアップに追加設定は必要ありません。
フックで自動チェックを有効にする
エージェントスキルは指示であるため、呼び出すかどうかはモデルが判断します。フックはより決定論的で、条件に一致するツール呼び出しが発生するたびに実行されます。
Claude Codeプラグインは、Write、Edit、MultiEdit、NotebookEditを対象とするPostToolUseフックを登録します。これはservice/scripts/hook_written_file.pyを次の2つのモードのいずれかで呼び出します。
- 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 を組み合わせています。まず検査を行い、元のファイルを保持したうえで、適切な最小限のクリーニング層を適用し、検出結果を確実なものとみなすのではなく、結果を確認してください。
