
شنو هو watermarks-remover؟
watermarks-remover هو سيرفيس وأداة مهارات للوكيل مكتوبين بـPython، كيساعدو ففحص وحيد العلامات المدعومة ديال مصدر المحتوى بالذكاء الاصطناعي من النصوص والملفات. مخصصين للخصوصية وتنقية المحتوى فالمواد اللي كتملكها.
المشروع كيفرّق التنقية لعدة طبقات. الطبقة 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.pyوclean_file.pyكيكشفو الصيغ المدعومة وكيختارو المسار المناسب. - تكامل HTTP: كاينين نقاط نهاية للفحص والكشف والتنقية والمعالجة المجمعة بلا ما تحتاج تضمّن تطبيق Python.
- تعامل أكثر أماناً مع الصيغ: أدوات النص كترفض الملفات اللي باين عليها ثنائية، والصيغ غير المعروفة كيتصنّفو كـ
unknownوما كيتنقّاشو أوتوماتيكياً. - كشف اختياري: كاشفات النص المكوّنة وتقييم صور SynthID يقدرو يخدمو بشكل مستقل أو قبل وبعد التنقية.
- واجهات خلفية متقدمة اختيارية: المشروع كيدعم حزام تحقق MarkLLM، وتقييم reverse-SynthID، ومعالجة الصور فمجال البكسلات عبر CtrlRegen، وكل واحد منها بتثبيت مستقل.
التثبيت وتشغيل السيرفيس
1. نسخ المستودع
git clone https://github.com/guillaumemeyer/watermarks-remover.git
cd watermarks-remover
2. تشغيل خادم 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 باش تشوف الأدوات والواجهات الخلفية الاختيارية المتوفرة، أو 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، أو طلب من الوكيل يحيد العلامات المائية المدعومة ديال الذكاء الاصطناعي أو بيانات المصدر الوصفية. إلا ما كانش السيرفيس فـ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.py أو clean_file.py لهاد الملفات. ورغم أن --force-text كيتجاوز الحماية، خاصو يستعمل غير ملي كتكون باغي عمداً تفحص البايتات الخام.
بحالها، المنظّف الموحّد كيرفض الملفات المصنّفة على أنها unknown. عطِ امتداد ملف معروف ملي كيكون مناسب، ولا فعّل معالجة النصوص بشكل صريح باستعمال --as text ولا --force-text.
استعمل hook ديال إعادة الكتابة Layer B
العلامات المائية الإحصائية فالنصوص كتحتاج إعادة الكتابة، ماشي غير تنظيف Unicode. افتراضياً، سكريبت إعادة الكتابة كيطبّع prompt وما كيتاصلش بموديل:
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
نقاط النهاية ديال loopback مسموح بها افتراضياً. نقاط النهاية ديال الموديلات البعيدة كتحتاج 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 اللي تكتاشف، وملف cleaned مشفّر بـ Base64، وreport ديال التنظيف.
فحّص ولا اكتاشف بلا تنظيف
استعمل POST /inspect للفحص البنيوي وPOST /detect لكاشفات العلامات المائية المهيّأة. الاكتشاف اختياري ومنفصل على التنظيف؛ الخدمة ما كتعيّطش لـ APIs ديال الكاشفات الخارجية ولا ديال المزوّدين إلا إلا طلبتيها وهيّأتيها.
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_before وdetect_after فخيارات التنظيف:
{"file":"BASE64_DATA","name":"notes.md","options":{"detect_before":true,"detect_after":true}}
أعطاب الكاشفات كتتعالج بطريقة fail-soft. إلا كان الكاشف غير متاح، سالات المهلة ديالو، ولا رجّع خطأ، التقرير كيسجّل available: false والتنظيف كيكمل.
عالِج دفعة
POST /inspect/batch وPOST /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. بنِ الصورة الأساسية المحلية وشغّلها غير على loopback:
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 كيشغّل غير الخدمة الأساسية افتراضياً. والـ profiles الاختيارية كتزيد أدوات البحث ولا backends ثقيلة ديال الصور:
docker compose up -d
docker compose --profile harness up -d
docker compose --profile heavy up -d
docker compose --profile harness --profile heavy up -d
تحقّق من الـ stack خدام باستعمال make compose-check. هاد الأمر كيفحص endpoint ديال صحة الخدمة الأساسية وكيتأكّد باللي الخدمات الاختيارية المفعّلة قادرة تشغّل أوامر المساعدة ديالها.
الإعدادات والأمان
ما كايناش حاجة لمتغيّرات البيئة فالتنظيف العادي ديال النصوص. الإعدادات الاختيارية تقدر تنسخها لملف .env على مستوى المستودع، وDocker Compose كيقراه أوتوماتيكياً:
cp .env.example .env
docker compose up -d
هاد الملف داخل فـ gitignore وما خاصّوش يتسجّل نهائياً. من بين الإعدادات المهمة:
WATERMARKS_SERVER_API_KEYكيفرض المصادقة عبر bearer على HTTP API.WATERMARKS_SERVICE_URLكيعطي للزبناء العنوان اللي يوصلو منّو للخدمة.WATERMARKS_REWRITE_BACKENDوWATERMARKS_REWRITE_MODELوالمتغيّرات المرتابطة بهم كيضبطو الاستدعاءات المباشرة لموديلات Layer B.WATERMARKS_SYNTHID_SCORER_URLكيربط الخدمة الأساسية بالـ sidecar الاختياري ديال تقييم صور SynthID.HF_TOKENكيوفّر token ديال Hugging Face غير عبر البيئة للـ backends الاختيارية اللي كتستعمل موديلات مقيّدة.
السيرفر كيربط افتراضياً بـ loopback وموجّه لشبكة موثوقة. إلا بدّلتي --host باش تكشفو خارج الجهاز المحلي، ضبّط WATERMARKS_SERVER_API_KEY وزِد وسائل الحماية المناسبة للشبكة.
نصائح متقدمة
ثبّت أدوات metadata الاختيارية فالتشغيل من الجهاز المضيف
سكريبتات Python الأساسية كتستعمل المكتبة القياسية، ولكن الأدوات الخارجية كتحسّن بعض الاستعمالات الخاصة. c2patool كيفحص بيانات C2PA، وexiftool كيحيد بقايا metadata، خصوصاً من ملفات PDF، وqpdf ضروري للحذف البنيوي الحقيقي من PDF. هاد الأدوات راه موجودة أصلاً فصورة Docker الأساسية.
قيّم إشارات الصور من فئة SynthID
التكامل الاختياري ديال reverse-SynthID يقدر يخرّج نقطة ثقة فمجال البيكسلات. هو غير للكشف وما كيحيدش العلامات المائية ديال البيكسلات. الـ checkout ديالو من المصدر ما مدموجش حيث كيستعمل رخصة بحثية غير تجارية.
SCRIPTS=service/scripts
"$SCRIPTS/setup_synthid.sh"
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python \
"$SCRIPTS/inspect_image.py" shot.png
بروفايل Compose الثقيل يقدر يشغّل هاد الكاشف كـ HTTP sidecar. ضبّط WATERMARKS_SYNTHID_SCORER_URL وWATERMARKS_SYNTHID_SCORER_API_KEY مشترك، ومن بعد طلب الكشف قبل التنقية ومن بعدها.
استعمل CtrlRegen للمعالجة فمجال البيكسلات
CtrlRegen هو backend خارجي اختياري للعلامات المائية فمجال البيكسلات من فئة 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 كيوفّر سير عمل حذر وواعٍ بالصيغة لتنقية أسطح مصدر المحتوى المدعومة من المحتوى المصرّح باستعمالو. بدا بأوامر الفحص الموحّدة، واستعمل التنقية الحتمية ديال Layer A ملي يكون هاد الشي ممكن، وزِد إعادة الكتابة ديال Layer B غير ملي تكون ضرورية، وفعّل الكواشف الخارجية أو backends ديال البيكسلات بشكل انتقائي. بالنسبة لدمج التطبيق، واجهة HTTP المحلية ومواصفة OpenAPI المولّدة كيوفّرو الواجهة الأكثر مرونة.
