|
import gradio as gr |
|
import requests |
|
import random |
|
import time |
|
|
|
|
|
FAL_API_URL = "https://api.fal.ai/fal-ai/wan2.1-t2v-1.3b" |
|
|
|
|
|
def generate_video(prompt, fps, num_frames, aspect_ratio, guidance_scale, seed, token): |
|
headers = { |
|
"Authorization": f"Bearer {token}" |
|
} |
|
|
|
payload = { |
|
"prompt": prompt, |
|
"num_frames": num_frames, |
|
"fps": fps, |
|
"aspect_ratio": aspect_ratio, |
|
"guidance_scale": guidance_scale, |
|
"negative_prompt": "", |
|
"seed": int(seed) |
|
} |
|
|
|
|
|
response = requests.post(FAL_API_URL, json=payload, headers=headers) |
|
response.raise_for_status() |
|
result = response.json() |
|
|
|
|
|
video_url = None |
|
for _ in range(20): |
|
time.sleep(2) |
|
poll = requests.get(result["urls"]["get"], headers=headers) |
|
poll.raise_for_status() |
|
status = poll.json() |
|
if status["status"] == "COMPLETED": |
|
video_url = status["output"]["video_url"] |
|
break |
|
elif status["status"] == "FAILED": |
|
raise Exception("Video generation failed.") |
|
|
|
if not video_url: |
|
raise Exception("Timeout waiting for video.") |
|
|
|
return video_url |
|
|
|
|
|
with gr.Blocks(fill_height=True) as demo: |
|
with gr.Sidebar(): |
|
gr.Markdown("# Wan2.1 T2V Generator") |
|
gr.Markdown("Sign in to use this model.") |
|
login_button = gr.LoginButton() |
|
|
|
gr.Markdown("## 🎬 Generate Video from Text") |
|
with gr.Row(): |
|
with gr.Column(): |
|
text_input = gr.Textbox(label="Prompt", placeholder="Enter your prompt...") |
|
fps_slider = gr.Slider(1, 24, value=8, label="FPS") |
|
frames_slider = gr.Slider(8, 48, value=24, label="Number of Frames") |
|
aspect_ratio = gr.Dropdown(choices=["square", "landscape", "portrait"], value="square", label="Aspect Ratio") |
|
guidance_scale = gr.Slider(1, 20, value=15, label="Guidance Scale") |
|
seed_input = gr.Number(value=random.randint(1, 99999), label="Seed") |
|
generate_button = gr.Button("Generate Video") |
|
with gr.Column(): |
|
video_output = gr.Video(label="Generated Video") |
|
|
|
|
|
generate_button.click( |
|
fn=generate_video, |
|
inputs=[text_input, fps_slider, frames_slider, aspect_ratio, guidance_scale, seed_input, login_button], |
|
outputs=video_output |
|
) |
|
|
|
demo.launch() |
|
|