kailouis's picture
Update app.py
da36c22 verified
import gradio as gr
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
import torch
from moviepy import ImageSequenceClip
import numpy as np
import random
# Load model
device = "cuda" if torch.cuda.is_available() else "cpu"
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
variant="fp16"
).to(device)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
def generate_frames(prompt, num_frames, guidance_scale, num_inference_steps, seed):
frames = []
seed = seed if seed is not None else random.randint(0, 1000000)
generator = torch.Generator(device=device).manual_seed(seed)
with torch.inference_mode():
for i in range(num_frames):
# Variasikan prompt sedikit untuk setiap frame
prompt_with_variation = f"{prompt} --v {i}"
image = pipe(prompt_with_variation,
num_images=1,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
generator=generator).images[0]
frames.append(np.array(image))
return frames
def create_video(frames, output_filename="output.mp4", fps=24):
clip = ImageSequenceClip(frames, fps=fps)
clip.write_videofile(output_filename, codec='libx264', audio=False, bitrate="5000k")
return output_filename
def process_video(prompt, num_frames, guidance_scale, num_inference_steps, seed):
frames = generate_frames(prompt, num_frames, guidance_scale, num_inference_steps, seed)
output_filename = create_video(frames)
return gr.File(output_filename)
iface = gr.Interface(
fn=process_video,
inputs=[
gr.Textbox(lines=1, placeholder="Masukkan prompt Anda di sini...", label="Prompt"),
gr.Slider(minimum=5, maximum=30, step=1, value=10, label="Jumlah Frame"),
gr.Slider(minimum=1, maximum=20, step=0.5, value=7.5, label="Guidance Scale"),
gr.Slider(minimum=10, maximum=50, step=5, value=20, label="Inference Steps"),
gr.Number(label="Seed (opsional)", value=None),
],
outputs=gr.File(label="Video Output"),
title="Stable Diffusion Video Generator",
description="Buat video pendek dari text prompt menggunakan Stable Diffusion!",
)
iface.launch(share=True)