مشروع مفتوح المصدر ومجاني 100% 🚀

فصل الموسيقى من يوتيوب
بالذكاء الاصطناعي مع مزامنة الصوت و الصورة

أداة مفتوحة المصدر لفصل الآلات الموسيقية عن الصوت البشري في مقاطع اليوتيوب بجودة جيدة وبدون أي تكاليف.

⚡ المزامنة

نظام Drift Guard يطابق حركة الصوت و الصورة حتى عند التقديم وتغيير السرعات.

🧠 Demucs v4 AI

يعتمد على خوارزميات الذكاء الاصطناعي لفصل الترددات.

🔒 خصوصية وسرعة مطلقة

خيارات متعددة: تشغيل سحابي مجاني على كروت Tesla T4 أو تشغيل محلي دون إرسال بيانات.

تثبيت الإضافة في المتصفح (في 10 ثوانٍ)

متوافق مع جميع متصفحات Chromium (Chrome / Edge / Brave / CachyOS Browser)

  1. الخطوة 1: التحميل وفك الضغط:
    حمّل ملف الإضافة المضغوط من الزر أدناه وفك الضغط عنه في مجلد مستقل (تأكد أن المجلد يحتوي مباشرة على ملفات الإضافة الأساسية):
    📦 تحميل ملف naqawa.zip
    📁 هيكل المجلد المستقل (محتويات الإضافة):
    • manifest.json ملف التعريف والهوية الأساسي الذي يبحث عنه المتصفح لقراءة إعدادات وصلاحيات الإضافة.
    • popup.html واجهة القائمة المنبثقة التي تفتح عند النقر على أيقونة الإضافة لاختيار (المحلي / السحابي).
    • popup.js الكود البرمجي للقائمة لحفظ رابط السيرفر وإرسال أمر بدء العزل إلى مشغل الفيديو.
    • content.js المحرك التنفيذي داخل يوتيوب؛ يقوم بكتم صوت الفيديو الأصلي وتشغيل الصوت النقي ومزامنته فورياً مع الصورة (Drift Guard).
    • naqawa.png أيقونة وشعار الإضافة الذي يظهر في شريط أدوات المتصفح.
  2. الخطوة 2: الدخول لصفحة الإضافات:
    افتح متصفحك واكتب في شريط العناوين: chrome://extensions (أو edge://extensions في متصفح Microsoft Edge).
  3. الخطوة 3: التفعيل وتحميل المجلد:
    فعّل وضع المطور (Developer mode) في الزاوية العلوية، ثم اضغط على زر تحميل حزمة غير مضغوطة (Load unpacked)، واختر المجلد المستقل الذي يحتوي على ملف manifest.json مباشرة.
🎉 مبروك! ستظهر أيقونة «نقاوة» في شريط أدوات متصفحك وأصبحت جاهزة للاستخدام دائماً.

شرح التشغيل السحابي (Google Colab)

استخدم كرت شاشة سحابي مجاني (Tesla T4) بدون استهلاك موارد جهازك

  1. افتح موقع Google Colab وسجّل الدخول بحسابك.
  2. اضغط على New notebook (دفتر ملاحظات جديد).
  3. من القائمة العلوية اضغط على Edit ثم اختر Notebook settings.
  4. من خانة Hardware accelerator، اختر T4 GPU ثم اضغط Save.
  5. الصق كود السيرفر أدناه في الخلية واضغط على زر التشغيل Run ▶️:
Colab Script
# 1. إغلاق أي جلسات قديمة
!fuser -k 8000/tcp 2>/dev/null
!pkill -f cloudflared 2>/dev/null

# 2. تثبيت الحزم المطلوبة وأداة النفق
!wget -q -nc -O /usr/local/bin/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
!chmod +x /usr/local/bin/cloudflared
!pip install -q -U --no-cache-dir yt-dlp demucs soundfile scipy fastapi uvicorn requests

import os, glob, shutil, subprocess, threading, time, re
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse, JSONResponse
import uvicorn, yt_dlp

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

CACHE_DIR = "/content/audio_cache"
os.makedirs(CACHE_DIR, exist_ok=True)
COOKIE_FILE = "/content/cookies.txt"

# استخراج ID الفيديو محلياً بدون إرسال أي استعلام ليوتيوب
def extract_video_id(url: str):
    patterns = [
        r'(?:v=|\/)([0-9A-Za-z_-]{11})(?:[&?]|$)',
        r'youtu\.be\/([0-9A-Za-z_-]{11})',
        r'embed\/([0-9A-Za-z_-]{11})',
        r'shorts\/([0-9A-Za-z_-]{11})'
    ]
    for pattern in patterns:
        match = re.search(pattern, url)
        if match:
            return match.group(1)
    return None

@app.get("/")
def health():
    return {"status": "online", "gpu": "Tesla T4", "has_cookies": os.path.exists(COOKIE_FILE)}

