File size: 4,587 Bytes
b767961
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import json
from deforum_engine import DeforumRunner

runner = DeforumRunner(device="cpu")

def process(prompts_json, neg, frames, width, height,
            z, a, tx, ty, stre, noi, 
            fps, steps, cadence, 
            color, border, seed_beh, init_img, 
            model, lora, sched):
    try:
        p_dict = json.loads(prompts_json.replace("'", '"'))
        prompts = {int(k): v for k, v in p_dict.items()}
    except Exception as e:
        yield None, None, None, f"JSON Error: {str(e)}"
        return

    # Pass exactly 20 args + self implicitly
    yield from runner.render(
        prompts, neg, int(frames), int(width), int(height),
        z, a, tx, ty, stre, noi,
        int(fps), int(steps), int(cadence),
        color, border, seed_beh, init_img,
        model, lora, sched
    )

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

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

with gr.Blocks() as demo:
    gr.Markdown("# 🌀 Deforum CPU: Full Featured\nAuthentic implementation with Cadence, Seed Control, and proper Color Coherence.")
    
    with gr.Row(elem_id="col-container"):
        with gr.Column(scale=1):
            
            with gr.Accordion("⚙️ Engine Settings", open=False):
                model = gr.Dropdown(label="Model", value="AlekseyCalvin/acs_model", 
                                    choices=["AlekseyCalvin/acs_model", "runwayml/stable-diffusion-v1-5", "IDKiro/sdxs-512-dreamshaper"])
                lora = gr.Dropdown(label="LoRA", value="latent-consistency/lcm-lora-sdv1-5", 
                                   choices=["latent-consistency/lcm-lora-sdv1-5", "None"])
                sched = gr.Dropdown(label="Sampler", value="LCM", 
                                    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)

            prompts = gr.Code(label="Prompts (JSON)", language="json", 
                              value='{\n "0": "a beautiful forest, sun rays, 8k",\n "30": "forest fire, smoke, dramatic lighting"\n}')
            neg = gr.Textbox(label="Negative Prompt", value="lowres, text, error, cropped, worst quality, low quality")
            
            with gr.Row():
                frames = gr.Number(label="Max Frames", value=120)
                fps = gr.Number(label="FPS", value=15)
            
            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, 20, value=4, step=1, label="Steps")
                cadence = gr.Slider(1, 8, value=2, step=1, label="Cadence (Speed/Smoothness)")

            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="Reflect", choices=["Reflect", "Replicate", "Wrap", "Black"])
                
                z = gr.Textbox(label="Zoom", value="0:(1.01)")
                a = gr.Textbox(label="Angle", value="0:(0)")
                tx = gr.Textbox(label="Translation X", value="0:(0)")
                ty = gr.Textbox(label="Translation Y", value="0:(0)")
                stre = gr.Textbox(label="Strength (Decay)", value="0:(0.65)")
                noi = gr.Textbox(label="Noise (Grain)", value="0:(0.02)")
                
            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")

    # Arguments: 20 inputs + self implicitly handled by click
    inputs = [
        prompts, neg, frames, width, height,
        z, a, tx, ty, stre, noi,
        fps, steps, cadence,
        color, border, seed_beh, init_img,
        model, lora, sched
    ]
    
    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())