Yousefsg commited on
Commit
f3e6d78
·
verified ·
1 Parent(s): bdfa91b

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +391 -0
  2. requirements.txt +16 -0
app.py ADDED
@@ -0,0 +1,391 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import subprocess
3
+ import os
4
+ import gradio as gr
5
+ import json
6
+ from datetime import datetime
7
+ import tempfile
8
+ from PIL import Image
9
+ import cv2
10
+ import numpy as np
11
+ from huggingface_hub import snapshot_download
12
+ import gc
13
+ import psutil
14
+
15
+ # =============================================================================
16
+ # قسم الإعدادات الأولية
17
+ # =============================================================================
18
+
19
+ print("\n--- بدء الإعدادات الأولية ---")
20
+
21
+ # التحقق من GPU المتاح ومساحة القرص
22
+ print("\n[1/4] التحقق من موارد النظام...")
23
+ if torch.cuda.is_available():
24
+ gpu_name = torch.cuda.get_device_name(0)
25
+ gpu_memory = torch.cuda.get_device_properties(0).total_memory / 1024**3
26
+ print(f"✅ GPU متاح: {gpu_name}")
27
+ print(f"📊 ذاكرة GPU: {gpu_memory:.1f} GB")
28
+ if gpu_memory < 15:
29
+ print("⚠️ تحذير: قد تحتاج إلى GPU بذاكرة أكبر للحصول على أفضل أداء.")
30
+ else:
31
+ print("❌ لا يوجد GPU متاح. يُنصح بتفعيل GPU في إعدادات Colab أو استخدام بيئة تدعم GPU.")
32
+
33
+ try:
34
+ disk_usage = subprocess.check_output(["df", "-h", "/"]).decode("utf-8")
35
+ print("\n💾 مساحة القرص:")
36
+ print(disk_usage.split("\n")[1])
37
+ except Exception as e:
38
+ print(f"❌ خطأ في التحقق من مساحة القرص: {e}")
39
+
40
+ # تحميل مستودع AccVideo AI
41
+ print("\n[3/4] تحميل مستودع AccVideo AI...")
42
+ accvideo_path = "/tmp/AccVideo"
43
+ if not os.path.exists(accvideo_path):
44
+ try:
45
+ subprocess.run(["git", "clone", "https://github.com/aejion/AccVideo.git", "/tmp/AccVideo"], check=True)
46
+ print("✅ تم تحميل AccVideo بنجاح!")
47
+ except Exception as e:
48
+ print(f"❌ خطأ في تحميل AccVideo: {e}")
49
+ else:
50
+ print("✅ AccVideo موجود بالفعل!")
51
+
52
+ # الانتقال إلى مجلد AccVideo وتثبيت متطلباته
53
+ print("\n[4/4] الانتقال إلى مجلد AccVideo وتثبيت متطلباته...")
54
+ try:
55
+ os.chdir(accvideo_path)
56
+ print(f"📁 المجلد الحالي: {os.getcwd()}")
57
+ if os.path.exists("requirements.txt"):
58
+ subprocess.run(["pip", "install", "-r", "requirements.txt"], check=True)
59
+ print("✅ تم تثبيت متطلبات AccVideo!")
60
+ else:
61
+ print("⚠️ ملف requirements.txt غير موجود في مجلد AccVideo.")
62
+ except Exception as e:
63
+ print(f"❌ خطأ في الانتقال أو تثبيت المتطلبات: {e}")
64
+
65
+ print("\n--- انتهت الإعدادات الأولية ---")
66
+
67
+ # =============================================================================
68
+ # وظائف تحميل النموذج وإنشاء الفيديو
69
+ # =============================================================================
70
+
71
+ # خيارات النماذج المتاحة
72
+ models_info = {
73
+ "HunyuanT2V (الأساسي)": {
74
+ "repo_id": "aejion/AccVideo",
75
+ "local_dir": "./ckpts",
76
+ "description": "نموذج أساسي لتحويل النص إلى فيديو"
77
+ },
78
+ "WanX-T2V-14B (متقدم)": {
79
+ "repo_id": "aejion/AccVideo-WanX-T2V-14B",
80
+ "local_dir": "./wanx_t2v_ckpts",
81
+ "description": "نموذج متقدم عالي الجودة للنص إلى فيديو"
82
+ },
83
+ "WanX-I2V-480P-14B (صورة إلى فيديو)": {
84
+ "repo_id": "aejion/AccVideo-WanX-I2V-480P-14B",
85
+ "local_dir": "./wanx_i2v_ckpts",
86
+ "description": "نموذج لتحويل الصورة إلى فيديو"
87
+ }
88
+ }
89
+
90
+ # متغيرات عامة لحالة النموذج
91
+ current_model = None
92
+ model_type = None
93
+
94
+ def download_model_from_hf(selected_model_name):
95
+ """تحميل النموذج المحدد من Hugging Face"""
96
+ model_info = models_info[selected_model_name]
97
+ print(f"🔄 جاري تحميل {selected_model_name}...")
98
+ print(f"📝 الوصف: {model_info['description']}")
99
+
100
+ try:
101
+ if not os.path.exists(model_info["local_dir"]):
102
+ snapshot_download(
103
+ repo_id=model_info["repo_id"],
104
+ local_dir=model_info["local_dir"],
105
+ local_dir_use_symlinks=False
106
+ )
107
+ print(f"✅ تم تحميل {selected_model_name} بنجاح!")
108
+ else:
109
+ print(f"✅ {selected_model_name} موجود بالفعل!")
110
+ return True
111
+ except Exception as e:
112
+ print(f"❌ خطأ في تحميل النموذج: {str(e)}")
113
+ return False
114
+
115
+ def load_model(model_choice):
116
+ """تحميل النموذج المحدد وتحديث الحالة العالمية"""
117
+ global current_model, model_type
118
+
119
+ if not download_model_from_hf(model_choice):
120
+ return "❌ فشل تحميل النموذج. يرجى التحقق من الاتصال بالإنترنت أو مساحة القرص."
121
+
122
+ try:
123
+ if model_choice == "HunyuanT2V (الأساسي)":
124
+ model_type = "hunyuan"
125
+ return "✅ تم تحميل نموذج HunyuanT2V بنجاح!"
126
+
127
+ elif model_choice == "WanX-T2V-14B (متقدم)":
128
+ model_type = "wanx_t2v"
129
+ return "✅ تم تحميل نموذج WanX-T2V-14B بنجاح!"
130
+
131
+ elif model_choice == "WanX-I2V-480P-14B (صورة إلى فيديو)":
132
+ model_type = "wanx_i2v"
133
+ return "✅ تم تحميل نموذج WanX-I2V-480P-14B بنجاح!"
134
+
135
+ except Exception as e:
136
+ return f"❌ خطأ في إعداد النموذج: {str(e)}"
137
+
138
+ def generate_video(prompt, image_input, width, height, num_frames, steps, guidance_scale, seed):
139
+ """إنشاء الفيديو بناءً على المدخلات ونوع النموذج المحدد"""
140
+ global model_type
141
+
142
+ if model_type is None:
143
+ return None, "❌ يرجى تحميل النموذج أولاً من علامة تبويب 'إعداد النموذج'."
144
+
145
+ try:
146
+ # إنشاء مجلد النتائج
147
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
148
+ output_dir = os.path.join(os.getcwd(), "results", f"video_{timestamp}")
149
+ os.makedirs(output_dir, exist_ok=True)
150
+
151
+ # حفظ النص في ملف
152
+ prompt_file = os.path.join(output_dir, "prompt.txt")
153
+ with open(prompt_file, "w", encoding="utf-8") as f:
154
+ f.write(prompt)
155
+
156
+ cmd = []
157
+ # تحديد الأمر حسب نوع النموذج
158
+ if model_type == "hunyuan":
159
+ cmd = [
160
+ "python", "sample_t2v.py",
161
+ "--height", str(height),
162
+ "--width", str(width),
163
+ "--num_frames", str(num_frames),
164
+ "--num_inference_steps", str(steps),
165
+ "--guidance_scale", "1",
166
+ "--embedded_cfg_scale", str(guidance_scale),
167
+ "--flow_shift", "7",
168
+ "--flow-reverse",
169
+ "--prompt_file", prompt_file,
170
+ "--seed", str(seed),
171
+ "--output_path", output_dir,
172
+ "--model_path", "./ckpts",
173
+ "--dit-weight", "./ckpts/accvideo-t2v-5-steps/diffusion_pytorch_model.pt"
174
+ ]
175
+
176
+ elif model_type == "wanx_t2v":
177
+ cmd = [
178
+ "python", "sample_wanx_t2v.py",
179
+ "--task", "t2v-14B",
180
+ "--size", f"{width}*{height}",
181
+ "--ckpt_dir", "./wanx_t2v_ckpts",
182
+ "--sample_solver", "unipc",
183
+ "--save_dir", output_dir,
184
+ "--sample_steps", str(steps),
185
+ "--prompt", prompt
186
+ ]
187
+
188
+ elif model_type == "wanx_i2v":
189
+ if image_input is None:
190
+ return None, "❌ يرجى رفع صورة لاستخدام نموذج الصورة إلى فيديو."
191
+
192
+ # حفظ الصورة المدخلة
193
+ image_path = os.path.join(output_dir, "input_image.jpg")
194
+ image_input.save(image_path)
195
+
196
+ cmd = [
197
+ "python", "sample_wanx_i2v.py",
198
+ "--task", "i2v-14B",
199
+ "--size", f"{width}*{height}",
200
+ "--ckpt_dir", "./wanx_i2v_ckpts",
201
+ "--sample_solver", "unipc",
202
+ "--save_dir", output_dir,
203
+ "--sample_steps", str(steps),
204
+ "--image_path", image_path,
205
+ "--prompt", prompt
206
+ ]
207
+
208
+ print(f'🔄 جاري إنشاء الفيديو... الأمر: {" ".join(cmd)}')
209
+
210
+ # تشغيل الأمر في مجلد AccVideo
211
+ result = subprocess.run(cmd, capture_output=True, text=True, cwd=os.getcwd())
212
+
213
+ if result.returncode == 0:
214
+ # البحث عن ملف الفيديو المُنتج
215
+ video_files = []
216
+ for root, dirs, files in os.walk(output_dir):
217
+ for file in files:
218
+ if file.endswith((".mp4", ".avi", ".mov")):
219
+ video_files.append(os.path.join(root, file))
220
+
221
+ if video_files:
222
+ video_path = video_files[0]
223
+ return video_path, f"✅ تم إنشاء الفيديو بنجاح!\n📁 المسار: {video_path}"
224
+ else:
225
+ return None, f"❌ لم يتم العثور على ملف فيديو في {output_dir}.\nالخرج: {result.stdout}\nالخطأ: {result.stderr}"
226
+ else:
227
+ error_msg = result.stderr if result.stderr else result.stdout
228
+ return None, f"❌ خطأ في إنشاء الفيديو:\n{error_msg}"
229
+
230
+ except Exception as e:
231
+ return None, f"❌ خطأ غير متوقع أثناء إنشاء الفيديو: {str(e)}"
232
+
233
+ print("✅ تم إعداد وظائف الواجهة بنجاح!")
234
+
235
+ # =============================================================================
236
+ # واجهة المس��خدم الرسومية (Gradio)
237
+ # =============================================================================
238
+
239
+ with gr.Blocks(title="AccVideo AI - مولد الفيديو بالذكاء الاصطناعي", theme=gr.themes.Soft()) as interface:
240
+
241
+ gr.HTML("""
242
+ <div style="text-align: center; padding: 20px;">
243
+ <h1>🎬 AccVideo AI</h1>
244
+ <h2>مولد الفيديو بالذكاء الاصطناعي</h2>
245
+ <p>إنشاء مقاطع فيديو عالية الجودة من النصوص والصور</p>
246
+ </div>
247
+ """)
248
+
249
+ with gr.Tab("🎯 إعداد النموذج"):
250
+ with gr.Row():
251
+ model_choice = gr.Dropdown(
252
+ choices=list(models_info.keys()),
253
+ value="HunyuanT2V (الأساسي)",
254
+ label="اختر النموذج",
255
+ )
256
+ load_btn = gr.Button("تحميل النموذج", variant="primary")
257
+
258
+ model_status = gr.Textbox(label="حالة النموذج", interactive=False)
259
+
260
+ load_btn.click(
261
+ fn=load_model,
262
+ inputs=[model_choice],
263
+ outputs=[model_status]
264
+ )
265
+
266
+ with gr.Tab("🎨 إنشاء الفيديو"):
267
+ with gr.Row():
268
+ with gr.Column(scale=1):
269
+ gr.HTML("<h3>📝 الإدخال</h3>")
270
+
271
+ prompt_input = gr.Textbox(
272
+ label="وصف الفيديو",
273
+ placeholder="اكتب وصفاً مفصلاً للفيديو الذي تريد إنشاءه...",
274
+ lines=3,
275
+ )
276
+
277
+ image_input = gr.Image(
278
+ label="الصورة المرجعية (اختياري)",
279
+ type="pil",
280
+ )
281
+
282
+ gr.HTML("<h3>⚙️ الإعدادات</h3>")
283
+
284
+ with gr.Row():
285
+ width_input = gr.Slider(
286
+ minimum=256, maximum=1280, value=832, step=64,
287
+ label="العرض",
288
+ )
289
+ height_input = gr.Slider(
290
+ minimum=256, maximum=720, value=480, step=64,
291
+ label="الارتفاع",
292
+ )
293
+
294
+ with gr.Row():
295
+ frames_input = gr.Slider(
296
+ minimum=16, maximum=120, value=81, step=1,
297
+ label="عدد الإطارات",
298
+ )
299
+ steps_input = gr.Slider(
300
+ minimum=5, maximum=20, value=10, step=1,
301
+ label="خطوات المعالجة",
302
+ )
303
+
304
+ with gr.Row():
305
+ guidance_input = gr.Slider(
306
+ minimum=1.0, maximum=10.0, value=6.0, step=0.5,
307
+ label="قوة التوجيه",
308
+ )
309
+ seed_input = gr.Number(
310
+ value=1024, label="البذرة",
311
+ )
312
+
313
+ generate_btn = gr.Button("🎬 إنشاء الفيديو", variant="primary", size="lg")
314
+
315
+ with gr.Column(scale=1):
316
+ gr.HTML("<h3>🎥 النتيجة</h3>")
317
+
318
+ video_output = gr.Video(
319
+ label="الفيديو المُنتج",
320
+ height=400
321
+ )
322
+
323
+ status_output = gr.Textbox(
324
+ label="حالة المعالجة",
325
+ lines=5,
326
+ interactive=False
327
+ )
328
+
329
+ # ربط الأحداث
330
+ generate_btn.click(
331
+ fn=generate_video,
332
+ inputs=[
333
+ prompt_input, image_input, width_input, height_input,
334
+ frames_input, steps_input, guidance_input, seed_input
335
+ ],
336
+ outputs=[video_output, status_output]
337
+ )
338
+
339
+ with gr.Tab("📚 المساعدة والنصائح"):
340
+ gr.HTML("""
341
+ <div style="text-align: center; padding: 20px;">
342
+ <h2>💡 نصائح للحصول على أفضل النتائج</h2>
343
+
344
+ <h3>📝 كتابة الوصف:</h3>
345
+ <ul>
346
+ <li>استخدم وصفاً واضحاً ومفصلاً</li>
347
+ <li>اذكر التفاصيل المهمة مثل الألوان والحركة والإضاءة</li>
348
+ <li>تجنب الوصف المعقد أو المتناقض</li>
349
+ <li>مثال جيد: "قطة برتقالية تلعب بكرة صوف حمراء في حديقة خضراء مشمسة"</li>
350
+ </ul>
351
+
352
+ <h3>⚙️ الإعدادات:</h3>
353
+ <ul>
354
+ <li><strong>الأبعاد:</strong> ابدأ بأبعاد صغيرة للاختبار (832x480)</li>
355
+ <li><strong>عدد الإطارات:</strong> 81 إطار ≈ 3 ثوانٍ، 120 إطار ≈ 4.5 ثانية</li>
356
+ <li><strong>خطوات المعالجة:</strong> 10 خطوات توازن جيد بين الجودة والسرعة</li>
357
+ <li><strong>قوة التوجيه:</strong> 6.0 قيمة جيدة للبداية</li>
358
+ </ul>
359
+
360
+ <h3>🚀 تحسين الأداء:</h3>
361
+ <ul>
362
+ <li>استخدم GPU عالي الأداء (T4 أو أفضل)</li>
363
+ <li>تأكد من وجود مساحة كافية على القرص</li>
364
+ <li>أغلق التطبيقات الأخرى لتوفير الذاكرة</li>
365
+ </ul>
366
+
367
+ <h3>🎯 النماذج المختلفة:</h3>
368
+ <ul>
369
+ <li><strong>HunyuanT2V:</strong> نموذج أساسي سريع</li>
370
+ <li><strong>WanX-T2V-14B:</strong> جودة عالية، يحتاج ذاكرة أكبر</li>
371
+ <li><strong>WanX-I2V-480P-14B:</strong> لتحويل الصور إلى فيديو</li>
372
+ </ul>
373
+
374
+ <h3>⏱️ أوقات المعالجة المتوقعة:</h3>
375
+ <ul>
376
+ <li>فيديو 832x480، 81 إطار: 2-5 دقائق</li>
377
+ <li>فيديو 1280x720، 120 إطار: 10-15 دقيقة</li>
378
+ </ul>
379
+ </div>
380
+ """)
381
+
382
+ # تشغيل الواجهة
383
+ if __name__ == "__main__":
384
+ interface.launch(
385
+ share=True,
386
+ debug=True,
387
+ server_name="0.0.0.0",
388
+ server_port=7860,
389
+ show_error=True
390
+ )
391
+
requirements.txt ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ torch==2.1.0
2
+ torchvision==0.16.0
3
+ torchaudio==2.1.0
4
+ transformers
5
+ diffusers
6
+ accelerate
7
+ xformers
8
+ opencv-python-headless
9
+ pillow
10
+ numpy
11
+ matplotlib
12
+ gradio==3.50.0
13
+ huggingface_hub
14
+ psutil
15
+ flash-attn==2.7.3
16
+