@app.get("/process")
@app.post("/process")
async def process_video(url: str):
    print(f"\n🚀 [طلب معالجة سحابي]: {url}")

    video_id = extract_video_id(url)
    if not video_id:
        return JSONResponse(status_code=400, content={"detail": "رابط الفيديو غير صالح"})

    cached_file = os.path.join(CACHE_DIR, f"{video_id}.mp3")
    if os.path.exists(cached_file):
        print(f"⚡ [الكاش] المقطع {video_id} معالج مسبقاً! إرسال فوري...")
        return {"status": "ready", "video_id": video_id}

    work_dir = f"/content/work_{video_id}"
    os.makedirs(work_dir, exist_ok=True)
    raw_template = os.path.join(work_dir, "raw_audio.%(ext)s")

    try:
        print(f"⬇️ [1/3] جاري سحب الصوت للمقطع ({video_id})...")
        download_opts = {
            'format': 'bestaudio/best',
            'outtmpl': raw_template,
            'quiet': True,
            'no_warnings': True,
        }

        # استخدام الكوكيز إن وُجد لتفادي الحظر تماماً
        if os.path.exists(COOKIE_FILE):
            download_opts['cookiefile'] = COOKIE_FILE
            print("🍪 تم تفعيل مصادقة الكوكيز بنجاح.")

        with yt_dlp.YoutubeDL(download_opts) as ydl:
            ydl.download([f"https://www.youtube.com/watch?v={video_id}"])

        downloaded = glob.glob(os.path.join(work_dir, "raw_audio.*"))
        if not downloaded:
            raise Exception("تعذر العثور على ملف الصوت بعد التنزيل")
        raw_file = downloaded[0]

        print("🎛️ [2/3] تحويل الصوت إلى WAV...")
        input_wav = os.path.join(work_dir, "input.wav")
        subprocess.run(["ffmpeg", "-y", "-i", raw_file, "-vn", "-ar", "44100", "-ac", "2", input_wav], check=True)

        print("🧠 [3/3] تشغيل Demucs بالذكاء الاصطناعي على GPU T4...")
        cmd = ["demucs", "--two-stems", "vocals", "-d", "cuda", "-n", "htdemucs", "-o", work_dir, input_wav]
        res = subprocess.run(cmd, capture_output=True, text=True)
        if res.returncode != 0:
            raise Exception(f"خطأ Demucs: {res.stderr[:200]}")

        vocals_list = glob.glob(os.path.join(work_dir, "**", "vocals.wav"), recursive=True)
        if not vocals_list:
            raise Exception("فشل في استخراج vocals.wav")
        vocals_path = vocals_list[0]

        print("💾 تصدير وحفظ المسار الصوتي النقي...")
        subprocess.run(["ffmpeg", "-y", "-i", vocals_path, "-b:a", "192k", cached_file], check=True)

        shutil.rmtree(work_dir, ignore_errors=True)
        print(f"✅ تمت المعالجة بنجاح للمقطع: {video_id}")
        return {"status": "ready", "video_id": video_id}

    except Exception as e:
        shutil.rmtree(work_dir, ignore_errors=True)
        print(f"❌ خطأ أثناء المعالجة: {e}")
        return JSONResponse(status_code=500, content={"detail": f"خطأ المعالجة: {str(e)}"})

@app.get("/audio/{video_id}")
async def stream(video_id: str):
    file_path = os.path.join(CACHE_DIR, f"{video_id}.mp3")
    if os.path.exists(file_path):
        return FileResponse(file_path, media_type="audio/mpeg")
    raise HTTPException(status_code=404, detail="الملف غير موجود")

# تشغيل السيرفر
threading.Thread(target=lambda: uvicorn.run(app, host="127.0.0.1", port=8000, log_level="warning"), daemon=True).start()
time.sleep(2)

