Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
@@ -585,52 +585,189 @@ def create_advanced_options():
|
|
585 |
num_frames_slider,
|
586 |
]
|
587 |
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
608 |
-
|
609 |
-
|
610 |
-
|
611 |
-
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
|
629 |
-
|
630 |
-
|
631 |
-
|
632 |
-
|
633 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
634 |
|
635 |
txt2vid_preset.change(
|
636 |
fn=preset_changed,
|
@@ -653,5 +790,5 @@ with gr.Blocks(theme=gr.themes.Soft()) as iface:
|
|
653 |
queue=True,
|
654 |
)
|
655 |
|
656 |
-
|
657 |
-
|
|
|
585 |
num_frames_slider,
|
586 |
]
|
587 |
|
588 |
+
# CSS ์คํ์ผ ์ ์
|
589 |
+
css = """
|
590 |
+
[์ด์ ์ CSS ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ ์ง]
|
591 |
+
"""
|
592 |
+
|
593 |
+
# Gradio ์ธํฐํ์ด์ค ์์ฑ
|
594 |
+
with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
|
595 |
+
gr.HTML('<div class="title">AI Image & Video Generator</div>')
|
596 |
+
|
597 |
+
with gr.Tabs():
|
598 |
+
# ์ฒซ ๋ฒ์งธ ํญ: Image Generation
|
599 |
+
with gr.Tab("Image Generation"):
|
600 |
+
with gr.Row():
|
601 |
+
with gr.Column(scale=3):
|
602 |
+
img_prompt = gr.Textbox(
|
603 |
+
label="Image Description",
|
604 |
+
placeholder="์ด๋ฏธ์ง ์ค๋ช
์ ์
๋ ฅํ์ธ์... (ํ๊ธ ์
๋ ฅ ๊ฐ๋ฅ)",
|
605 |
+
lines=3
|
606 |
+
)
|
607 |
+
|
608 |
+
with gr.Accordion("Advanced Settings", open=False):
|
609 |
+
with gr.Row():
|
610 |
+
height = gr.Slider(
|
611 |
+
label="Height",
|
612 |
+
minimum=256,
|
613 |
+
maximum=1152,
|
614 |
+
step=64,
|
615 |
+
value=1024
|
616 |
+
)
|
617 |
+
width = gr.Slider(
|
618 |
+
label="Width",
|
619 |
+
minimum=256,
|
620 |
+
maximum=1152,
|
621 |
+
step=64,
|
622 |
+
value=1024
|
623 |
+
)
|
624 |
+
|
625 |
+
with gr.Row():
|
626 |
+
steps = gr.Slider(
|
627 |
+
label="Inference Steps",
|
628 |
+
minimum=6,
|
629 |
+
maximum=25,
|
630 |
+
step=1,
|
631 |
+
value=8
|
632 |
+
)
|
633 |
+
scales = gr.Slider(
|
634 |
+
label="Guidance Scale",
|
635 |
+
minimum=0.0,
|
636 |
+
maximum=5.0,
|
637 |
+
step=0.1,
|
638 |
+
value=3.5
|
639 |
+
)
|
640 |
+
|
641 |
+
def get_random_seed():
|
642 |
+
return torch.randint(0, 1000000, (1,)).item()
|
643 |
+
|
644 |
+
seed = gr.Number(
|
645 |
+
label="Seed",
|
646 |
+
value=get_random_seed(),
|
647 |
+
precision=0
|
648 |
+
)
|
649 |
+
|
650 |
+
randomize_seed = gr.Button("๐ฒ Randomize Seed", elem_classes=["generate-btn"])
|
651 |
+
|
652 |
+
generate_btn = gr.Button(
|
653 |
+
"โจ Generate Image",
|
654 |
+
elem_classes=["generate-btn"]
|
655 |
+
)
|
656 |
+
|
657 |
+
with gr.Column(scale=4):
|
658 |
+
img_output = gr.Image(
|
659 |
+
label="Generated Image",
|
660 |
+
type="pil",
|
661 |
+
format="png"
|
662 |
+
)
|
663 |
+
img_gallery = gr.Gallery(
|
664 |
+
label="Image Gallery",
|
665 |
+
show_label=True,
|
666 |
+
elem_id="gallery",
|
667 |
+
columns=[4],
|
668 |
+
rows=[2],
|
669 |
+
height="auto",
|
670 |
+
object_fit="cover"
|
671 |
+
)
|
672 |
+
img_gallery.value = load_gallery()
|
673 |
+
|
674 |
+
# ๋ ๋ฒ์งธ ํญ: Video Generation
|
675 |
+
with gr.Tab("Video Generation"):
|
676 |
+
with gr.Row():
|
677 |
+
with gr.Column(scale=3):
|
678 |
+
video_prompt = gr.Textbox(
|
679 |
+
label="Video Description",
|
680 |
+
placeholder="๋น๋์ค ์ค๋ช
์ ์
๋ ฅํ์ธ์... (ํ๊ธ ์
๋ ฅ ๊ฐ๋ฅ)",
|
681 |
+
lines=3
|
682 |
+
)
|
683 |
+
upload_image = gr.Image(
|
684 |
+
type="filepath",
|
685 |
+
label="Upload First Frame Image"
|
686 |
+
)
|
687 |
+
video_generate_btn = gr.Button(
|
688 |
+
"๐ฌ Generate Video",
|
689 |
+
elem_classes=["generate-btn"]
|
690 |
+
)
|
691 |
+
|
692 |
+
with gr.Column(scale=4):
|
693 |
+
video_output = gr.Video(label="Generated Video")
|
694 |
+
video_gallery = gr.Gallery(
|
695 |
+
label="Video Gallery",
|
696 |
+
show_label=True,
|
697 |
+
columns=[4],
|
698 |
+
rows=[2],
|
699 |
+
height="auto",
|
700 |
+
object_fit="cover"
|
701 |
+
)
|
702 |
+
|
703 |
+
# ์ธ ๋ฒ์งธ ํญ: AI Video Generation
|
704 |
+
with gr.Tab("AI Video Generation"):
|
705 |
+
with gr.Column():
|
706 |
+
txt2vid_prompt = gr.Textbox(
|
707 |
+
label="Step 1: Enter Your Prompt (ํ๊ธ ๋๋ ์์ด)",
|
708 |
+
placeholder="์์ฑํ๊ณ ์ถ์ ๋น๋์ค๋ฅผ ์ค๋ช
ํ์ธ์ (์ต์ 50์)...",
|
709 |
+
value="๊ธด ๊ฐ์ ๋จธ๋ฆฌ์ ๋ฐ์ ํผ๋ถ๋ฅผ ๊ฐ์ง ์ฌ์ฑ์ด ๊ธด ๊ธ๋ฐ ๋จธ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ค๋ฅธ ์ฌ์ฑ์ ํฅํด ๋ฏธ์ ์ง์ต๋๋ค. ๊ฐ์ ๋จธ๋ฆฌ ์ฌ์ฑ์ ๊ฒ์ ์ฌํท์ ์
๊ณ ์์ผ๋ฉฐ ์ค๋ฅธ์ชฝ ๋บจ์ ์๊ณ ๊ฑฐ์ ๋์ ๋์ง ์๋ ์ ์ด ์์ต๋๋ค. ์นด๋ฉ๋ผ ์ต๊ธ์ ๊ฐ์ ๋จธ๋ฆฌ ์ฌ์ฑ์ ์ผ๊ตด์ ์ด์ ์ ๋ง์ถ ํด๋ก์ฆ์
์
๋๋ค. ์กฐ๋ช
์ ๋ฐ๋ปํ๊ณ ์์ฐ์ค๋ฌ์ฐ๋ฉฐ, ์๋ง๋ ์ง๋ ํด์์ ๋์ค๋ ๊ฒ ๊ฐ์ ์ฅ๋ฉด์ ๋ถ๋๋ฌ์ด ๋น์ ๋น์ถฅ๋๋ค.",
|
710 |
+
lines=5,
|
711 |
+
)
|
712 |
+
|
713 |
+
txt2vid_enhance_toggle = Toggle(
|
714 |
+
label="Enhance Prompt",
|
715 |
+
value=False,
|
716 |
+
interactive=True,
|
717 |
+
)
|
718 |
+
|
719 |
+
txt2vid_negative_prompt = gr.Textbox(
|
720 |
+
label="Step 2: Enter Negative Prompt",
|
721 |
+
placeholder="๋น๋์ค์์ ์ํ์ง ์๋ ์์๋ฅผ ์ค๋ช
ํ์ธ์...",
|
722 |
+
value="low quality, worst quality, deformed, distorted, damaged, motion blur, motion artifacts, fused fingers, incorrect anatomy, strange hands, ugly",
|
723 |
+
lines=2,
|
724 |
+
)
|
725 |
+
|
726 |
+
txt2vid_preset = gr.Dropdown(
|
727 |
+
choices=[p["label"] for p in preset_options],
|
728 |
+
value="512x512, 160 frames",
|
729 |
+
label="Step 3.1: Choose Resolution Preset",
|
730 |
+
)
|
731 |
+
|
732 |
+
txt2vid_frame_rate = gr.Slider(
|
733 |
+
label="Step 3.2: Frame Rate",
|
734 |
+
minimum=6,
|
735 |
+
maximum=60,
|
736 |
+
step=1,
|
737 |
+
value=20,
|
738 |
+
)
|
739 |
+
|
740 |
+
txt2vid_advanced = create_advanced_options()
|
741 |
+
txt2vid_generate = gr.Button(
|
742 |
+
"Step 5: Generate Video",
|
743 |
+
variant="primary",
|
744 |
+
size="lg",
|
745 |
+
)
|
746 |
+
|
747 |
+
txt2vid_output = gr.Video(label="Generated Output")
|
748 |
+
|
749 |
+
# ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ฐ๊ฒฐ
|
750 |
+
generate_btn.click(
|
751 |
+
process_and_save_image,
|
752 |
+
inputs=[height, width, steps, scales, img_prompt, seed],
|
753 |
+
outputs=[img_output, img_gallery]
|
754 |
+
)
|
755 |
+
|
756 |
+
video_generate_btn.click(
|
757 |
+
process_and_generate_video,
|
758 |
+
inputs=[upload_image, video_prompt],
|
759 |
+
outputs=video_output
|
760 |
+
)
|
761 |
+
|
762 |
+
randomize_seed.click(
|
763 |
+
update_seed,
|
764 |
+
outputs=[seed]
|
765 |
+
)
|
766 |
+
|
767 |
+
generate_btn.click(
|
768 |
+
update_seed,
|
769 |
+
outputs=[seed]
|
770 |
+
)
|
771 |
|
772 |
txt2vid_preset.change(
|
773 |
fn=preset_changed,
|
|
|
790 |
queue=True,
|
791 |
)
|
792 |
|
793 |
+
if __name__ == "__main__":
|
794 |
+
demo.launch(allowed_paths=[PERSISTENT_DIR])
|