Spaces:
Sleeping
Sleeping
| try: | |
| import spaces | |
| except ImportError: | |
| class spaces: | |
| def GPU(duration=None): | |
| def decorator(func): | |
| return func | |
| return decorator | |
| import gradio as gr | |
| from diffusers import LTXPipeline | |
| from diffusers.utils import export_to_video | |
| import torch | |
| import random | |
| # Load pipeline | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| pipe = LTXPipeline.from_pretrained("Lightricks/LTX-Video", torch_dtype=torch.bfloat16) | |
| pipe.to(device) | |
| # Styles map | |
| STYLES = { | |
| "None": "{prompt}", | |
| "Cinematic": "{prompt}, cinematic style, highly detailed, photorealistic, 8k resolution, dramatic volumetric lighting, depth of field", | |
| "3D Animation": "{prompt}, 3D Pixar style character, vibrant colors, clean textures, whimsical, ray-traced shadows", | |
| "Cyberpunk": "{prompt}, cyberpunk aesthetic, glowing neon lights, rain-slicked streets, futuristic atmosphere, high contrast", | |
| "Anime": "{prompt}, modern anime style, beautiful hand-drawn aesthetics, soft color grading, high detail, studio Ghibli influence" | |
| } | |
| # seconds of GPU time this function may use | |
| def generate(prompt, negative_prompt, num_inference_steps, guidance_scale, resolution, num_frames, style, seed, randomize_seed): | |
| # Apply style template | |
| styled_prompt = STYLES.get(style, "{prompt}").format(prompt=prompt) | |
| # Parse resolution (e.g. "768x512") | |
| width, height = map(int, resolution.split("x")) | |
| if randomize_seed: | |
| seed = random.randint(0, 2**31 - 1) | |
| generator = torch.Generator(device="cpu").manual_seed(seed) | |
| video = pipe( | |
| prompt=styled_prompt, | |
| negative_prompt=negative_prompt, | |
| width=width, | |
| height=height, | |
| num_frames=int(num_frames), | |
| num_inference_steps=int(num_inference_steps), | |
| guidance_scale=float(guidance_scale), | |
| generator=generator | |
| ).frames[0] | |
| export_to_video(video, "output.mp4", fps=24) | |
| return "output.mp4", seed | |
| # Custom Gradio UI with advanced quality controls | |
| with gr.Blocks(title="LTX-Video Generator Pro") as demo: | |
| gr.Markdown("# 🎬 LTX-Video Text-to-Video Generator") | |
| gr.Markdown("Generate high-quality videos using Lightricks LTX-Video on Hugging Face ZeroGPU.") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| prompt = gr.Textbox( | |
| label="Prompt", | |
| placeholder="A cinematic shot of a sunset over the ocean, high quality, 4k", | |
| lines=3 | |
| ) | |
| style = gr.Dropdown( | |
| label="Prompt Style Preset", | |
| choices=list(STYLES.keys()), | |
| value="None" | |
| ) | |
| negative_prompt = gr.Textbox( | |
| label="Negative Prompt (Aids Quality)", | |
| value="worst quality, low quality, deformed, distorted, blurry, noisy, static, cartoon, lowres", | |
| lines=2 | |
| ) | |
| with gr.Accordion("Advanced Settings (Quality Controls)", open=True): | |
| resolution = gr.Dropdown( | |
| label="Resolution", | |
| choices=["768x512", "512x768", "768x768", "960x544"], | |
| value="768x512" | |
| ) | |
| num_frames = gr.Slider( | |
| label="Number of Frames (Multiple of 8 + 1)", | |
| minimum=17, | |
| maximum=121, | |
| step=8, | |
| value=65 | |
| ) | |
| num_inference_steps = gr.Slider( | |
| label="Inference Steps (Higher = more detail)", | |
| minimum=10, | |
| maximum=50, | |
| step=1, | |
| value=30 | |
| ) | |
| guidance_scale = gr.Slider( | |
| label="Guidance Scale (Prompt adherence)", | |
| minimum=1.0, | |
| maximum=10.0, | |
| step=0.5, | |
| value=3.0 | |
| ) | |
| seed = gr.Number( | |
| label="Seed", | |
| value=42, | |
| precision=0 | |
| ) | |
| randomize_seed = gr.Checkbox( | |
| label="Randomize Seed on Generate", | |
| value=True | |
| ) | |
| generate_btn = gr.Button("Generate Video", variant="primary") | |
| with gr.Column(scale=1): | |
| output_video = gr.Video(label="Generated Video") | |
| output_seed = gr.Number(label="Used Seed") | |
| generate_btn.click( | |
| fn=generate, | |
| inputs=[prompt, negative_prompt, num_inference_steps, guidance_scale, resolution, num_frames, style, seed, randomize_seed], | |
| outputs=[output_video, output_seed] | |
| ) | |
| demo.launch() |