Spaces:
Runtime error
Runtime error
File size: 5,414 Bytes
b97e433 | 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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | import gradio as gr
import torch
import numpy as np
import os
# from diffusers import MotionCtrlPipeline # Placeholder for actual diffusers/custom pipeline
# --- Configuration & Model Loading ---
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# Model initialization would go here.
# Example:
# pipe = MotionCtrlPipeline.from_pretrained("TencentARC/MotionCtrl").to(DEVICE)
def generate_motion_video(
prompt,
camera_pan,
camera_tilt,
camera_zoom,
camera_roll,
num_frames,
guidance_scale,
num_inference_steps,
seed,
progress=gr.Progress()
):
"""
Core generation function.
Connect your specific Diffusers or PyTorch motion control pipeline here.
"""
progress(0, desc="Initializing...")
# Set seed for reproducibility
if seed == -1:
seed = np.random.randint(0, 2**32 - 1)
generator = torch.Generator(device=DEVICE).manual_seed(seed)
progress(0.2, desc="Encoding prompts and trajectories...")
# ---------------------------------------------------------
# INSERT INFERENCE CODE HERE
# Example for a generic MotionCtrl-style pipeline:
#
# camera_poses = calculate_poses(camera_pan, camera_tilt, camera_zoom, camera_roll)
# video = pipe(
# prompt=prompt,
# camera_poses=camera_poses,
# num_frames=num_frames,
# guidance_scale=guidance_scale,
# num_inference_steps=num_inference_steps,
# generator=generator
# ).frames[0]
#
# video_path = export_to_video(video)
# ---------------------------------------------------------
# Simulated delay/output for UI demonstration purposes
import time
for i in range(1, 11):
time.sleep(0.5) # Simulating generation time
progress(i / 10, desc=f"Generating frame {i*(num_frames//10)}/{num_frames}...")
placeholder_output = "output_placeholder.mp4"
# open(placeholder_output, 'w').close() # creates a dummy file
return placeholder_output, seed
# --- UI Layout ---
# Using a clean, modern theme
theme = gr.themes.Soft(
primary_hue="indigo",
secondary_hue="blue",
neutral_hue="slate",
font=[gr.themes.GoogleFont("Inter"), "sans-serif"]
)
with gr.Blocks(theme=theme, title="Advanced Motion Control Generation") as app:
gr.Markdown(
"""
# π¬ Advanced Motion Control Video Generation
Control camera trajectories and object movement seamlessly. Enter your prompt, dial in your camera movements, and generate.
"""
)
with gr.Row():
with gr.Column(scale=4):
# Prompt Area
prompt = gr.Textbox(
label="Prompt",
placeholder="A cinematic drone shot of a futuristic city at sunset, neon lights...",
lines=3
)
# Motion Controls
with gr.Group():
gr.Markdown("### π₯ Camera Controls")
with gr.Row():
camera_pan = gr.Slider(minimum=-10.0, maximum=10.0, step=0.1, value=0.0, label="Pan (Left/Right)")
camera_tilt = gr.Slider(minimum=-10.0, maximum=10.0, step=0.1, value=0.0, label="Tilt (Up/Down)")
with gr.Row():
camera_zoom = gr.Slider(minimum=-10.0, maximum=10.0, step=0.1, value=0.0, label="Zoom (In/Out)")
camera_roll = gr.Slider(minimum=-10.0, maximum=10.0, step=0.1, value=0.0, label="Roll (Rotation)")
# Advanced Settings
with gr.Accordion("βοΈ Advanced Settings", open=False):
with gr.Row():
num_frames = gr.Slider(minimum=8, maximum=32, step=8, value=16, label="Number of Frames")
num_inference_steps = gr.Slider(minimum=10, maximum=100, step=1, value=25, label="Inference Steps")
with gr.Row():
guidance_scale = gr.Slider(minimum=1.0, maximum=20.0, step=0.5, value=7.5, label="CFG Scale")
seed = gr.Number(value=-1, label="Seed (-1 for random)", precision=0)
generate_btn = gr.Button("Generate Video π", variant="primary", size="lg")
with gr.Column(scale=3):
# Output Area
output_video = gr.Video(label="Generated Video", interactive=False)
output_seed = gr.Number(label="Used Seed", interactive=False)
gr.Markdown(
"""
### π‘ Tips for Better Results
* **Pan/Tilt:** Negative values go Left/Up, positive values go Right/Down.
* **Zoom:** Positive values zoom in, negative values zoom out.
* High CFG scales (>10) might cause visual artifacts depending on the prompt.
"""
)
# Event Wiring
generate_btn.click(
fn=generate_motion_video,
inputs=[
prompt,
camera_pan,
camera_tilt,
camera_zoom,
camera_roll,
num_frames,
guidance_scale,
num_inference_steps,
seed
],
outputs=[output_video, output_seed]
)
if __name__ == "__main__":
# Launching with debug mode enabled and queue for handling multiple users smoothly
app.queue(max_size=10).launch(debug=True, show_api=False) |