Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
|
@@ -6,15 +6,13 @@ from PIL import Image
|
|
| 6 |
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, DDIMScheduler
|
| 7 |
from controlnet_aux import CannyDetector
|
| 8 |
from diffusers.utils import load_image
|
| 9 |
-
# تم إزالة: from moviepy.editor import VideoFileClip
|
| 10 |
import os
|
| 11 |
import shutil
|
| 12 |
import tempfile
|
| 13 |
import datetime
|
| 14 |
-
import ffmpeg
|
| 15 |
|
| 16 |
# 1. تهيئة النموذج
|
| 17 |
-
# ... (كود التهيئة يبقى كما هو)
|
| 18 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 19 |
torch_dtype = torch.float16 if device == "cuda" else torch.float32
|
| 20 |
|
|
@@ -40,14 +38,11 @@ canny_processor = CannyDetector()
|
|
| 40 |
|
| 41 |
# 2. دالة معالجة الفيديو والنموذج
|
| 42 |
def colorize_video_multistyle(video_file, reference_image_path, prompt, style_choice, steps=25):
|
| 43 |
-
|
| 44 |
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
|
| 45 |
output_temp_video_no_audio = os.path.join(tempfile.gettempdir(), f"temp_colored_{timestamp}_no_audio.mp4")
|
| 46 |
final_output_name = f"colored_output_{timestamp}.mp4"
|
| 47 |
|
| 48 |
-
# === 1. استخراج الإطارات
|
| 49 |
-
# نستخدم FFMPEG-Python لاستخراج مسار ملف الصوت المؤقت
|
| 50 |
-
|
| 51 |
# 1.1 استخراج الصوت
|
| 52 |
audio_path = os.path.join(tempfile.gettempdir(), f"temp_audio_{timestamp}.aac")
|
| 53 |
try:
|
|
@@ -68,7 +63,7 @@ def colorize_video_multistyle(video_file, reference_image_path, prompt, style_ch
|
|
| 68 |
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
| 69 |
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
| 70 |
|
| 71 |
-
# 2. تجهيز المدخلات للنموذج
|
| 72 |
style_prompts = {
|
| 73 |
"Auto Color": "photorealistic color photo, cinematic, detailed, masterpiece",
|
| 74 |
"Vivid": "highly saturated, vibrant color photo, pop art colors",
|
|
@@ -86,7 +81,7 @@ def colorize_video_multistyle(video_file, reference_image_path, prompt, style_ch
|
|
| 86 |
break
|
| 87 |
|
| 88 |
pil_image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
|
| 89 |
-
canny_image = canny_processor(pil_image)
|
| 90 |
|
| 91 |
image_out = pipe(
|
| 92 |
prompt=final_prompt,
|
|
@@ -101,7 +96,6 @@ def colorize_video_multistyle(video_file, reference_image_path, prompt, style_ch
|
|
| 101 |
cap.release()
|
| 102 |
|
| 103 |
# 4. تجميع الإطارات في فيديو مؤقت (MP4) باستخدام OpenCV
|
| 104 |
-
# نستخدم MP4V-2 لتجنب الاعتماد على الترميز الخارجي
|
| 105 |
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
|
| 106 |
out = cv2.VideoWriter(output_temp_video_no_audio, fourcc, fps, (width, height))
|
| 107 |
|
|
@@ -128,22 +122,22 @@ def colorize_video_multistyle(video_file, reference_image_path, prompt, style_ch
|
|
| 128 |
# 6. تنظيف الملفات المؤقتة
|
| 129 |
if os.path.exists(audio_path):
|
| 130 |
os.remove(audio_path)
|
| 131 |
-
|
| 132 |
return final_output_name
|
| 133 |
|
| 134 |
-
# 3. واجهة Gradio النهائية
|
| 135 |
iface = gr.Interface(
|
| 136 |
fn=colorize_video_multistyle,
|
| 137 |
inputs=[
|
| 138 |
gr.Video(label="ملف الفيديو (إلزامي)"),
|
| 139 |
-
gr.Image(label="الصورة المرجعية (لنقل الألوان)", type="filepath"
|
| 140 |
-
gr.Textbox(label="المطالبة النصية (لتوجيه التلوين)",
|
| 141 |
gr.Dropdown(["Auto Color", "Vivid", "Vintage"], label="اختيار النمط المسبق", value="Auto Color"),
|
| 142 |
-
gr.Slider(minimum=10, maximum=50, step=5, value=25, label="خطوات التوليد
|
| 143 |
],
|
| 144 |
outputs=gr.Video(label="الفيديو الملون (MP4)"),
|
| 145 |
title="🎨 Multi-Style Video Colorizer",
|
| 146 |
-
description="تلوين احترافي للفيديو باستخدام ControlNet
|
| 147 |
)
|
| 148 |
|
| 149 |
if __name__ == "__main__":
|
|
|
|
| 6 |
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, DDIMScheduler
|
| 7 |
from controlnet_aux import CannyDetector
|
| 8 |
from diffusers.utils import load_image
|
|
|
|
| 9 |
import os
|
| 10 |
import shutil
|
| 11 |
import tempfile
|
| 12 |
import datetime
|
| 13 |
+
import ffmpeg
|
| 14 |
|
| 15 |
# 1. تهيئة النموذج
|
|
|
|
| 16 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 17 |
torch_dtype = torch.float16 if device == "cuda" else torch.float32
|
| 18 |
|
|
|
|
| 38 |
|
| 39 |
# 2. دالة معالجة الفيديو والنموذج
|
| 40 |
def colorize_video_multistyle(video_file, reference_image_path, prompt, style_choice, steps=25):
|
|
|
|
| 41 |
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
|
| 42 |
output_temp_video_no_audio = os.path.join(tempfile.gettempdir(), f"temp_colored_{timestamp}_no_audio.mp4")
|
| 43 |
final_output_name = f"colored_output_{timestamp}.mp4"
|
| 44 |
|
| 45 |
+
# === 1. استخراج الإطارات والصوت ===
|
|
|
|
|
|
|
| 46 |
# 1.1 استخراج الصوت
|
| 47 |
audio_path = os.path.join(tempfile.gettempdir(), f"temp_audio_{timestamp}.aac")
|
| 48 |
try:
|
|
|
|
| 63 |
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
| 64 |
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
| 65 |
|
| 66 |
+
# 2. تجهيز المدخلات للنموذج
|
| 67 |
style_prompts = {
|
| 68 |
"Auto Color": "photorealistic color photo, cinematic, detailed, masterpiece",
|
| 69 |
"Vivid": "highly saturated, vibrant color photo, pop art colors",
|
|
|
|
| 81 |
break
|
| 82 |
|
| 83 |
pil_image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
|
| 84 |
+
canny_image = canny_processor(pil_image)
|
| 85 |
|
| 86 |
image_out = pipe(
|
| 87 |
prompt=final_prompt,
|
|
|
|
| 96 |
cap.release()
|
| 97 |
|
| 98 |
# 4. تجميع الإطارات في فيديو مؤقت (MP4) باستخدام OpenCV
|
|
|
|
| 99 |
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
|
| 100 |
out = cv2.VideoWriter(output_temp_video_no_audio, fourcc, fps, (width, height))
|
| 101 |
|
|
|
|
| 122 |
# 6. تنظيف الملفات المؤقتة
|
| 123 |
if os.path.exists(audio_path):
|
| 124 |
os.remove(audio_path)
|
| 125 |
+
|
| 126 |
return final_output_name
|
| 127 |
|
| 128 |
+
# 3. واجهة Gradio النهائية
|
| 129 |
iface = gr.Interface(
|
| 130 |
fn=colorize_video_multistyle,
|
| 131 |
inputs=[
|
| 132 |
gr.Video(label="ملف الفيديو (إلزامي)"),
|
| 133 |
+
gr.Image(label="الصورة المرجعية (لنقل الألوان)", type="filepath"),
|
| 134 |
+
gr.Textbox(label="المطالبة النصية (لتوجيه التلوين)", value=""),
|
| 135 |
gr.Dropdown(["Auto Color", "Vivid", "Vintage"], label="اختيار النمط المسبق", value="Auto Color"),
|
| 136 |
+
gr.Slider(minimum=10, maximum=50, step=5, value=25, label="خطوات التوليد")
|
| 137 |
],
|
| 138 |
outputs=gr.Video(label="الفيديو الملون (MP4)"),
|
| 139 |
title="🎨 Multi-Style Video Colorizer",
|
| 140 |
+
description="تلوين احترافي للفيديو باستخدام ControlNet."
|
| 141 |
)
|
| 142 |
|
| 143 |
if __name__ == "__main__":
|