import gradio as gr import os from lumaai import AsyncLumaAI import asyncio import aiohttp async def get_camera_motions(): api_key = os.getenv("LMGEN_KEY") if not api_key: raise gr.Error("LMGEN_KEY environment variable is not set.") client = AsyncLumaAI(auth_token=api_key) try: motions = await client.generations.camera_motion.list() return [str(motion) for motion in motions] # Convert each motion to a string except Exception as e: print(f"Error fetching camera motions: {str(e)}") return [] # 나머지 함수들 (generate_video, text_to_video, image_to_video)은 변경하지 않습니다... with gr.Blocks() as demo: gr.Markdown("# Luma AI Text-to-Video Demo") with gr.Tab("Text to Video"): prompt = gr.Textbox(label="Prompt") generate_btn = gr.Button("Generate Video") video_output = gr.Video(label="Generated Video") error_output = gr.Textbox(label="Error Messages", visible=True) with gr.Accordion("Advanced Options", open=False): loop = gr.Checkbox(label="Loop", value=False) aspect_ratio = gr.Dropdown(label="Aspect Ratio", choices=["16:9", "1:1", "9:16", "4:3", "3:4"], value="16:9") camera_motion = gr.Dropdown(label="Camera Motion", choices=[]) extend_id = gr.Textbox(label="Extend Video ID (optional)") reverse_extend_id = gr.Textbox(label="Reverse Extend Video ID (optional)") with gr.Row(): interpolate_id1 = gr.Textbox(label="Interpolate Video ID 1 (optional)") interpolate_id2 = gr.Textbox(label="Interpolate Video ID 2 (optional)") generate_btn.click( text_to_video, inputs=[prompt, loop, aspect_ratio, camera_motion, extend_id, reverse_extend_id, interpolate_id1, interpolate_id2], outputs=[video_output, error_output] ) with gr.Tab("Image to Video"): img_prompt = gr.Textbox(label="Prompt") img_url = gr.Textbox(label="Image URL") img_generate_btn = gr.Button("Generate Video from Image") img_video_output = gr.Video(label="Generated Video") img_error_output = gr.Textbox(label="Error Messages", visible=True) with gr.Accordion("Advanced Options", open=False): img_loop = gr.Checkbox(label="Loop", value=False) img_aspect_ratio = gr.Dropdown(label="Aspect Ratio", choices=["16:9", "1:1", "9:16", "4:3", "3:4"], value="16:9") img_camera_motion = gr.Dropdown(label="Camera Motion", choices=[]) img_generate_btn.click( image_to_video, inputs=[img_prompt, img_url, img_loop, img_aspect_ratio, img_camera_motion], outputs=[img_video_output, img_error_output] ) async def update_camera_motions(): try: motions = await get_camera_motions() return {camera_motion: gr.update(choices=motions), img_camera_motion: gr.update(choices=motions)} except Exception as e: print(f"Error updating camera motions: {str(e)}") return {camera_motion: gr.update(choices=[]), img_camera_motion: gr.update(choices=[])} demo.load(update_camera_motions) demo.queue().launch(debug=True)