Spaces:
Runtime error
Runtime error
Download app.py from Robuxy0016/Motion-Control-AI: direct link, hf CLI and curl.
- Browser
- Download file 5.41 kB
-
https://huggingface.co/spaces/Robuxy0016/Motion-Control-AI/resolve/main/app.py
- Command line
-
hf download hf://spaces/Robuxy0016/Motion-Control-AI/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Robuxy0016/Motion-Control-AI/resolve/main/app.py
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) |