File size: 5,166 Bytes
a7cbda8
 
f56ed08
 
5b422bf
a7cbda8
5e9042c
f56ed08
a7cbda8
 
 
5e9042c
a7cbda8
 
 
 
 
 
 
 
 
f56ed08
f56fa59
a7cbda8
 
 
 
3f095c9
a7cbda8
 
 
00ec618
f56fa59
a7cbda8
 
 
 
3f095c9
 
 
 
 
96136a4
3f095c9
 
 
 
 
 
 
 
 
2c66889
 
 
 
 
 
7a3b159
f6dbf53
 
7a3b159
f6dbf53
7a3b159
f6dbf53
7a3b159
f6dbf53
7a3b159
f6dbf53
7a3b159
f6dbf53
2c66889
5c9c839
2c66889
3f095c9
 
 
 
2c66889
a7cbda8
2c66889
a7cbda8
 
2c66889
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import gradio as gr
from gradio_client import Client
import os 

hf_token = os.environ.get("HF_TKN")

def get_instantID(portrait_in, condition_pose, prompt):
    client = Client("https://fffiloni-instantid.hf.space/", hf_token=hf_token)
    negative_prompt = "(lowres, low quality, worst quality:1.2), (text:1.2), watermark, (frame:1.2), deformed, ugly, deformed eyes, blur, out of focus, blurry, deformed cat, deformed, photo, anthropomorphic cat, monochrome, photo, pet collar, gun, weapon, blue, 3d, drones, drone, buildings in background, green"
    result = client.predict(
		portrait_in,	# filepath  in 'Upload a photo of your face' Image component
		condition_pose,	# filepath  in 'Upload a reference pose image (optional)' Image component
	    prompt,	# str  in 'Prompt' Textbox component
		negative_prompt,	# str  in 'Negative Prompt' Textbox component
		"(No style)",	# Literal['(No style)', 'Watercolor', 'Film Noir', 'Neon', 'Jungle', 'Mars', 'Vibrant Color', 'Snow', 'Line art']  in 'Style template' Dropdown component
		True,	# bool  in 'Enhance non-face region' Checkbox component
		20,	# float (numeric value between 20 and 100) in 'Number of sample steps' Slider component
		0.8,	# float (numeric value between 0 and 1.5) in 'IdentityNet strength (for fedility)' Slider component
		0.8,	# float (numeric value between 0 and 1.5) in 'Image adapter strength (for detail)' Slider component
		5,	# float (numeric value between 0.1 and 10.0) in 'Guidance scale' Slider component
		0,	# float (numeric value between 0 and 2147483647) in 'Seed' Slider component
        True,	# bool  in 'Randomize seed' Checkbox component
		api_name="/generate_image"
    )
    print(result)
    return result[0]

def get_video_i2vgen(image_in, prompt):
    client = Client("https://modelscope-i2vgen-xl.hf.space/")
    result = client.predict(
        image_in,
        prompt,
        fn_index=1
    )
    print(result)
    return result

def get_video_svd(image_in):
    from gradio_client import Client

    client = Client("https://multimodalart-stable-video-diffusion.hf.space/--replicas/ej45m/")
    result = client.predict(
		image_in,	# filepath  in 'Upload your image' Image component
		0,	# float (numeric value between 0 and 9223372036854775807) in 'Seed' Slider component
		True,	# bool  in 'Randomize seed' Checkbox component
		127,	# float (numeric value between 1 and 255) in 'Motion bucket id' Slider component
		6,	# float (numeric value between 5 and 30) in 'Frames per second' Slider component
		api_name="/video"
    )
    print(result)
    return result[0]["video"]

def infer(image_in, camera_shot, conditional_pose, prompt, chosen_model):
    if camera_shot == "custom":
        if conditional_pose != None:
            conditional_pose = conditional_pose
        else :
            raise gr.Error("No custom conditional shot found !")
    
    elif camera_shot == "close-up":
        conditional_pose = "camera_shots/close_up_shot.jpeg"
    elif camera_shot == "medium close-up":
        conditional_pose = "camera_shots/medium_close_up.jpeg"
    elif camera_shot == "medium shot":
        conditional_pose = "camera_shots/medium_shot.png"
    elif camera_shot == "cowboy shot":
        conditional_pose = "camera_shots/cowboy_shot.jpeg"
    elif camera_shot == "medium full shot":
        conditional_pose = "camera_shots/medium_full_shot.png"
    elif camera_shot == "full shot":
        conditional_pose = "camera_shots/full_shot.jpeg"
    
    iid_img = get_instantID(image_in, conditional_pose, prompt)
    
    if chosen_model == "i2vgen-xl" :
        video_res = get_video_i2vgen(iid_img, prompt)
    elif chosen_model == "stable-video" :
        video_res = get_video_svd(image_in)
    
    print(video_res)
    
    return video_res

with gr.Blocks as demo:
    with gr.Column():
        gr.HTML("""
        
        """)
        with gr.Row():
            with gr.Column():
                face_in = gr.Image(type="filepath", label="Face to copy")
                camera_shot = gr.Dropdown(
                    label = "Camera Shot", 
                    info = "Use standard camera shots vocabulary, or drop your custom shot as conditional pose (1280*720 ratio is recommended)"
                    choices = [
                        "custom", "close-up", "medium close-up", "medium shot", "cowboy shot", "medium full shot", "full shot"
                    ],
                    value = "custom"
                )
                condition_shot = gr.Image(type="filepath", label="Custom conditional shot (Optional)")
                prompt = gr.Textbox(label="Prompt")
                chosen_model = gr.Radio(label="Choose a model", choices=["i2vgen-xl", "stable-video"], value="i2vgen-xl", interactive=False, visible=False)
                submit_btn = gr.Button("Submit")
            with gr.Column():
                video_out = gr.Video()

    submit_btn.click(
        fn = infer,
        inputs = [
            face_in,
            camera_shot,
            condition_shot,
            prompt,
            chosen_model
        ],
        outputs = [
            video_out
        ]
    )

demo.queue(max_size=6).launch(debug=True)