Spaces:
Running
Running
Pravin Barapatre
Fix: Always return dict for gr.JSON model_info to avoid gradio_client TypeError
7bd9a2d | import gradio as gr | |
| import logging | |
| import tempfile | |
| import os | |
| # Set up logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| def create_interface(): | |
| """Create the Gradio interface""" | |
| def generate_video_interface(prompt, model_id, num_frames, fps, num_inference_steps, guidance_scale, seed): | |
| """Interface function for video generation""" | |
| if not prompt.strip(): | |
| return None, "Please enter a video description" | |
| # For demo purposes, return a message instead of actual video generation | |
| # This will work on Hugging Face Spaces without NumPy issues | |
| return None, f"Demo mode: Would generate video for '{prompt}' using {model_id} with {num_frames} frames at {fps} FPS" | |
| # Custom CSS for better styling | |
| custom_css = """ | |
| .gradio-container { | |
| max-width: 1200px !important; | |
| margin: 0 auto !important; | |
| } | |
| .generate-btn { | |
| background: linear-gradient(45deg, #667eea 0%, #764ba2 100%) !important; | |
| border: none !important; | |
| color: white !important; | |
| font-weight: bold !important; | |
| } | |
| .status-box { | |
| background-color: #f8f9fa !important; | |
| border: 1px solid #dee2e6 !important; | |
| } | |
| """ | |
| # Available models for demo | |
| models = { | |
| "damo-vilab/text-to-video-ms-1.7b": { | |
| "name": "DAMO Text-to-Video MS-1.7B", | |
| "description": "Fast and efficient text-to-video model", | |
| "max_frames": 16, | |
| "fps": 8, | |
| "quality": "Good", | |
| "speed": "Fast" | |
| }, | |
| "cerspense/zeroscope_v2_XL": { | |
| "name": "Zeroscope v2 XL", | |
| "description": "High-quality text-to-video model", | |
| "max_frames": 24, | |
| "fps": 6, | |
| "quality": "Excellent", | |
| "speed": "Medium" | |
| } | |
| } | |
| # Create interface | |
| with gr.Blocks(title="AI Video Creator Pro", theme=gr.themes.Soft(), css=custom_css) as interface: | |
| # Professional Header | |
| with gr.Group(): | |
| gr.Markdown(""" | |
| # π¬ AI Video Creator Pro | |
| ### Transform Your Ideas Into Stunning Videos with AI-Powered Generation | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| # Main Input Section | |
| with gr.Group(): | |
| gr.Markdown("## π― Video Generation") | |
| prompt = gr.Textbox( | |
| label="π Video Description", | |
| placeholder="Describe the video you want to create... (e.g., 'A majestic dragon soaring through a mystical forest with glowing mushrooms')", | |
| lines=3, | |
| max_lines=5, | |
| container=True | |
| ) | |
| model_id = gr.Dropdown( | |
| choices=list(models.keys()), | |
| value=list(models.keys())[0], | |
| label="π€ AI Model", | |
| info="Choose the AI model for video generation", | |
| container=True | |
| ) | |
| with gr.Row(): | |
| num_frames = gr.Slider( | |
| minimum=8, | |
| maximum=32, | |
| value=16, | |
| step=1, | |
| label="ποΈ Video Length (Frames)", | |
| info="More frames = longer video" | |
| ) | |
| fps = gr.Slider( | |
| minimum=4, | |
| maximum=12, | |
| value=8, | |
| step=1, | |
| label="β‘ FPS", | |
| info="Frames per second" | |
| ) | |
| with gr.Row(): | |
| num_inference_steps = gr.Slider( | |
| minimum=10, | |
| maximum=50, | |
| value=25, | |
| step=1, | |
| label="π¨ Quality Steps", | |
| info="More steps = better quality but slower" | |
| ) | |
| guidance_scale = gr.Slider( | |
| minimum=1.0, | |
| maximum=20.0, | |
| value=7.5, | |
| step=0.5, | |
| label="π― Guidance Scale", | |
| info="Higher values = more prompt adherence" | |
| ) | |
| seed = gr.Number( | |
| label="π² Seed (Optional)", | |
| value=None, | |
| info="Set for reproducible results", | |
| container=True | |
| ) | |
| # Generate Button | |
| generate_btn = gr.Button("π Generate Professional Video", variant="primary", size="lg") | |
| # Output Section | |
| with gr.Group(): | |
| gr.Markdown("## πΊ Generated Video") | |
| status_text = gr.Textbox(label="π Status", interactive=False) | |
| video_output = gr.Video(label="π¬ Your Video") | |
| with gr.Column(scale=1): | |
| # Model Information | |
| with gr.Group(): | |
| gr.Markdown("## π€ AI Model Details") | |
| model_info = gr.JSON(label="Current Model Specifications") | |
| # Examples | |
| with gr.Group(): | |
| gr.Markdown("## π‘ Inspiration Examples") | |
| gr.Markdown(""" | |
| **Try these example prompts:** | |
| β’ A beautiful sunset over the ocean with waves crashing on the shore | |
| β’ A cat playing with a ball of yarn in a cozy living room | |
| β’ A futuristic city with flying cars and neon lights | |
| β’ A butterfly emerging from a cocoon in a garden | |
| β’ A rocket launching into space with fire and smoke | |
| β’ A majestic dragon soaring through a mystical forest with glowing mushrooms | |
| """) | |
| # Features | |
| with gr.Group(): | |
| gr.Markdown("## β¨ Features") | |
| gr.Markdown(""" | |
| π¬ **Multiple AI Models** | |
| - State-of-the-art video generation | |
| - Quality vs speed options | |
| π¨ **Advanced Controls** | |
| - Quality settings | |
| - Reproducible results | |
| β‘ **Fast Processing** | |
| - GPU acceleration | |
| - Optimized pipelines | |
| """) | |
| # Event handlers | |
| generate_btn.click( | |
| fn=generate_video_interface, | |
| inputs=[prompt, model_id, num_frames, fps, num_inference_steps, guidance_scale, seed], | |
| outputs=[video_output, status_text] | |
| ) | |
| # Update model info when model changes | |
| def update_model_info(model_id): | |
| info = models.get(model_id, {"error": "Model not found"}) | |
| if not isinstance(info, dict): | |
| info = {"error": "Invalid model info"} | |
| return info | |
| model_id.change( | |
| fn=update_model_info, | |
| inputs=model_id, | |
| outputs=model_info | |
| ) | |
| # Load initial model info | |
| interface.load(lambda: models[list(models.keys())[0]], outputs=model_info) | |
| return interface | |
| # Create and launch the interface | |
| interface = create_interface() | |
| interface.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=True, | |
| show_error=True | |
| ) |