
watermarks-remover কী?
watermarks-remover হলো একটি Python পরিষেবা এবং এজেন্ট স্কিল, যা টেক্সট ও ফাইল পরিদর্শন করে এবং সমর্থিত AI উৎস-চিহ্ন শনাক্ত ও অপসারণ করে। এটি আপনার মালিকানাধীন উপকরণের গোপনীয়তা ও কনটেন্ট হাইজিনের জন্য তৈরি।
প্রকল্পটি পরিষ্কার করার কাজকে কয়েকটি স্তরে ভাগ করে। স্তর A নির্ধারিতভাবে অদৃশ্য Unicode, অস্বাভাবিক স্পেস, দ্বিমুখী অক্ষর, ট্যাগ অক্ষর এবং সংশ্লিষ্ট টেক্সট আর্টিফ্যাক্ট অপসারণ করে। স্তর B পরিসংখ্যানভিত্তিক টোকেন-স্যাম্পলিং ওয়াটারমার্কের ক্ষেত্রে এজেন্টের পুনর্লিখন বা ঐচ্ছিক rewrite_text.py হুক ব্যবহার করে। ফাইল ক্লিনারগুলো C2PA, EXIF, XMP এবং অফিস-ডকুমেন্ট মেটাডেটাসহ সমর্থিত মেটাডেটা ও ডকুমেন্ট প্রপার্টি পরিচালনা করে।
প্রকল্পটি কেবল আপনার মালিকানাধীন বা পরিবর্তনের অনুমতিপ্রাপ্ত কনটেন্টে ব্যবহার করুন। শনাক্তকরণ ও পরিষ্কার করা পৃথক কাজ, এবং কিছু ঐচ্ছিক ডিটেক্টর গবেষণার সরঞ্জাম, অথরিটেটিভ ভেন্ডর যাচাইকরণ ব্যবস্থা নয়।
প্রধান বৈশিষ্ট্য
- স্ট্যান্ডার্ড-লাইব্রেরি কোর: স্থানীয় HTTP পরিষেবা এবং মূল স্ক্রিপ্টগুলোর জন্য Python 3.10 বা পরবর্তী সংস্করণ প্রয়োজন; কোনো বাধ্যতামূলক Python নির্ভরতা নেই।
- বিস্তৃত ফাইল রাউটিং: সমর্থিত ফরম্যাটের মধ্যে রয়েছে text, 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.pyএবংclean_file.pyসমর্থিত ফরম্যাট শনাক্ত করে এবং উপযুক্ত পাইপলাইন নির্বাচন করে। - HTTP ইন্টিগ্রেশন: Python ইমপ্লিমেন্টেশন আলাদাভাবে অন্তর্ভুক্ত না করেই inspect, detect, clean এবং batch এন্ডপয়েন্ট ব্যবহার করা যায়।
- নিরাপদ ফরম্যাট পরিচালনা: টেক্সট টুলগুলো সম্ভাব্য বাইনারি ফাইল প্রত্যাখ্যান করে, আর অচেনা ফরম্যাটকে
unknownহিসেবে শ্রেণিবদ্ধ করে এবং স্বয়ংক্রিয়ভাবে পরিষ্কার করে না। - ঐচ্ছিক শনাক্তকরণ: কনফিগার করা টেক্সট ডিটেক্টর এবং SynthID ইমেজ স্কোরিং স্বাধীনভাবে অথবা পরিষ্কার করার আগে ও পরে চালানো যায়।
- ঐচ্ছিক উন্নত ব্যাকএন্ড: প্রকল্পটি পৃথক ইনস্টলেশনের মাধ্যমে MarkLLM যাচাইকরণ হার্নেস, reverse-SynthID স্কোরিং এবং CtrlRegen পিক্সেল-ডোমেইন ইমেজ প্রসেসিং সমর্থন করে।
পরিষেবা ইনস্টল ও চালু করুন
১. রিপোজিটরি ক্লোন করুন
git clone https://github.com/guillaumemeyer/watermarks-remover.git
cd watermarks-remover
২. স্ট্যান্ডার্ড-লাইব্রেরি HTTP সার্ভার চালু করুন
সবচেয়ে দ্রুত সেটআপের জন্য স্থানীয় Python পরিষেবা ব্যবহার করুন। এটি ডিফল্টভাবে loopback-এ শোনে:
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 ব্যবহার করুন, অথবা তৈরি করা OpenAPI 3.0.3 স্পেসিফিকেশনের জন্য GET /openapi.json ব্যবহার করুন।
৩. ঐচ্ছিক এজেন্ট স্কিল ইনস্টল করুন
এজেন্ট স্কিলে কোনো পরিষেবা ইমপ্লিমেন্টেশন নেই। এটি HTTP সার্ভারে কল করা একটি হালকা ক্লায়েন্ট, তাই স্কিল ব্যবহারের আগে পরিষেবা চালু করুন।
mkdir -p .grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks
ব্যবহারকারী-গ্লোবাল Grok ইনস্টলেশনের জন্য আপনার home directory-এর অধীনে লিংক তৈরি করুন:
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 সেট করুন।
৪. ঐচ্ছিক 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.py বা clean_file.py ব্যবহার করুন। যদিও --force-text সুরক্ষাটি অগ্রাহ্য করে, এটি কেবল তখনই ব্যবহার করা উচিত যখন আপনি ইচ্ছাকৃতভাবে কাঁচা বাইট স্ক্যান করতে চান।
একইভাবে, একীভূত ক্লিনার unknown হিসেবে শ্রেণিবদ্ধ ফাইল প্রত্যাখ্যান করে। প্রয়োজন অনুযায়ী স্বীকৃত ফাইলনাম এক্সটেনশন দিন, অথবা --as text কিংবা --force-text দিয়ে স্পষ্টভাবে টেক্সট হ্যান্ডলিং চালু করুন।
Layer B rewrite hook ব্যবহার করুন
পরিসংখ্যানভিত্তিক টেক্সট ওয়াটারমার্কের জন্য Unicode পরিষ্কারের পরিবর্তে পুনর্লিখন প্রয়োজন। ডিফল্টভাবে, rewrite script একটি প্রম্পট প্রিন্ট করে এবং কোনো মডেল কল করে না:
python3 "$SCRIPTS/rewrite_text.py" draft.md \
--backend print-prompt \
--strength paraphrase
ঐচ্ছিক স্থানীয় Ollama backend পুনর্লিখিত আউটপুট তৈরি করতে পারে:
WATERMARKS_REWRITE_BACKEND=ollama \
WATERMARKS_REWRITE_MODEL=llama3.2 \
python3 "$SCRIPTS/rewrite_text.py" draft.md -o draft.rewritten.md
ডিফল্টভাবে loopback endpoint অনুমোদিত। দূরবর্তী model endpoint-এর জন্য WATERMARKS_REWRITE_ALLOW_REMOTE=1 অথবা --allow-remote প্রয়োজন। API credential অবশ্যই WATERMARKS_REWRITE_API_KEY-এর মাধ্যমে দিতে হবে, কখনোই command-line argument হিসেবে নয়।
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\"}"
সফল response-এ শনাক্ত করা kind, Base64-এনকোড করা cleaned ফাইল এবং একটি cleaning report থাকে।
পরিষ্কার না করে পরিদর্শন বা শনাক্ত করুন
স্ট্রাকচারাল পরিদর্শনের জন্য POST /inspect এবং কনফিগার করা watermark detector-এর জন্য POST /detect ব্যবহার করুন। Detection opt-in এবং cleaning থেকে পৃথক; অনুরোধ ও কনফিগারেশন না থাকলে service কোনো vendor বা external detector 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}"
আগে ও পরে পরিমাপের জন্য cleaning options-এ detect_before এবং detect_after দিন:
{"file":"BASE64_DATA","name":"notes.md","options":{"detect_before":true,"detect_after":true}}
Detector ব্যর্থতা fail-soft। কোনো detector অনুপলব্ধ হলে, timeout হলে বা error ফেরত দিলে report-এ available: false লেখা হয় এবং cleaning চলতে থাকে।
একটি batch প্রক্রিয়া করুন
POST /inspect/batch এবং POST /clean/batch একই per-file pipeline-এর মাধ্যমে একাধিক entry প্রক্রিয়া করে। ডিফল্ট request limit 50টি ফাইল, যা WATERMARKS_MAX_BATCH_FILES দিয়ে পরিবর্তন করা যায়।
{"files":[
{"file":"BASE64_DATA_1","name":"notes.md"},
{"file":"BASE64_DATA_2","name":"photo.png","options":{}}
]}
ত্রুটিপূর্ণ batch entry-র ক্ষেত্রে ok: false এবং একটি error message দেওয়া হয়, তবে বাকি entry-গুলোর প্রক্রিয়া বন্ধ হয় না।
Docker দিয়ে project চালান
প্রকাশিত core image-এ service, cleaner, ExifTool, qpdf এবং c2patool অন্তর্ভুক্ত রয়েছে। স্থানীয় core image তৈরি করে এটি শুধু loopback-এ expose করুন:
make docker-core-build
docker run --rm \
-p 127.0.0.1:8765:8765 \
--read-only \
--tmpfs /tmp \
watermarks-remover
আপনি container-এর ভেতরেও সরাসরি cleaner চালাতে পারেন:
docker run --rm -v "$(pwd):/data" watermarks-remover \
/app/scripts/clean_file.py /data/notes.md \
-o /data/notes.cleaned.md
Docker Compose ডিফল্টভাবে শুধু core service চালু করে। ঐচ্ছিক profile গবেষণা harness বা ভারী image backend যোগ করে:
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 দিয়ে চলমান stack যাচাই করুন। এটি core health endpoint পরীক্ষা করে এবং সক্রিয় ঐচ্ছিক service-গুলো তাদের help command চালাতে পারে কি না যাচাই করে।
Configuration ও security
সাধারণ text cleaning-এর জন্য কোনো environment variable প্রয়োজন নেই। ঐচ্ছিক setting repository-level .env file-এ কপি করা যায়, যা Docker Compose স্বয়ংক্রিয়ভাবে লোড করে:
cp .env.example .env
docker compose up -d
ফাইলটি gitignored এবং কখনো commit করা উচিত নয়। গুরুত্বপূর্ণ setting-গুলোর মধ্যে রয়েছে:
WATERMARKS_SERVER_API_KEYHTTP API-এর জন্য bearer authentication বাধ্যতামূলক করে।WATERMARKS_SERVICE_URLclient-দের service-এ কোথায় পৌঁছাতে হবে তা জানায়।WATERMARKS_REWRITE_BACKEND,WATERMARKS_REWRITE_MODELএবং সংশ্লিষ্ট variable-গুলো সরাসরি Layer B model call কনফিগার করে।WATERMARKS_SYNTHID_SCORER_URLcore service-কে ঐচ্ছিক SynthID image-scoring sidecar-এর সঙ্গে সংযুক্ত করে।HF_TOKENgated model ব্যবহারকারী ঐচ্ছিক backend-কে শুধুমাত্র environment-এর মাধ্যমে Hugging Face token দেয়।
ডিফল্টভাবে server loopback-এ bind করে এবং একটি trusted network-এর জন্য তৈরি। স্থানীয় machine-এর বাইরে expose করতে --host পরিবর্তন করলে WATERMARKS_SERVER_API_KEY কনফিগার করুন এবং উপযুক্ত network protection যোগ করুন।
উন্নত টিপস
Host-side run-এর জন্য ঐচ্ছিক metadata tool ইনস্টল করুন
Core Python script-গুলো standard library ব্যবহার করে, তবে external tool নির্দিষ্ট workflow উন্নত করে। c2patool C2PA manifest পরিদর্শন করে, exiftool অবশিষ্ট metadata সরায়, বিশেষ করে PDF থেকে, এবং বাস্তব structural PDF strip-এর জন্য qpdf প্রয়োজন। এই tool-গুলো core Docker image-এ আগে থেকেই রয়েছে।
SynthID-শ্রেণির image signal-এর স্কোর নির্ণয় করুন
ঐচ্ছিক reverse-SynthID ইন্টিগ্রেশন pixel-domain confidence score তৈরি করতে পারে। এটি শুধু শনাক্তকরণের জন্য এবং pixel watermark অপসারণ করে না। এর upstream checkout যুক্ত করা হয়নি, কারণ এটি non-commercial research license ব্যবহার করে।
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 এই scorer-কে HTTP sidecar হিসেবে চালাতে পারে। WATERMARKS_SYNTHID_SCORER_URL এবং একটি শেয়ার করা WATERMARKS_SYNTHID_SCORER_API_KEY কনফিগার করুন, তারপর cleaning-এর আগে ও পরে detection অনুরোধ করুন।
pixel-domain processing-এর জন্য CtrlRegen ব্যবহার করুন
CtrlRegen হলো SynthID-class, StegaStamp, Tree-Ring এবং StableSignature pixel-domain mark-এর জন্য একটি ঐচ্ছিক external backend। upstream repository-তে কোনো license file না থাকায় এটি bundled বা published নয়। এর setup pinned research-era dependencies-সহ একটি isolated environment তৈরি করে।
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
ডিফল্ট strength হলো সংরক্ষণশীল 0.25। নথিভুক্ত preset-গুলোর পরিসর minimal regeneration-এর জন্য 0.15 থেকে maximum strength-এর জন্য 0.7 পর্যন্ত। বেশি মান signal-এর আরও বড় অংশ অপসারণ করতে পারে, তবে একই সঙ্গে ছবির আরও বেশি content পুনরায় তৈরি করে।
CtrlRegen স্বাভাবিকভাবে 512 বাই 512 pixel-এ কাজ করে। বড় input স্বয়ংক্রিয়ভাবে tile করা হয়, তাই tile count বাড়ার সঙ্গে processing time এবং memory use-ও বাড়ে। GPU দৃঢ়ভাবে সুপারিশ করা হয়, প্রায় 10 GB model download-এর জন্য প্রস্তুত থাকা উচিত, এবং ব্যবহারিক হলে খুব বড় ছবি আগে downscale করা উচিত।
MarkLLM দিয়ে controlled text experiment যাচাই করুন
ঐচ্ছিক MarkLLM harness matching KGW বা SynthID scheme configuration ব্যবহার করে test text তৈরি এবং পুনরায় শনাক্ত করতে পারে। এটি controlled experiment-এর জন্য উপযোগী, তবে এটি vendor oracle নয় এবং কোনো vendor detector rewritten text প্রত্যাখ্যান করবে না, তা প্রমাণ করতে পারে না।
SCRIPTS=service/scripts
"$SCRIPTS/setup_markllm.sh"
অর্থপূর্ণ ফলাফলের জন্য generation এবং detection-এ একই scheme configuration ও key ব্যবহার করুন।
উপসংহার
watermarks-remover অনুমোদিত content থেকে সমর্থিত provenance surface পরিষ্কার করার জন্য একটি সতর্ক, format-aware workflow প্রদান করে। unified inspection command দিয়ে শুরু করুন, যেখানে সম্ভব deterministic Layer A cleaning ব্যবহার করুন, প্রয়োজন হলেই Layer B rewriting যোগ করুন, এবং external detector বা pixel backend বেছে বেছে সক্রিয় করুন। application integration-এর জন্য local HTTP API এবং generated OpenAPI specification সবচেয়ে নমনীয় interface প্রদান করে।
