File size: 2,592 Bytes
5f8a662
6cd2a2e
4b86371
c6011cd
 
6cd2a2e
c6011cd
6c4f4bc
5f8a662
 
4b86371
 
 
 
 
 
 
5f8a662
 
4b86371
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import torch
import gradio as gr
from diffusers import StableVideoDiffusionPipeline
from PIL import Image
import numpy as np
import cv2
import tempfile
from diffusers.utils import export_to_video

pipe = None
def load():
    global pipe
    if pipe is None:
        pipe = StableVideoDiffusionPipeline.from_pretrained(
            "stabilityai/stable-video-diffusion-img2vid-xt",
            torch_dtype=torch.float16,
            variant="fp16"
        )
        pipe.to("cuda")
        gr.Info("Модель на GPU — генерация 30–60 сек")
    return pipe

def run(ref_img, video, mode, quality, prog=gr.Progress()):
    pipe = load()
    prog(0, desc="Подготовка...")
    img = Image.fromarray(ref_img).convert("RGB").resize((576, 320))

    cap = cv2.VideoCapture(video)
    n = int(cap.get(7)); cap.release()
    hint = f" ({n} кадров)"

    steps = 25 if quality == "wan-pro" else 15
    frames = 25 if quality == "wan-pro" else 14
    noise = 0.1 if mode == "wan2.2-animate-mix" else 0.02

    def cb(step, *_): 
        prog((step+1)/steps, desc=f"Шаг {step+1}/{steps}")
    prog(0.1, desc="Генерация...")

    out = pipe(
        img,
        num_inference_steps=steps,
        num_frames=frames,
        decode_chunk_size=2,
        noise_aug_strength=noise,
        callback_on_step_end=cb
    ).frames[0]

    tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
    export_to_video(out, tmp.name, fps=7)
    return tmp.name, "Готово!" + hint

with gr.Blocks() as demo:
    gr.Markdown("# Wan2.2-Animate (GPU)")
    with gr.Accordion("Инструкция", open=False):
        gr.Markdown("Загрузи фото + видео → выбери режим → жми Generate")

    with gr.Row():
        with gr.Column():
            img = gr.Image(label="Фото", type="numpy")
            vid = gr.Video(label="Видео")
            with gr.Row():
                mode = gr.Dropdown(["wan2.2-animate-move", "wan2.2-animate-mix"], 
                                  label="Режим", value="wan2.2-animate-move")
                qual = gr.Dropdown(["wan-pro", "wan-std"], label="Качество", value="wan-pro")
            btn = gr.Button("Generate Video")
        with gr.Column():
            out = gr.Video(label="Результат")
            stat = gr.Textbox(label="Статус")

    btn.click(run, [img, vid, mode, qual], [out, stat])

demo.queue(max_size=2).launch(
    server_name="0.0.0.0",
    server_port=7860,
    share=True,           # ← ФИКС 1
    enable_queue=True
)