File size: 3,950 Bytes
b7f7bb6
 
 
 
fe77a8e
0c48f4b
b7f7bb6
0c48f4b
4c34823
 
d03a679
7d2b140
b7f7bb6
30a8deb
7d2b140
4c34823
30a8deb
b7f7bb6
4c34823
fe77a8e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b7f7bb6
 
fe77a8e
 
 
b7f7bb6
 
 
fe77a8e
d03a679
c7d5c0d
 
 
 
 
 
 
 
 
 
d03a679
c7d5c0d
 
d03a679
7a5c202
c7d5c0d
 
7a5c202
c7d5c0d
 
 
 
 
 
 
1f6711e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7a5c202
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import gradio as gr
import torch
from diffusers import I2VGenXLPipeline
from diffusers.utils import export_to_gif, load_image
import tempfile
import spaces

@spaces.GPU
def initialize_pipeline():
    # Initialize the pipeline without CUDA support
    pipeline = I2VGenXLPipeline.from_pretrained("ali-vilab/i2vgen-xl", torch_dtype=torch.float16, variant="fp16")
    return pipeline

def generate_gif(prompt, image, negative_prompt, num_inference_steps, guidance_scale, seed):
    # Initialize the pipeline within the function
    pipeline = initialize_pipeline()

    # Set the generator seed
    generator = torch.Generator().manual_seed(seed)

    # Check if an image is provided
    if image is not None:
        image = load_image(image).convert("RGB")
        frames = pipeline(
            prompt=prompt,
            image=image,
            num_inference_steps=num_inference_steps,
            negative_prompt=negative_prompt,
            guidance_scale=guidance_scale,
            generator=generator
        ).frames[0]
    else:
        frames = pipeline(
            prompt=prompt,
            num_inference_steps=num_inference_steps,
            negative_prompt=negative_prompt,
            guidance_scale=guidance_scale,
            generator=generator
        ).frames[0]

    # Export to GIF
    with tempfile.NamedTemporaryFile(delete=False, suffix=".gif") as tmp_gif:
        gif_path = tmp_gif.name
        export_to_gif(frames, gif_path)

    return gif_path

# Create the Gradio interface with tabs
with gr.Blocks() as demo:
    with gr.Tabs():
        with gr.TabItem("Generate from Text"):
            with gr.Row():
                with gr.Column():
                    text_prompt = gr.Textbox(lines=2, placeholder="Enter your prompt here...", label="Prompt")
                    text_negative_prompt = gr.Textbox(lines=2, placeholder="Enter your negative prompt here...", label="Negative Prompt")
                    text_num_inference_steps = gr.Slider(1, 100, step=1, value=50, label="Number of Inference Steps")
                    text_guidance_scale = gr.Slider(1, 20, step=0.1, value=9.0, label="Guidance Scale")
                    text_seed = gr.Number(label="Seed", value=8888)
                    text_generate_button = gr.Button("Generate GIF")

                with gr.Column():
                    text_output_video = gr.Video(label="Generated GIF")

            # Fix: Do not use `None` in the inputs, instead pass an empty input for image
            text_generate_button.click(
                fn=generate_gif,
                inputs=[text_prompt, None, text_negative_prompt, text_num_inference_steps, text_guidance_scale, text_seed],
                outputs=text_output_video
            )

        with gr.TabItem("Generate from Image"):
            with gr.Row():
                with gr.Column():
                    image_prompt = gr.Textbox(lines=2, placeholder="Enter your prompt here...", label="Prompt")
                    image_input = gr.Image(type="filepath", label="Input Image")
                    image_negative_prompt = gr.Textbox(lines=2, placeholder="Enter your negative prompt here...", label="Negative Prompt")
                    image_num_inference_steps = gr.Slider(1, 100, step=1, value=50, label="Number of Inference Steps")
                    image_guidance_scale = gr.Slider(1, 20, step=0.1, value=9.0, label="Guidance Scale")
                    image_seed = gr.Number(label="Seed", value=8888)
                    image_generate_button = gr.Button("Generate GIF")

                with gr.Column():
                    image_output_video = gr.Video(label="Generated GIF")

            image_generate_button.click(
                fn=generate_gif,
                inputs=[image_prompt, image_input, image_negative_prompt, image_num_inference_steps, image_guidance_scale, image_seed],
                outputs=image_output_video
            )

# Launch the interface
demo.launch()