Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import torch | |
| import gc | |
| from typing import Optional | |
| # Check if we're running on Hugging Face Spaces | |
| IS_SPACES = os.environ.get("SPACE_ID") is not None | |
| def check_gpu_memory(): | |
| """Check available GPU memory""" | |
| if torch.cuda.is_available(): | |
| return torch.cuda.get_device_properties(0).total_memory / 1024**3 | |
| return 0 | |
| def load_model(): | |
| """Load the HunyuanVideo model with error handling""" | |
| try: | |
| # For Hugging Face Spaces, we need to be careful with memory | |
| if IS_SPACES: | |
| print("Running on Hugging Face Spaces") | |
| gpu_memory = check_gpu_memory() | |
| print(f"Available GPU memory: {gpu_memory:.1f} GB") | |
| # Try to load the model | |
| from transformers import AutoModel, AutoTokenizer | |
| model_name = "tencent/HunyuanVideo" | |
| # Use CPU if no GPU or limited memory | |
| device = "cuda" if torch.cuda.is_available() and check_gpu_memory() > 8 else "cpu" | |
| print(f"Using device: {device}") | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| # Load model with appropriate settings for Spaces | |
| model = AutoModel.from_pretrained( | |
| model_name, | |
| torch_dtype=torch.float16 if device == "cuda" else torch.float32, | |
| device_map="auto" if device == "cuda" else None, | |
| low_cpu_mem_usage=True | |
| ) | |
| return model, tokenizer, device | |
| except Exception as e: | |
| print(f"Error loading model: {e}") | |
| return None, None, "cpu" | |
| # Initialize model | |
| MODEL, TOKENIZER, DEVICE = load_model() | |
| def generate_video(prompt: str, duration: int = 5, resolution: str = "512x512") -> str: | |
| """Generate video from text prompt""" | |
| if MODEL is None: | |
| return "❌ Model not loaded. This might be due to memory limitations on Hugging Face Spaces." | |
| try: | |
| # Clear GPU cache if using CUDA | |
| if DEVICE == "cuda": | |
| torch.cuda.empty_cache() | |
| gc.collect() | |
| # Parse resolution | |
| width, height = map(int, resolution.split('x')) | |
| # Basic validation | |
| if not prompt.strip(): | |
| return "❌ Please enter a valid prompt." | |
| if duration < 1 or duration > 10: | |
| return "❌ Duration must be between 1-10 seconds." | |
| # This is where you would implement the actual video generation | |
| # For now, return a placeholder message | |
| return f""" | |
| ✅ Video generation request processed: | |
| 📝 Prompt: {prompt} | |
| ⏱️ Duration: {duration} seconds | |
| 📐 Resolution: {resolution} | |
| 🖥️ Device: {DEVICE} | |
| Note: Actual video generation implementation needed. | |
| The model is loaded and ready for inference. | |
| """ | |
| except Exception as e: | |
| return f"❌ Error during generation: {str(e)}" | |
| def get_system_info(): | |
| """Get system information for debugging""" | |
| info = f""" | |
| 🖥️ **System Information:** | |
| - Python: {os.sys.version.split()[0]} | |
| - PyTorch: {torch.__version__} | |
| - CUDA Available: {torch.cuda.is_available()} | |
| - GPU Memory: {check_gpu_memory():.1f} GB | |
| - Running on Spaces: {IS_SPACES} | |
| - Device: {DEVICE} | |
| - Model Loaded: {'✅' if MODEL is not None else '❌'} | |
| """ | |
| return info | |
| # Create Gradio interface | |
| with gr.Blocks(title="HunyuanVideo Generator", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🎬 HunyuanVideo Text-to-Video Generator") | |
| gr.Markdown("Generate videos from text descriptions using the HunyuanVideo model.") | |
| with gr.Tab("Generate Video"): | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| prompt_input = gr.Textbox( | |
| label="📝 Video Description", | |
| placeholder="A cat playing with a ball of yarn in a sunny garden...", | |
| lines=3, | |
| max_lines=5 | |
| ) | |
| with gr.Row(): | |
| duration_slider = gr.Slider( | |
| minimum=1, | |
| maximum=10, | |
| value=5, | |
| step=1, | |
| label="⏱️ Duration (seconds)" | |
| ) | |
| resolution_dropdown = gr.Dropdown( | |
| choices=["256x256", "512x512", "768x768", "1024x1024"], | |
| value="512x512", | |
| label="📐 Resolution" | |
| ) | |
| generate_btn = gr.Button("🎬 Generate Video", variant="primary", size="lg") | |
| with gr.Column(scale=1): | |
| output_text = gr.Textbox( | |
| label="📋 Output", | |
| lines=10, | |
| show_copy_button=True | |
| ) | |
| # Event handler | |
| generate_btn.click( | |
| fn=generate_video, | |
| inputs=[prompt_input, duration_slider, resolution_dropdown], | |
| outputs=output_text | |
| ) | |
| # Example prompts | |
| gr.Examples( | |
| examples=[ | |
| ["A beautiful sunset over a calm ocean with gentle waves", 5, "512x512"], | |
| ["A cat gracefully jumping between rooftops in a medieval town", 7, "768x768"], | |
| ["Cherry blossoms falling in a Japanese garden", 4, "512x512"], | |
| ["A spacecraft flying through a colorful nebula", 8, "1024x1024"] | |
| ], | |
| inputs=[prompt_input, duration_slider, resolution_dropdown] | |
| ) | |
| with gr.Tab("System Info"): | |
| info_button = gr.Button("🔍 Check System Info") | |
| info_output = gr.Markdown() | |
| info_button.click( | |
| fn=get_system_info, | |
| outputs=info_output | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| demo.launch( | |
| share=False, # Hugging Face Spaces handles sharing | |
| server_name="0.0.0.0", # Important for Spaces | |
| server_port=7860, # Default port for Spaces | |
| show_error=True | |
| ) |