mirage / app.py
MacBook pro
Optimize for HuggingFace Spaces: simplified Gradio interface and reduced dependencies
755d25a
raw
history blame
5.51 kB
#!/usr/bin/env python3
"""
Streamlined Gradio interface for Mirage AI Avatar System
Optimized for HuggingFace Spaces deployment
"""
import gradio as gr
import numpy as np
import cv2
import torch
import os
import sys
from pathlib import Path
import logging
import asyncio
from typing import Optional
# Setup logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class MirageAvatarDemo:
"""Simplified demo interface for HuggingFace Spaces"""
def __init__(self):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.pipeline_loaded = False
logger.info(f"Using device: {self.device}")
def load_models(self):
"""Lazy loading of AI models"""
if self.pipeline_loaded:
return "Models already loaded"
try:
# This will be called only when actually needed
logger.info("Loading AI models...")
# For now, just simulate loading
# In production, load actual models here
import time
time.sleep(2) # Simulate loading time
self.pipeline_loaded = True
return "βœ… AI Pipeline loaded successfully!"
except Exception as e:
logger.error(f"Model loading failed: {e}")
return f"❌ Failed to load models: {str(e)}"
def process_avatar(self, image, audio=None):
"""Process image/audio for avatar generation"""
if not self.pipeline_loaded:
return None, "⚠️ Please initialize the pipeline first"
if image is None:
return None, "❌ Please provide an input image"
try:
# For demo purposes, just return the input image
# In production, this would run the full AI pipeline
logger.info("Processing avatar...")
# Simple demo processing
processed_image = image.copy()
return processed_image, "βœ… Avatar processed successfully!"
except Exception as e:
logger.error(f"Processing failed: {e}")
return None, f"❌ Processing failed: {str(e)}"
# Initialize the demo
demo_instance = MirageAvatarDemo()
def initialize_pipeline():
"""Initialize the AI pipeline"""
return demo_instance.load_models()
def generate_avatar(image, audio):
"""Generate avatar from input"""
return demo_instance.process_avatar(image, audio)
# Create Gradio interface
def create_interface():
"""Create the Gradio interface"""
with gr.Blocks(
title="Mirage AI Avatar System",
theme=gr.themes.Soft(primary_hue="blue")
) as interface:
gr.Markdown("# 🎭 Mirage Real-time AI Avatar")
gr.Markdown("Transform your appearance and voice in real-time using AI")
with gr.Row():
with gr.Column():
gr.Markdown("## Setup")
init_btn = gr.Button("πŸš€ Initialize AI Pipeline", variant="primary")
init_status = gr.Textbox(label="Status", interactive=False)
gr.Markdown("## Input")
input_image = gr.Image(
label="Reference Image",
type="numpy",
height=300
)
input_audio = gr.Audio(
label="Voice Sample (Optional)",
type="filepath"
)
process_btn = gr.Button("✨ Generate Avatar", variant="secondary")
with gr.Column():
gr.Markdown("## Output")
output_image = gr.Image(
label="Avatar Output",
type="numpy",
height=300
)
output_status = gr.Textbox(label="Processing Status", interactive=False)
gr.Markdown("## System Info")
device_info = gr.Textbox(
label="Device",
value=f"{'πŸš€ GPU (CUDA)' if torch.cuda.is_available() else 'πŸ–₯️ CPU'}",
interactive=False
)
gr.Markdown("""
### πŸ“‹ Instructions
1. Click "Initialize AI Pipeline" to load the models
2. Upload a reference image (your face)
3. Optionally provide a voice sample for voice conversion
4. Click "Generate Avatar" to process
### βš™οΈ Technical Details
This demo showcases the Mirage AI Avatar system, which combines:
- **Face Detection**: SCRFD for real-time face detection
- **Animation**: LivePortrait for facial animation
- **Voice Conversion**: RVC for voice transformation
- **Real-time Processing**: Optimized for <250ms latency
""")
# Event handlers
init_btn.click(
fn=initialize_pipeline,
inputs=[],
outputs=[init_status]
)
process_btn.click(
fn=generate_avatar,
inputs=[input_image, input_audio],
outputs=[output_image, output_status]
)
return interface
# Launch the interface
if __name__ == "__main__":
interface = create_interface()
interface.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)