matthewkram commited on
Commit
6cd2a2e
·
verified ·
1 Parent(s): 3be85c8

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -0
app.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+ import gradio as gr
4
+ import torch
5
+ from diffusers import DiffusionPipeline
6
+ from PIL import Image
7
+ import numpy as np
8
+ import cv2
9
+ from moviepy.editor import ImageSequenceClip
10
+
11
+ class WanAnimateApp:
12
+ def __init__(self):
13
+ model_name = "Wan-AI/Wan2.2-Animate-14B"
14
+ self.pipe = DiffusionPipeline.from_pretrained(
15
+ model_name,
16
+ torch_dtype=torch.float32,
17
+ use_safetensors=True,
18
+ device_map="cpu"
19
+ )
20
+ self.pipe.reset_device_map()
21
+ self.pipe.enable_model_cpu_offload()
22
+ self.pipe.enable_vae_slicing()
23
+
24
+ def predict(self, ref_img, video, model_id, model):
25
+ if ref_img is None:
26
+ return None, "Upload image."
27
+ try:
28
+ ref_image = Image.open(ref_img).convert("RGB").resize((512, 512))
29
+ motion = " with motion transfer" if video else ""
30
+ prompt = f"Animate character from image{motion}, detailed, high quality."
31
+ num_steps = 15 if model == "wan-pro" else 10
32
+ output = self.pipe(prompt, image=ref_image, num_inference_steps=num_steps, height=512, width=512).frames
33
+ temp_video = f"/tmp/out_{int(time.time())}.mp4"
34
+ clip = ImageSequenceClip(output, fps=10)
35
+ clip.write_videofile(temp_video, fps=10, codec='libx264', audio=False)
36
+ return temp_video, "Done!"
37
+ except Exception as e:
38
+ return None, str(e)
39
+
40
+ app = WanAnimateApp()
41
+
42
+ with gr.Blocks(title="Wan2.2-Animate CPU") as demo:
43
+ gr.HTML("<h1>Wan2.2-Animate (CPU Mode)</h1><p>Upload image for animation. Slow on CPU (10–30 min).</p>")
44
+ with gr.Row():
45
+ ref_img = gr.Image(label="Image", type="filepath")
46
+ video = gr.Video(label="Video (optional)")
47
+ model_id = gr.Dropdown(["move", "mix"], value="move", label="Mode")
48
+ model = gr.Dropdown(["wan-pro", "wan-std"], value="wan-std", label="Quality")
49
+ btn = gr.Button("Generate")
50
+ output_video = gr.Video(label="Output")
51
+ status = gr.Textbox(label="Status")
52
+ btn.click(app.predict, inputs=[ref_img, video, model_id, model], outputs=[output_video, status])
53
+
54
+ demo.queue().launch(server_name="0.0.0.0", server_port=7860)