Spaces:
Running
Running
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])
|