Spaces:
Running
Fix all runtime errors and permission issues
Browse filesπ§ Critical Fixes:
β
Fixed import error: advanced_tts_client_fixed β advanced_tts_client
β
Fixed Gradio permission error with flagging disabled
β
Fixed matplotlib config permission with MPLCONFIGDIR
β
Upgraded Gradio to 4.44.1 (latest stable)
β
Fixed deprecation warning: on_event β lifespan
β
Added proper directory creation with permissions
π³ Container Fixes:
β
Updated Dockerfile with writable directories
β
Set proper environment variables
β
Created /tmp/gradio_flagged with 777 permissions
β
Set GRADIO_ALLOW_FLAGGING=never
π― App Improvements:
β
Added lifespan context manager for FastAPI
β
Enhanced error handling and logging
β
Proper directory creation on startup
β
Better permission management
Result: All runtime errors should now be resolved!
- Dockerfile +15 -8
- app.py +30 -7
- requirements.txt +2 -1
|
@@ -10,8 +10,16 @@ RUN apt-get update && apt-get install -y \
|
|
| 10 |
libsndfile1 \
|
| 11 |
&& rm -rf /var/lib/apt/lists/*
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
# Copy requirements first for better caching
|
| 14 |
-
COPY
|
| 15 |
|
| 16 |
# Install Python dependencies
|
| 17 |
RUN pip install --no-cache-dir -r requirements.txt
|
|
@@ -19,15 +27,14 @@ RUN pip install --no-cache-dir -r requirements.txt
|
|
| 19 |
# Copy application code
|
| 20 |
COPY . .
|
| 21 |
|
| 22 |
-
# Create outputs directory
|
| 23 |
-
RUN mkdir -p outputs
|
| 24 |
-
|
| 25 |
-
# Expose port
|
| 26 |
-
EXPOSE 7860
|
| 27 |
-
|
| 28 |
# Set environment variables
|
| 29 |
ENV PYTHONPATH=/app
|
| 30 |
ENV PYTHONUNBUFFERED=1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
# Run the application
|
| 33 |
-
CMD ["python", "
|
|
|
|
| 10 |
libsndfile1 \
|
| 11 |
&& rm -rf /var/lib/apt/lists/*
|
| 12 |
|
| 13 |
+
# Create writable directories
|
| 14 |
+
RUN mkdir -p /tmp/gradio_flagged \
|
| 15 |
+
/tmp/matplotlib \
|
| 16 |
+
/app/outputs \
|
| 17 |
+
&& chmod 777 /tmp/gradio_flagged \
|
| 18 |
+
&& chmod 777 /tmp/matplotlib \
|
| 19 |
+
&& chmod 777 /app/outputs
|
| 20 |
+
|
| 21 |
# Copy requirements first for better caching
|
| 22 |
+
COPY requirements_fixed.txt requirements.txt
|
| 23 |
|
| 24 |
# Install Python dependencies
|
| 25 |
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
| 27 |
# Copy application code
|
| 28 |
COPY . .
|
| 29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
# Set environment variables
|
| 31 |
ENV PYTHONPATH=/app
|
| 32 |
ENV PYTHONUNBUFFERED=1
|
| 33 |
+
ENV MPLCONFIGDIR=/tmp/matplotlib
|
| 34 |
+
ENV GRADIO_ALLOW_FLAGGING=never
|
| 35 |
+
|
| 36 |
+
# Expose port
|
| 37 |
+
EXPOSE 7860
|
| 38 |
|
| 39 |
# Run the application
|
| 40 |
+
CMD ["python", "app_fixed_v2.py"]
|
|
@@ -26,6 +26,10 @@ load_dotenv()
|
|
| 26 |
logging.basicConfig(level=logging.INFO)
|
| 27 |
logger = logging.getLogger(__name__)
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
app = FastAPI(title="OmniAvatar-14B API with Advanced TTS", version="1.0.0")
|
| 30 |
|
| 31 |
# Add CORS middleware
|
|
@@ -37,6 +41,10 @@ app.add_middleware(
|
|
| 37 |
allow_headers=["*"],
|
| 38 |
)
|
| 39 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
# Mount static files for serving generated videos
|
| 41 |
app.mount("/outputs", StaticFiles(directory="outputs"), name="outputs")
|
| 42 |
|
|
@@ -77,7 +85,7 @@ class GenerateResponse(BaseModel):
|
|
| 77 |
|
| 78 |
# Try to import TTS clients, but make them optional
|
| 79 |
try:
|
| 80 |
-
from
|
| 81 |
ADVANCED_TTS_AVAILABLE = True
|
| 82 |
logger.info("β
Advanced TTS client available")
|
| 83 |
except ImportError as e:
|
|
@@ -423,9 +431,12 @@ class OmniAvatarAPI:
|
|
| 423 |
# Initialize API
|
| 424 |
omni_api = OmniAvatarAPI()
|
| 425 |
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
|
|
|
|
|
|
|
|
|
| 429 |
success = omni_api.load_model()
|
| 430 |
if not success:
|
| 431 |
logger.warning("OmniAvatar model loading failed on startup")
|
|
@@ -436,6 +447,14 @@ async def startup_event():
|
|
| 436 |
logger.info("TTS models initialization completed")
|
| 437 |
except Exception as e:
|
| 438 |
logger.error(f"TTS initialization failed: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 439 |
|
| 440 |
@app.get("/health")
|
| 441 |
async def health_check():
|
|
@@ -498,7 +517,7 @@ async def generate_avatar(request: GenerateRequest):
|
|
| 498 |
logger.error(f"Unexpected error: {e}")
|
| 499 |
raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")
|
| 500 |
|
| 501 |
-
# Enhanced Gradio interface
|
| 502 |
def gradio_generate(prompt, text_to_speech, audio_url, image_url, voice_id, guidance_scale, audio_scale, num_steps):
|
| 503 |
"""Gradio interface wrapper with robust TTS support"""
|
| 504 |
if not omni_api.model_loaded:
|
|
@@ -542,7 +561,7 @@ def gradio_generate(prompt, text_to_speech, audio_url, image_url, voice_id, guid
|
|
| 542 |
logger.error(f"Gradio generation error: {e}")
|
| 543 |
return f"Error: {str(e)}"
|
| 544 |
|
| 545 |
-
# Gradio interface
|
| 546 |
iface = gr.Interface(
|
| 547 |
fn=gradio_generate,
|
| 548 |
inputs=[
|
|
@@ -636,7 +655,11 @@ iface = gr.Interface(
|
|
| 636 |
4.0,
|
| 637 |
35
|
| 638 |
]
|
| 639 |
-
]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 640 |
)
|
| 641 |
|
| 642 |
# Mount Gradio app
|
|
|
|
| 26 |
logging.basicConfig(level=logging.INFO)
|
| 27 |
logger = logging.getLogger(__name__)
|
| 28 |
|
| 29 |
+
# Set environment variables for matplotlib and gradio
|
| 30 |
+
os.environ['MPLCONFIGDIR'] = '/tmp/matplotlib'
|
| 31 |
+
os.environ['GRADIO_ALLOW_FLAGGING'] = 'never'
|
| 32 |
+
|
| 33 |
app = FastAPI(title="OmniAvatar-14B API with Advanced TTS", version="1.0.0")
|
| 34 |
|
| 35 |
# Add CORS middleware
|
|
|
|
| 41 |
allow_headers=["*"],
|
| 42 |
)
|
| 43 |
|
| 44 |
+
# Create directories with proper permissions
|
| 45 |
+
os.makedirs("outputs", exist_ok=True)
|
| 46 |
+
os.makedirs("/tmp/matplotlib", exist_ok=True)
|
| 47 |
+
|
| 48 |
# Mount static files for serving generated videos
|
| 49 |
app.mount("/outputs", StaticFiles(directory="outputs"), name="outputs")
|
| 50 |
|
|
|
|
| 85 |
|
| 86 |
# Try to import TTS clients, but make them optional
|
| 87 |
try:
|
| 88 |
+
from advanced_tts_client import AdvancedTTSClient
|
| 89 |
ADVANCED_TTS_AVAILABLE = True
|
| 90 |
logger.info("β
Advanced TTS client available")
|
| 91 |
except ImportError as e:
|
|
|
|
| 431 |
# Initialize API
|
| 432 |
omni_api = OmniAvatarAPI()
|
| 433 |
|
| 434 |
+
# Use FastAPI lifespan instead of deprecated on_event
|
| 435 |
+
from contextlib import asynccontextmanager
|
| 436 |
+
|
| 437 |
+
@asynccontextmanager
|
| 438 |
+
async def lifespan(app: FastAPI):
|
| 439 |
+
# Startup
|
| 440 |
success = omni_api.load_model()
|
| 441 |
if not success:
|
| 442 |
logger.warning("OmniAvatar model loading failed on startup")
|
|
|
|
| 447 |
logger.info("TTS models initialization completed")
|
| 448 |
except Exception as e:
|
| 449 |
logger.error(f"TTS initialization failed: {e}")
|
| 450 |
+
|
| 451 |
+
yield
|
| 452 |
+
|
| 453 |
+
# Shutdown (if needed)
|
| 454 |
+
logger.info("Application shutting down...")
|
| 455 |
+
|
| 456 |
+
# Apply lifespan to app
|
| 457 |
+
app.router.lifespan_context = lifespan
|
| 458 |
|
| 459 |
@app.get("/health")
|
| 460 |
async def health_check():
|
|
|
|
| 517 |
logger.error(f"Unexpected error: {e}")
|
| 518 |
raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")
|
| 519 |
|
| 520 |
+
# Enhanced Gradio interface with proper flagging configuration
|
| 521 |
def gradio_generate(prompt, text_to_speech, audio_url, image_url, voice_id, guidance_scale, audio_scale, num_steps):
|
| 522 |
"""Gradio interface wrapper with robust TTS support"""
|
| 523 |
if not omni_api.model_loaded:
|
|
|
|
| 561 |
logger.error(f"Gradio generation error: {e}")
|
| 562 |
return f"Error: {str(e)}"
|
| 563 |
|
| 564 |
+
# Create Gradio interface with fixed flagging settings
|
| 565 |
iface = gr.Interface(
|
| 566 |
fn=gradio_generate,
|
| 567 |
inputs=[
|
|
|
|
| 655 |
4.0,
|
| 656 |
35
|
| 657 |
]
|
| 658 |
+
],
|
| 659 |
+
# Disable flagging to prevent permission errors
|
| 660 |
+
allow_flagging="never",
|
| 661 |
+
# Set flagging directory to writable location
|
| 662 |
+
flagging_dir="/tmp/gradio_flagged"
|
| 663 |
)
|
| 664 |
|
| 665 |
# Mount Gradio app
|
|
@@ -1,7 +1,7 @@
|
|
| 1 |
ο»Ώ# Core web framework dependencies
|
| 2 |
fastapi==0.104.1
|
| 3 |
uvicorn[standard]==0.24.0
|
| 4 |
-
gradio==4.
|
| 5 |
|
| 6 |
# PyTorch ecosystem
|
| 7 |
torch>=2.0.0
|
|
@@ -18,6 +18,7 @@ opencv-python-headless>=4.8.0
|
|
| 18 |
librosa>=0.10.0
|
| 19 |
soundfile>=0.12.0
|
| 20 |
pillow>=9.5.0
|
|
|
|
| 21 |
|
| 22 |
# Scientific computing
|
| 23 |
numpy>=1.21.0
|
|
|
|
| 1 |
ο»Ώ# Core web framework dependencies
|
| 2 |
fastapi==0.104.1
|
| 3 |
uvicorn[standard]==0.24.0
|
| 4 |
+
gradio==4.44.1
|
| 5 |
|
| 6 |
# PyTorch ecosystem
|
| 7 |
torch>=2.0.0
|
|
|
|
| 18 |
librosa>=0.10.0
|
| 19 |
soundfile>=0.12.0
|
| 20 |
pillow>=9.5.0
|
| 21 |
+
matplotlib>=3.5.0
|
| 22 |
|
| 23 |
# Scientific computing
|
| 24 |
numpy>=1.21.0
|