fantaxy commited on
Commit
494bc3a
ยท
verified ยท
1 Parent(s): ca6d53d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +185 -48
app.py CHANGED
@@ -585,52 +585,189 @@ def create_advanced_options():
585
  num_frames_slider,
586
  ]
587
 
588
- with gr.Blocks(theme=gr.themes.Soft()) as iface:
589
-
590
- with gr.Column():
591
- txt2vid_prompt = gr.Textbox(
592
- label="Step 1: Enter Your Prompt (ํ•œ๊ธ€ ๋˜๋Š” ์˜์–ด)",
593
- placeholder="์ƒ์„ฑํ•˜๊ณ  ์‹ถ์€ ๋น„๋””์˜ค๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š” (์ตœ์†Œ 50์ž)...",
594
- value="๊ธด ๊ฐˆ์ƒ‰ ๋จธ๋ฆฌ์™€ ๋ฐ์€ ํ”ผ๋ถ€๋ฅผ ๊ฐ€์ง„ ์—ฌ์„ฑ์ด ๊ธด ๊ธˆ๋ฐœ ๋จธ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์—ฌ์„ฑ์„ ํ–ฅํ•ด ๋ฏธ์†Œ ์ง“์Šต๋‹ˆ๋‹ค. ๊ฐˆ์ƒ‰ ๋จธ๋ฆฌ ์—ฌ์„ฑ์€ ๊ฒ€์€ ์žฌํ‚ท์„ ์ž…๊ณ  ์žˆ์œผ๋ฉฐ ์˜ค๋ฅธ์ชฝ ๋บจ์— ์ž‘๊ณ  ๊ฑฐ์˜ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ ์•ต๊ธ€์€ ๊ฐˆ์ƒ‰ ๋จธ๋ฆฌ ์—ฌ์„ฑ์˜ ์–ผ๊ตด์— ์ดˆ์ ์„ ๋งž์ถ˜ ํด๋กœ์ฆˆ์—…์ž…๋‹ˆ๋‹ค. ์กฐ๋ช…์€ ๋”ฐ๋œปํ•˜๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šฐ๋ฉฐ, ์•„๋งˆ๋„ ์ง€๋Š” ํ•ด์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ ๊ฐ™์•„ ์žฅ๋ฉด์— ๋ถ€๋“œ๋Ÿฌ์šด ๋น›์„ ๋น„์ถฅ๋‹ˆ๋‹ค.",
595
- lines=5,
596
- )
597
-
598
-
599
- txt2vid_enhance_toggle = Toggle(
600
- label="Enhance Prompt",
601
- value=False,
602
- interactive=True,
603
- )
604
-
605
- txt2vid_negative_prompt = gr.Textbox(
606
- label="Step 2: Enter Negative Prompt",
607
- placeholder="๋น„๋””์˜ค์—์„œ ์›ํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”...",
608
- value="low quality, worst quality, deformed, distorted, damaged, motion blur, motion artifacts, fused fingers, incorrect anatomy, strange hands, ugly",
609
- lines=2,
610
- )
611
-
612
- txt2vid_preset = gr.Dropdown(
613
- choices=[p["label"] for p in preset_options],
614
- value="512x512, 160 frames",
615
- label="Step 3.1: Choose Resolution Preset",
616
- )
617
-
618
- txt2vid_frame_rate = gr.Slider(
619
- label="Step 3.2: Frame Rate",
620
- minimum=6,
621
- maximum=60,
622
- step=1,
623
- value=20,
624
- )
625
-
626
- txt2vid_advanced = create_advanced_options()
627
- txt2vid_generate = gr.Button(
628
- "Step 5: Generate Video",
629
- variant="primary",
630
- size="lg",
631
- )
632
-
633
- txt2vid_output = gr.Video(label="Generated Output")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- iface.queue(max_size=64, default_concurrency_limit=1, api_open=False).launch(share=True, show_api=False)
657
- # ===== Application Startup at 2024-12-20 01:30:34 =====
 
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])