#!/usr/bin/env python from __future__ import annotations import os import random import tempfile import gradio as gr import imageio import numpy as np import torch from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler from gradio.themes.utils import sizes theme = gr.themes.Default(radius_size=sizes.radius_none).set( block_label_text_color = '#4D63FF', block_title_text_color = '#4D63FF', button_primary_text_color = '#4D63FF', button_primary_background_fill='#FFFFFF', button_primary_border_color='#4D63FF', button_primary_background_fill_hover='#EDEFFF', ) css = "footer {visibility: hidden}" MAX_NUM_FRAMES = int(os.getenv('MAX_NUM_FRAMES', '200')) DEFAULT_NUM_FRAMES = min(MAX_NUM_FRAMES, int(os.getenv('DEFAULT_NUM_FRAMES', '16'))) pipe = DiffusionPipeline.from_pretrained('damo-vilab/text-to-video-ms-1.7b', torch_dtype=torch.float16, variant='fp16') pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config) pipe.enable_model_cpu_offload() pipe.enable_vae_slicing() def to_video(frames: list[np.ndarray], fps: int) -> str: out_file = tempfile.NamedTemporaryFile(suffix='.mp4', delete=False) writer = imageio.get_writer(out_file.name, format='FFMPEG', fps=fps) for frame in frames: writer.append_data(frame) writer.close() return out_file.name def generate(prompt: str, seed: int, num_frames: int, num_inference_steps: int) -> str: if seed == -1: seed = random.randint(0, 1000000) generator = torch.Generator().manual_seed(seed) frames = pipe(prompt, num_inference_steps=num_inference_steps, num_frames=num_frames, generator=generator).frames return to_video(frames, 8) examples = [ ['An astronaut riding a horse.', 0, 16, 25], ['A panda eating bamboo on a rock.', 0, 16, 25], ['Spiderman is surfing.', 0, 16, 25], ] with gr.Blocks(theme=theme, css=css) as demo: gr.Markdown("""