File size: 4,870 Bytes
835fe87
 
 
 
 
 
519e267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
835fe87
 
 
 
 
 
 
c65da48
aa32726
519e267
c65da48
 
 
 
519e267
 
 
 
835fe87
519e267
 
835fe87
 
 
 
 
519e267
 
835fe87
 
 
 
 
 
519e267
835fe87
519e267
835fe87
 
 
 
519e267
835fe87
 
519e267
 
835fe87
519e267
 
835fe87
 
 
 
 
 
 
 
 
 
 
 
519e267
 
 
 
835fe87
 
 
 
 
 
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
import gradio as gr
import json
from deforum_engine import DeforumRunner

runner = DeforumRunner(device="cpu")

def process(model, lora, sched, prompts, neg, 
            frames, width, height, fps, steps, cfg, seed, seed_beh,
            zoom, angle, tx, ty, stre, noi, 
            color, cadence, border, use_init, init_img):
    
    if not use_init: init_img = None
    
    # Dictionary packing allows for cleaner code in the engine
    args = {
        'model': model, 'lora': lora, 'sched': sched,
        'prompts': prompts, 'neg': neg,
        'max_frames': frames, 'W': width, 'H': height,
        'zoom': zoom, 'angle': angle, 'tx': tx, 'ty': ty, 
        'strength': stre, 'noise': noi,
        'fps': fps, 'steps': steps, 'cfg': cfg, 'cadence': cadence,
        'color': color, 'border': border, 'seed_beh': seed_beh,
        'init_image': init_img, 'use_init': use_init, 'seed': seed
    }
    yield from runner.render(args)

def stop_gen():
    runner.stop()
    return "Stopping..."

css = "#col-container {max_width: 1000px; margin: 0 auto;}"

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("# 🌀 Deforum Soon® CPU")
    gr.Markdown("**Model Suggestions:** AiArtLab/sdxs, runwayml/stable-diffusion-v1-5, stabilityai/sdxl-turbo, CodeGoat24/sdxl-turbo-unified-reward-dpo, fluently/Fluently-XL-v3-Lightning, stabilityai/sd-turbo, SimianLuo/LCM_Dreamshaper_v7, rupeshs/sdxs-512-0.9-orig-vae, Disty0/LCM_SoteMix, qiacheng/stable-diffusion-v1-5-lcm, AiArtLab/sdxs-08b | LoRA: latent-consistency/lcm-lora-sdv1-5")
    with gr.Row():
        with gr.Column():
            with gr.Accordion("Pipeline Config", open=True):
                # TEXTBOXES allows any model
                model = gr.Textbox(label="Model ID (HuggingFace)", value="rupeshs/sdxs-512-0.9-orig-vae")
                lora = gr.Textbox(label="LoRA ID (Optional)", value="")
                sched = gr.Dropdown(label="Scheduler", value="Euler A", choices=["LCM", "Euler A", "DDIM", "DPM++ 2M"])
                seed_beh = gr.Dropdown(label="Seed Behavior", value="iter", choices=["iter", "fixed", "random"])
                init_img = gr.Image(label="Init Image", type="pil", height=200)
                use_init = gr.Checkbox(label="Use Init Image", value=False)
                
            prompts = gr.Code(label="Prompts (JSON)", language="json", 
                              value='{\n "0": "a simple black line drawing of a cat, white background",\n "30": "a simple black line drawing of a dog, white background"\n}')
            neg = gr.Textbox(label="Negative Prompt", value="complex, realistic, photo, blur")
            
            with gr.Row():
                frames = gr.Number(label="Frames", value=30)
                fps = gr.Number(label="FPS", value=4)
            
            with gr.Row():
                width = gr.Slider(256, 512, value=256, step=64, label="Width")
                height = gr.Slider(256, 512, value=256, step=64, label="Height")
                
            with gr.Row():
                steps = gr.Slider(1, 50, value=2, step=1, label="Steps")
                cfg = gr.Slider(0.0, 20.0, value=1.0, step=0.1, label="CFG Scale (0-2 for SDXS/LCM)")
                cadence = gr.Slider(1, 8, value=5, step=1, label="Cadence")

            with gr.Accordion("🎬 Motion & Coherence", open=True):
                with gr.Row():
                    color = gr.Dropdown(label="Color Match", value="LAB", choices=["None", "LAB", "HSV", "RGB"])
                    border = gr.Dropdown(label="Border Mode", value="Replicate", choices=["Reflect", "Replicate", "Wrap", "Black"])
                
                z = gr.Textbox(label="Zoom", value="0:(1.0)")
                a = gr.Textbox(label="Angle", value="0:(2)")
                tx = gr.Textbox(label="Translation X", value="0:(0.3)")
                ty = gr.Textbox(label="Translation Y", value="0:(0)")
                stre = gr.Textbox(label="Strength", value="0:(0.25)")
                noi = gr.Textbox(label="Noise", value="0:(0.04)")
                
            with gr.Row():
                btn = gr.Button("GENERATE", variant="primary", scale=2)
                stop = gr.Button("STOP", variant="stop", scale=1)
            
        with gr.Column(scale=1):
            status = gr.Markdown("Ready")
            preview = gr.Image(label="Last Frame")
            video_out = gr.Video(label="Rendered Video")
            zip_out = gr.File(label="Frames ZIP")

    inputs = [
        model, lora, sched, prompts, neg, 
        frames, width, height, fps, steps, cfg, gr.State(-1), seed_beh,
        z, a, tx, ty, stre, noi, 
        color, cadence, border, use_init, init_img
    ]
    
    btn.click(process, inputs=inputs, outputs=[preview, video_out, zip_out, status])
    stop.click(stop_gen, outputs=status)

demo.queue().launch(css=css, theme=gr.themes.Glass())