Robuxy0016's picture
Create app.py
b97e433 verified
Raw History Blame Contribute Delete
5.41 kB
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)