Spaces:
Running on Zero
Running on Zero
Update app.py
Browse files
app.py
CHANGED
|
@@ -2461,38 +2461,49 @@ def apply_example(idx: str):
|
|
| 2461 |
|
| 2462 |
# --- توابع کنترل کننده (بدون وابستگی محلی) ---
|
| 2463 |
|
| 2464 |
-
def ui_lock_and_enhance(first_frame, prompt, mode):
|
| 2465 |
"""
|
| 2466 |
-
مرحله ۱: قفل کردن UI و ا
|
| 2467 |
"""
|
| 2468 |
-
|
| 2469 |
-
|
| 2470 |
-
|
| 2471 |
-
|
| 2472 |
-
|
| 2473 |
-
|
| 2474 |
-
|
| 2475 |
-
|
| 2476 |
-
|
| 2477 |
-
|
| 2478 |
-
|
| 2479 |
-
|
| 2480 |
-
|
| 2481 |
-
|
| 2482 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2483 |
|
| 2484 |
@spaces.GPU(duration=get_duration)
|
| 2485 |
def ui_generate_video(
|
| 2486 |
first_frame, end_frame, enhanced_prompt, duration, input_video,
|
| 2487 |
-
radioanimated_mode,
|
| 2488 |
height, width, camera_lora, audio_input, progress=gr.Progress(track_tqdm=True)
|
| 2489 |
):
|
| 2490 |
"""
|
| 2491 |
مرحله ۲: ساخت ویدیو با استفاده از GPU
|
| 2492 |
"""
|
|
|
|
|
|
|
| 2493 |
video_path = generate_video(
|
| 2494 |
first_frame, end_frame, enhanced_prompt, duration, input_video,
|
| 2495 |
-
radioanimated_mode,
|
| 2496 |
height, width, camera_lora, audio_input, progress
|
| 2497 |
)
|
| 2498 |
return (
|
|
@@ -2636,20 +2647,16 @@ with gr.Blocks(title="LTX-2 Video Distilled 🎥🔈") as demo:
|
|
| 2636 |
audio_ui = AudioDropUpload(target_audio_elem_id="audio_input_hidden", elem_id="audio_ui")
|
| 2637 |
prompt = gr.Textbox(label="Prompt", value="این تصویر را با حرکت سینمایی و انیمیشن روان زنده کن", lines=3, max_lines=3, visible=False)
|
| 2638 |
|
| 2639 |
-
enhance_prompt_flag_input = gr.Checkbox(label="Enhance Prompt", value=False, visible=False)
|
| 2640 |
-
|
| 2641 |
with gr.Accordion("تنظیمات پیشرفته", open=False, visible=False):
|
| 2642 |
seed = gr.Slider(label="سید (Seed)", minimum=0, maximum=MAX_SEED, value=DEFAULT_SEED, step=1)
|
| 2643 |
randomize_seed = gr.Checkbox(label="استفاده از سید تصادفی", value=True)
|
| 2644 |
|
| 2645 |
with gr.Column(elem_id="step-column"):
|
| 2646 |
-
# پارامتر interactive=False در اینجا اضافه شد تا امکان آپلود غیرفعال شود
|
| 2647 |
output_video = gr.Video(label="ویدیوی ساخته شده", autoplay=True, height=512, interactive=False)
|
| 2648 |
with gr.Row():
|
| 2649 |
download_btn = gr.Button("📥 دانلود ویدیو", variant="secondary", size="sm", scale=0, visible=False)
|
| 2650 |
with gr.Row(elem_id="controls-row"):
|
| 2651 |
-
|
| 2652 |
-
duration_ui = CameraDropdown(choices=["3s", "5s", "8s", "10s"], value="5s", title="مدت زمان ویدیو", elem_id="duration_ui")
|
| 2653 |
duration = gr.Slider(label="Duration (seconds)", minimum=1.0, maximum=10.0, value=5.0, step=0.1, visible=False)
|
| 2654 |
ICON_16_9, ICON_1_1, ICON_9_16 = ("<svg viewBox='0 0 24 24' fill='none' aria-hidden='true'><rect x='3' y='7' width='18' height='10' rx='2' stroke='currentColor' stroke-width='2'/></svg>", "<svg viewBox='0 0 24 24' fill='none' aria-hidden='true'><rect x='6' y='6' width='12' height='12' rx='2' stroke='currentColor' stroke-width='2'/></svg>", "<svg viewBox='0 0 24 24' fill='none' aria-hidden='true'><rect x='7' y='3' width='10' height='18' rx='2' stroke='currentColor' stroke-width='2'/></svg>")
|
| 2655 |
resolution_ui = CameraDropdown(choices=[{"label": "16:9", "value": "16:9", "icon": ICON_16_9}, {"label": "1:1", "value": "1:1", "icon": ICON_1_1}, {"label": "9:16", "value": "9:16", "icon": ICON_9_16}], value="16:9", title="ابعاد تصویر", elem_id="resolution_ui")
|
|
@@ -2658,9 +2665,17 @@ with gr.Blocks(title="LTX-2 Video Distilled 🎥🔈") as demo:
|
|
| 2658 |
camera_ui = CameraDropdown(choices=[name for name, _ in VISIBLE_RUNTIME_LORA_CHOICES], value="No LoRA", title="افکت دوربین (LoRA)", elem_id="camera_ui")
|
| 2659 |
camera_lora = gr.Dropdown(label="Camera Control LoRA", choices=[name for name, _ in VISIBLE_RUNTIME_LORA_CHOICES], value="No LoRA", visible=False)
|
| 2660 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2661 |
generate_btn = gr.Button("🤩 ساخت ویدیو", variant="primary", elem_classes="button-gradient", elem_id="generate_btn")
|
| 2662 |
|
| 2663 |
-
# توجه مهم: این دکمه دیگر visible=False نیست تا از DOM حذف نشود. توسط CSS بالا مخفی شده است.
|
| 2664 |
reset_btn = gr.Button("Reset", elem_id="reset_btn")
|
| 2665 |
|
| 2666 |
# اتصال رویدادها
|
|
@@ -2672,8 +2687,6 @@ with gr.Blocks(title="LTX-2 Video Distilled 🎥🔈") as demo:
|
|
| 2672 |
audio_ui.change(fn=lambda v: None if v == "__CLEAR__" or not v else gr.update(), inputs=audio_ui, outputs=audio_input, api_visibility="private")
|
| 2673 |
download_btn.click(fn=None, inputs=[output_video], js=js_download_video)
|
| 2674 |
|
| 2675 |
-
# *** رویداد جادویی برای شکستن قفل گاردریو ***
|
| 2676 |
-
# پارامتر queue=False باعث میشود اگر گاردریو در صف گیر کرده باشد، این دستور معطل نشود و فوراً اجرا شود
|
| 2677 |
reset_btn.click(
|
| 2678 |
fn=lambda: gr.Button(value="🤩 ساخت ویدیو", interactive=True),
|
| 2679 |
inputs=[],
|
|
@@ -2682,16 +2695,16 @@ with gr.Blocks(title="LTX-2 Video Distilled 🎥🔈") as demo:
|
|
| 2682 |
queue=False
|
| 2683 |
)
|
| 2684 |
|
| 2685 |
-
# زنجیره اصلی ساخت ویدیو
|
| 2686 |
generate_btn.click(
|
| 2687 |
fn=ui_lock_and_enhance,
|
| 2688 |
-
inputs=[first_frame, prompt, radioanimated_mode],
|
| 2689 |
outputs=[generate_btn, prompt_ui, prompt, output_video]
|
| 2690 |
).then(
|
| 2691 |
fn=ui_generate_video,
|
| 2692 |
inputs=[
|
| 2693 |
first_frame, end_frame, prompt,
|
| 2694 |
-
duration, input_video, radioanimated_mode,
|
| 2695 |
seed, randomize_seed, height, width, camera_lora, audio_input
|
| 2696 |
],
|
| 2697 |
outputs=[generate_btn, output_video, download_btn]
|
|
|
|
| 2461 |
|
| 2462 |
# --- توابع کنترل کننده (بدون وابستگی محلی) ---
|
| 2463 |
|
| 2464 |
+
def ui_lock_and_enhance(first_frame, prompt, mode, enhance_toggle):
|
| 2465 |
"""
|
| 2466 |
+
مرحله ۱: قفل کردن UI و بررسی اینکه آیا پرامپت نیاز به بهینهسازی دارد یا خیر
|
| 2467 |
"""
|
| 2468 |
+
if enhance_toggle == "✨ دستور بهینه شود":
|
| 2469 |
+
yield (
|
| 2470 |
+
gr.Button(value="⏳ در حال بهینه سازی پرامپت (CPU)...", interactive=False),
|
| 2471 |
+
gr.update(),
|
| 2472 |
+
gr.update(),
|
| 2473 |
+
None
|
| 2474 |
+
)
|
| 2475 |
+
|
| 2476 |
+
enhanced = enhance_prompt_on_cpu(first_frame, prompt, mode)
|
| 2477 |
+
|
| 2478 |
+
yield (
|
| 2479 |
+
gr.Button(value="🚀 در حال ساخت ویدیو (GPU)...", interactive=False),
|
| 2480 |
+
gr.update(value=enhanced),
|
| 2481 |
+
enhanced,
|
| 2482 |
+
None
|
| 2483 |
+
)
|
| 2484 |
+
else:
|
| 2485 |
+
# اگر کاربر نخواست پرامپت بهینه شود، مستقیما به مرحله تولید میرویم
|
| 2486 |
+
yield (
|
| 2487 |
+
gr.Button(value="🚀 در حال ساخت ویدیو (GPU)...", interactive=False),
|
| 2488 |
+
gr.update(value=prompt),
|
| 2489 |
+
prompt,
|
| 2490 |
+
None
|
| 2491 |
+
)
|
| 2492 |
|
| 2493 |
@spaces.GPU(duration=get_duration)
|
| 2494 |
def ui_generate_video(
|
| 2495 |
first_frame, end_frame, enhanced_prompt, duration, input_video,
|
| 2496 |
+
radioanimated_mode, enhance_toggle, seed, randomize_seed,
|
| 2497 |
height, width, camera_lora, audio_input, progress=gr.Progress(track_tqdm=True)
|
| 2498 |
):
|
| 2499 |
"""
|
| 2500 |
مرحله ۲: ساخت ویدیو با استفاده از GPU
|
| 2501 |
"""
|
| 2502 |
+
# پارامتر enhance_prompt (که مقدار آن False داده شده) برای جلوگیری از اعمال بهینهساز داخلی روی GPU است،
|
| 2503 |
+
# چون ما قبلا در مرحله قبل (CPU) این کار را طبق خواسته کاربر انجام دادهایم.
|
| 2504 |
video_path = generate_video(
|
| 2505 |
first_frame, end_frame, enhanced_prompt, duration, input_video,
|
| 2506 |
+
radioanimated_mode, False, seed, randomize_seed,
|
| 2507 |
height, width, camera_lora, audio_input, progress
|
| 2508 |
)
|
| 2509 |
return (
|
|
|
|
| 2647 |
audio_ui = AudioDropUpload(target_audio_elem_id="audio_input_hidden", elem_id="audio_ui")
|
| 2648 |
prompt = gr.Textbox(label="Prompt", value="این تصویر را با حرکت سینمایی و انیمیشن روان زنده کن", lines=3, max_lines=3, visible=False)
|
| 2649 |
|
|
|
|
|
|
|
| 2650 |
with gr.Accordion("تنظیمات پیشرفته", open=False, visible=False):
|
| 2651 |
seed = gr.Slider(label="سید (Seed)", minimum=0, maximum=MAX_SEED, value=DEFAULT_SEED, step=1)
|
| 2652 |
randomize_seed = gr.Checkbox(label="استفاده از سید تصادفی", value=True)
|
| 2653 |
|
| 2654 |
with gr.Column(elem_id="step-column"):
|
|
|
|
| 2655 |
output_video = gr.Video(label="ویدیوی ساخته شده", autoplay=True, height=512, interactive=False)
|
| 2656 |
with gr.Row():
|
| 2657 |
download_btn = gr.Button("📥 دانلود ویدیو", variant="secondary", size="sm", scale=0, visible=False)
|
| 2658 |
with gr.Row(elem_id="controls-row"):
|
| 2659 |
+
duration_ui = CameraDropdown(choices=["3s", "5s", "7s", "10s"], value="5s", title="مدت زمان ویدیو", elem_id="duration_ui")
|
|
|
|
| 2660 |
duration = gr.Slider(label="Duration (seconds)", minimum=1.0, maximum=10.0, value=5.0, step=0.1, visible=False)
|
| 2661 |
ICON_16_9, ICON_1_1, ICON_9_16 = ("<svg viewBox='0 0 24 24' fill='none' aria-hidden='true'><rect x='3' y='7' width='18' height='10' rx='2' stroke='currentColor' stroke-width='2'/></svg>", "<svg viewBox='0 0 24 24' fill='none' aria-hidden='true'><rect x='6' y='6' width='12' height='12' rx='2' stroke='currentColor' stroke-width='2'/></svg>", "<svg viewBox='0 0 24 24' fill='none' aria-hidden='true'><rect x='7' y='3' width='10' height='18' rx='2' stroke='currentColor' stroke-width='2'/></svg>")
|
| 2662 |
resolution_ui = CameraDropdown(choices=[{"label": "16:9", "value": "16:9", "icon": ICON_16_9}, {"label": "1:1", "value": "1:1", "icon": ICON_1_1}, {"label": "9:16", "value": "9:16", "icon": ICON_9_16}], value="16:9", title="ابعاد تصویر", elem_id="resolution_ui")
|
|
|
|
| 2665 |
camera_ui = CameraDropdown(choices=[name for name, _ in VISIBLE_RUNTIME_LORA_CHOICES], value="No LoRA", title="افکت دوربین (LoRA)", elem_id="camera_ui")
|
| 2666 |
camera_lora = gr.Dropdown(label="Camera Control LoRA", choices=[name for name, _ in VISIBLE_RUNTIME_LORA_CHOICES], value="No LoRA", visible=False)
|
| 2667 |
|
| 2668 |
+
# اضافه کردن سوییچ متحرک به شکل قرص برای تنظیمات پرامپت دقیقاً بالای دکمه تولید
|
| 2669 |
+
gr.HTML("<style>#enhance-toggle-row { display: flex; justify-content: center; margin-bottom: 15px; margin-top: 5px; width: 100%; }</style>")
|
| 2670 |
+
with gr.Row(elem_id="enhance-toggle-row"):
|
| 2671 |
+
enhance_toggle = RadioAnimated(
|
| 2672 |
+
choices=["✨ دستور بهینه شود", "✋ دستور بهینه نشود"],
|
| 2673 |
+
value="✨ دستور بهینه شود",
|
| 2674 |
+
elem_id="enhance_toggle"
|
| 2675 |
+
)
|
| 2676 |
+
|
| 2677 |
generate_btn = gr.Button("🤩 ساخت ویدیو", variant="primary", elem_classes="button-gradient", elem_id="generate_btn")
|
| 2678 |
|
|
|
|
| 2679 |
reset_btn = gr.Button("Reset", elem_id="reset_btn")
|
| 2680 |
|
| 2681 |
# اتصال رویدادها
|
|
|
|
| 2687 |
audio_ui.change(fn=lambda v: None if v == "__CLEAR__" or not v else gr.update(), inputs=audio_ui, outputs=audio_input, api_visibility="private")
|
| 2688 |
download_btn.click(fn=None, inputs=[output_video], js=js_download_video)
|
| 2689 |
|
|
|
|
|
|
|
| 2690 |
reset_btn.click(
|
| 2691 |
fn=lambda: gr.Button(value="🤩 ساخت ویدیو", interactive=True),
|
| 2692 |
inputs=[],
|
|
|
|
| 2695 |
queue=False
|
| 2696 |
)
|
| 2697 |
|
| 2698 |
+
# زنجیره اصلی ساخت ویدیو - حالا از مقدار کلید enhance_toggle استفاده میکند
|
| 2699 |
generate_btn.click(
|
| 2700 |
fn=ui_lock_and_enhance,
|
| 2701 |
+
inputs=[first_frame, prompt, radioanimated_mode, enhance_toggle],
|
| 2702 |
outputs=[generate_btn, prompt_ui, prompt, output_video]
|
| 2703 |
).then(
|
| 2704 |
fn=ui_generate_video,
|
| 2705 |
inputs=[
|
| 2706 |
first_frame, end_frame, prompt,
|
| 2707 |
+
duration, input_video, radioanimated_mode, enhance_toggle,
|
| 2708 |
seed, randomize_seed, height, width, camera_lora, audio_input
|
| 2709 |
],
|
| 2710 |
outputs=[generate_btn, output_video, download_btn]
|