أداة مفتوحة المصدر لفصل الآلات الموسيقية عن الصوت البشري في مقاطع اليوتيوب بجودة جيدة وبدون أي تكاليف.
نظام Drift Guard يطابق حركة الصوت و الصورة حتى عند التقديم وتغيير السرعات.
يعتمد على خوارزميات الذكاء الاصطناعي لفصل الترددات.
خيارات متعددة: تشغيل سحابي مجاني على كروت Tesla T4 أو تشغيل محلي دون إرسال بيانات.
متوافق مع جميع متصفحات Chromium (Chrome / Edge / Brave / CachyOS Browser)
chrome://extensions (أو edge://extensions في متصفح Microsoft Edge).
manifest.json مباشرة.
استخدم كرت شاشة سحابي مجاني (Tesla T4) بدون استهلاك موارد جهازك
# 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")
شغّل المعالجة محلياً عبر معالجك (CPU) أو كرت الشاشة (NVIDIA GPU)
افتح موجه الأوامر (CMD أو Terminal)، ونفّذ الأوامر التالية بالترتيب (سيتم إنشاء كل شيء وتشغيله داخل مجلد التنزيلات Downloads تلقائياً):
audio_cache داخل مجلد التنزيلات بجانب ملف السيرفر. يمكنك تغيير المسار بتمرير الأمر: --cache-dir "مسار_المجلد_الجديد" عند تشغيل السيرفر.
ماذا يحدث في نظامك؟ وكيف تحذف الأداة كلياً بنقرة واحدة دون ترك أي أثر
جميع مكتبات الذكاء الاصطناعي (PyTorch, Demucs) تُثبت داخل مجلد البيئة naqawa_env فقط، ولا يتم تعديل أو تنزيل أي شيء في بايثون النظام أو مسارات النظام العامة.
على نظام Windows لا يتم تعديل الـ Registry أبداً، وعلى Linux لا يتم تعديل أي ملفات ضبط بالنظام (Config files). الأداة محمولة بالكامل (Portable).
في الخيار المحلي، تُعالج المقاطع وتُحفظ داخل مجلد audio_cache على قرصك، ولا يخرج أي مسار صوتي أو رابط خارج شبكتك الخاصة.
naqawa.zip، ويمكنك حذفه يدوياً كأي مجلد عادي في أي وقت.