# إطلاق النفق واستخراج الرابط
tunnel = subprocess.Popen(["cloudflared", "tunnel", "--url", "http://127.0.0.1:8000"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)

public_url = None
for line in tunnel.stdout:
    m = re.search(r'https://[a-zA-Z0-9-]+\.trycloudflare\.com', line)
    if m:
        public_url = m.group(0)
        break

print("\n" + "="*60)
print(f"🔥 انسخ هذا الرابط وضعه في الإضافة:\n{public_url}")
print("="*60 + "\n")
💡 ملاحظات هامة لتشغيل السحابي:
  • إبقاء الصفحة مفتوحة: يجب إبقاء تبويب Google Colab مفتوحاً في متصفحك لكي يستمر السيرفر في العمل ومعالجة المقاطع.
  • استخدام الرابط عدة مرات: يمكنك استخدام نفس الرابط لعدد لا نهائي من المقاطع طالما الصفحة مفتوحة دون الحاجة لإعادة تشغيل الخلية في كل مرة.
  • حل المشاكل وإعادة التعيين: إذا لم يعمل الكود أو واجهت أي تعثر، اذهب إلى القائمة العلوية Runtime ➡️ Disconnect and delete runtime (قطع الاتصال وحذف بيئة التشغيل) لتصفير الذاكرة، ثم أعد تشغيل الخلية من جديد لتوليد رابط جديد.

شرح التشغيل المحلي (على حاسوبك)

شغّل المعالجة محلياً عبر معالجك (CPU) أو كرت الشاشة (NVIDIA GPU)

الخطوة 1: تحميل ملف السيرفر المحلي جاهزاً

حدد نظام التشغيل لديك:
حدد جهاز المعالجة في حاسوبك:
⚙️ الخطوة 2: التثبيت الأولي (يتم تنفيذه لمرة واحدة فقط)

افتح موجه الأوامر (CMD أو Terminal)، ونفّذ الأوامر التالية بالترتيب (سيتم إنشاء كل شيء وتشغيله داخل مجلد التنزيلات Downloads تلقائياً):

أوامر التثبيت الأولي

          
🚀 الخطوة 3: طريقة الاستخدام اليومية (كلما أردت استخدام الإضافة)
لن تحتاج لتثبيت أي شيء مجدداً! في كل مرة تفتح فيها حاسوبك وتريد فصل الموسيقى، اكتب هذا الأمر البسيط فقط لتشغيل السيرفر:
أمر التشغيل اليومي

          
💡 أين تُحفظ المقاطع المعالجة؟
تُحفظ تلقائياً في مجلد audio_cache داخل مجلد التنزيلات بجانب ملف السيرفر. يمكنك تغيير المسار بتمرير الأمر: --cache-dir "مسار_المجلد_الجديد" عند تشغيل السيرفر.

الشفافية وطريقة الحذف الكامل

ماذا يحدث في نظامك؟ وكيف تحذف الأداة كلياً بنقرة واحدة دون ترك أي أثر

🔍 1. ماذا يحدث في نظامك عند التثبيت؟ (Linux & Windows)

📦 عزل تام (Zero Pollution)

جميع مكتبات الذكاء الاصطناعي (PyTorch, Demucs) تُثبت داخل مجلد البيئة naqawa_env فقط، ولا يتم تعديل أو تنزيل أي شيء في بايثون النظام أو مسارات النظام العامة.

🧹 لا مساس بالسجل أو الإعدادات

على نظام Windows لا يتم تعديل الـ Registry أبداً، وعلى Linux لا يتم تعديل أي ملفات ضبط بالنظام (Config files). الأداة محمولة بالكامل (Portable).

🔒 خصوصية وأمان مطلق

في الخيار المحلي، تُعالج المقاطع وتُحفظ داخل مجلد audio_cache على قرصك، ولا يخرج أي مسار صوتي أو رابط خارج شبكتك الخاصة.

🗑️ 2. طريقة الحذف والإزالة الكاملة (Clean Uninstall)
  1. الخطوة 1: إزالة الإضافة من المتصفح: اضغط بالزر الأيمن على أيقونة «نقاوة» في شريط أدوات المتصفح واختر «إزالة من Chrome...» (Remove from Chrome).
  2. الخطوة 2: إزالة السيرفر ومكتباته واستعادة المساحة: لحذف كافة الملفات والمكتبات المعزولة ومجلدات الكاش، اختر نظامك ونفّذ أمر الحذف أدناه في الطرفية/CMD بمجلد المشروع:
أمر الحذف الكامل (Linux)

        
الخطوة 3: حذف مجلد الإضافة يدوياً: الملفات الوحيدة المتبقية على جهازك ستكون مجلد الإضافة الذي قمت بفكه من naqawa.zip، ويمكنك حذفه يدوياً كأي مجلد عادي في أي وقت.
💡 بخصوص البرامج المساعدة الإضافية (Windows):
  • بايثون (Python 3.13+): إن قمت بتثبيته من Microsoft Store، يمكنك تركه في جهازك للاستفادة منه، أو إلغاء تثبيته بسهولة بالبحث عنه في قائمة ابدأ ⬅️ كليك يمين ⬅️ إلغاء التثبيت (Uninstall).
  • حزمة Visual C++ (vc_redist x64): يُنصح بشدة بتركها على جهازك لأنها حزمة نظام أساسية ومفيدة للألعاب ومعظم برامج ويندوز، ولكن يمكنك حذفها من لوحة التحكم (Settings ⬅️ Apps ⬅️ Installed Apps) إن أردت ذلك.
⚠️ النتيجة بعد الحذف: يُحذف مجلد البيئة وكافة المقاطع المعالجة وملفات التخزين المؤقت وملف السيرفر نهائياً، ويعود حاسوبك نظيفاً تماماً بنسبة 100% كما كان قبل التثبيت.