Spaces:
Sleeping
Sleeping
MusaedMusaedSadeqMusaedAl-Fareh225739 commited on
Commit Β·
51afead
1
Parent(s): bd8aa92
updated docker file
Browse files- Dockerfile +27 -7
- mrrrme/audio/voice_emotion.py +31 -14
Dockerfile
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
# Hugging Face Spaces - MrrrMe with Coqui XTTS v2 + MODULAR BACKEND
|
|
|
|
| 2 |
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
|
| 3 |
|
| 4 |
# Install system dependencies
|
|
@@ -54,9 +55,25 @@ ENV COQUI_TOS_AGREED=1
|
|
| 54 |
COPY requirements_docker.txt ./
|
| 55 |
RUN python3.11 -m pip install --no-cache-dir -r requirements_docker.txt
|
| 56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
# PRE-DOWNLOAD XTTS V2 MODEL (Memory Safe)
|
| 58 |
# Uses ModelManager to download without loading to RAM (Fixes Exit 137)
|
| 59 |
-
RUN python3.11 -c "from TTS.utils.manage import ModelManager; print('β³ Downloading XTTS v2 model...'); ModelManager().download_model('tts_models/multilingual/multi-dataset/xtts_v2'); print('β
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
# Install avatar dependencies
|
| 62 |
RUN python3.11 -m pip install --no-cache-dir \
|
|
@@ -98,17 +115,20 @@ RUN mkdir -p /etc/nginx/certs && \
|
|
| 98 |
-days 365 \
|
| 99 |
-subj "/CN=mrrrme.hf.space"
|
| 100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
# β
Create startup script with MODULAR BACKEND + MODEL CACHING
|
| 102 |
-
RUN printf '#!/bin/bash\nset -e\nexport HOME=/home/user\nmkdir -p /tmp\n\n# Agree to TOS\nexport COQUI_TOS_AGREED=1\n\n# ============================================================\n# MODEL CACHING - emotion2vec
|
| 103 |
|
| 104 |
# Set ownership
|
| 105 |
RUN chown -R 1000:1000 /app
|
| 106 |
|
| 107 |
-
# Ensure non-root user has access to models
|
| 108 |
-
RUN mkdir -p /home/user/.local && \
|
| 109 |
-
cp -r /root/.local/share /home/user/.local/ || true && \
|
| 110 |
-
chown -R 1000:1000 /home/user
|
| 111 |
-
|
| 112 |
USER 1000
|
| 113 |
ENV HOME=/home/user
|
| 114 |
|
|
|
|
| 1 |
# Hugging Face Spaces - MrrrMe with Coqui XTTS v2 + MODULAR BACKEND
|
| 2 |
+
# FIXED: Pre-downloads emotion2vec during build for fast startup
|
| 3 |
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
|
| 4 |
|
| 5 |
# Install system dependencies
|
|
|
|
| 55 |
COPY requirements_docker.txt ./
|
| 56 |
RUN python3.11 -m pip install --no-cache-dir -r requirements_docker.txt
|
| 57 |
|
| 58 |
+
# ============================================================
|
| 59 |
+
# PRE-DOWNLOAD MODELS DURING BUILD (for fast startup!)
|
| 60 |
+
# ============================================================
|
| 61 |
+
|
| 62 |
# PRE-DOWNLOAD XTTS V2 MODEL (Memory Safe)
|
| 63 |
# Uses ModelManager to download without loading to RAM (Fixes Exit 137)
|
| 64 |
+
RUN python3.11 -c "from TTS.utils.manage import ModelManager; print('β³ Downloading XTTS v2 model...'); ModelManager().download_model('tts_models/multilingual/multi-dataset/xtts_v2'); print('β
XTTS v2 downloaded.')"
|
| 65 |
+
|
| 66 |
+
# PRE-DOWNLOAD emotion2vec+ Large (1.8GB) - FIXES SLOW STARTUP!
|
| 67 |
+
# Without this, the model downloads on every restart (5+ minutes)
|
| 68 |
+
RUN python3.11 -c "\
|
| 69 |
+
import os; \
|
| 70 |
+
os.makedirs('/root/.cache/modelscope', exist_ok=True); \
|
| 71 |
+
os.environ['MODELSCOPE_CACHE'] = '/root/.cache/modelscope'; \
|
| 72 |
+
os.environ['MS_CACHE_HOME'] = '/root/.cache/modelscope'; \
|
| 73 |
+
from funasr import AutoModel; \
|
| 74 |
+
print('β³ Downloading emotion2vec+ Large (1.8GB)...'); \
|
| 75 |
+
model = AutoModel(model='iic/emotion2vec_plus_large', hub='ms'); \
|
| 76 |
+
print('β
emotion2vec+ Large downloaded.')"
|
| 77 |
|
| 78 |
# Install avatar dependencies
|
| 79 |
RUN python3.11 -m pip install --no-cache-dir \
|
|
|
|
| 115 |
-days 365 \
|
| 116 |
-subj "/CN=mrrrme.hf.space"
|
| 117 |
|
| 118 |
+
# ============================================================
|
| 119 |
+
# COPY CACHED MODELS TO USER HOME (runtime user is 1000)
|
| 120 |
+
# ============================================================
|
| 121 |
+
RUN mkdir -p /home/user/.cache && \
|
| 122 |
+
cp -r /root/.cache/modelscope /home/user/.cache/ 2>/dev/null || true && \
|
| 123 |
+
cp -r /root/.local /home/user/ 2>/dev/null || true && \
|
| 124 |
+
chown -R 1000:1000 /home/user
|
| 125 |
+
|
| 126 |
# β
Create startup script with MODULAR BACKEND + MODEL CACHING
|
| 127 |
+
RUN printf '#!/bin/bash\nset -e\nexport HOME=/home/user\nmkdir -p /tmp\n\n# Agree to TOS\nexport COQUI_TOS_AGREED=1\n\n# ============================================================\n# MODEL CACHING - emotion2vec pre-downloaded in Docker build\n# ============================================================\n# Model is at /home/user/.cache/modelscope (from build)\n# Also try /data/modelscope for persistent storage\nexport MODELSCOPE_CACHE=/home/user/.cache/modelscope\nexport MS_CACHE_HOME=/home/user/.cache/modelscope\n\n# Create /data dirs if writable (for other runtime caching)\nif [ -d "/data" ] && [ -w "/data" ]; then\n echo "Persistent storage available: /data"\n mkdir -p /data/modelscope 2>/dev/null || true\nfi\n\npkill -f "backend_new.py" 2>/dev/null || true\npkill -f "speak_server.py" 2>/dev/null || true\npkill -f "node server.js" 2>/dev/null || true\npkill -f "nginx" 2>/dev/null || true\n\nsleep 2\necho "Starting MrrrMe (XTTS v2 + Modular Backend v2.0)..."\necho "Models pre-loaded from Docker build - fast startup!"\n\n# Start NEW modular backend\ncd /app && python3.11 mrrrme/backend_new.py &\n\n# Start avatar TTS\ncd /app/avatar && python3.11 speak_server.py &\n\n# Start Next.js frontend\ncd /app/frontend/.next/standalone && HOSTNAME=0.0.0.0 PORT=3001 node server.js &\n\nsleep 10\nnginx -g "daemon off;" &\necho "Ready!"\nwait\n' > /app/start.sh && chmod +x /app/start.sh
|
| 128 |
|
| 129 |
# Set ownership
|
| 130 |
RUN chown -R 1000:1000 /app
|
| 131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
USER 1000
|
| 133 |
ENV HOME=/home/user
|
| 134 |
|
mrrrme/audio/voice_emotion.py
CHANGED
|
@@ -21,14 +21,27 @@ import webrtcvad
|
|
| 21 |
from ..config import AUDIO_SR, AUDIO_BLOCK, CLIP_SECONDS, VAD_AGGRESSIVENESS, FUSE4
|
| 22 |
|
| 23 |
# ============================================================
|
| 24 |
-
# CACHE DIRECTORY -
|
| 25 |
# ============================================================
|
| 26 |
-
#
|
| 27 |
-
#
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
else:
|
| 31 |
-
CACHE_DIR =
|
| 32 |
|
| 33 |
os.makedirs(CACHE_DIR, exist_ok=True)
|
| 34 |
|
|
@@ -36,7 +49,7 @@ os.makedirs(CACHE_DIR, exist_ok=True)
|
|
| 36 |
os.environ['MODELSCOPE_CACHE'] = CACHE_DIR
|
| 37 |
os.environ['MS_CACHE_HOME'] = CACHE_DIR
|
| 38 |
os.environ['FUNASR_CACHE'] = CACHE_DIR
|
| 39 |
-
os.environ['HF_HOME'] = CACHE_DIR #
|
| 40 |
|
| 41 |
|
| 42 |
class VoiceEmotionWorker:
|
|
@@ -84,14 +97,18 @@ class VoiceEmotionWorker:
|
|
| 84 |
os.path.join(CACHE_DIR, 'hub', 'iic'),
|
| 85 |
os.path.join(CACHE_DIR, 'iic'),
|
| 86 |
os.path.join(CACHE_DIR, 'hub', 'models', 'iic'),
|
|
|
|
|
|
|
|
|
|
| 87 |
]
|
| 88 |
|
| 89 |
model_cached = any(os.path.exists(p) for p in possible_cache_paths)
|
| 90 |
|
| 91 |
if model_cached:
|
| 92 |
-
print("[VoiceEmotion] β
Model found in cache - loading from disk")
|
| 93 |
else:
|
| 94 |
-
print("[VoiceEmotion]
|
|
|
|
| 95 |
|
| 96 |
# Load emotion2vec model
|
| 97 |
try:
|
|
@@ -100,14 +117,14 @@ class VoiceEmotionWorker:
|
|
| 100 |
load_start = time.time()
|
| 101 |
|
| 102 |
# ============================================================
|
| 103 |
-
#
|
| 104 |
-
#
|
| 105 |
-
#
|
| 106 |
# ============================================================
|
| 107 |
self.model = AutoModel(
|
| 108 |
model="iic/emotion2vec_plus_large",
|
| 109 |
-
# model_revision
|
| 110 |
-
disable_update=
|
| 111 |
hub="ms" # Explicitly use ModelScope hub
|
| 112 |
)
|
| 113 |
|
|
|
|
| 21 |
from ..config import AUDIO_SR, AUDIO_BLOCK, CLIP_SECONDS, VAD_AGGRESSIVENESS, FUSE4
|
| 22 |
|
| 23 |
# ============================================================
|
| 24 |
+
# CACHE DIRECTORY - Check multiple locations
|
| 25 |
# ============================================================
|
| 26 |
+
# Priority order:
|
| 27 |
+
# 1. /home/user/.cache/modelscope (Docker build location - FASTEST)
|
| 28 |
+
# 2. /data/modelscope (HF Spaces persistent storage)
|
| 29 |
+
# 3. /tmp/modelscope (fallback)
|
| 30 |
+
|
| 31 |
+
# Check where the model actually exists (from Docker build)
|
| 32 |
+
DOCKER_BUILD_CACHE = '/home/user/.cache/modelscope'
|
| 33 |
+
PERSISTENT_CACHE = '/data/modelscope'
|
| 34 |
+
FALLBACK_CACHE = '/tmp/modelscope'
|
| 35 |
+
|
| 36 |
+
# Use Docker build cache if it exists (pre-downloaded during build)
|
| 37 |
+
if os.path.exists(os.path.join(DOCKER_BUILD_CACHE, 'hub', 'iic')) or \
|
| 38 |
+
os.path.exists(os.path.join(DOCKER_BUILD_CACHE, 'hub', 'models', 'iic')):
|
| 39 |
+
CACHE_DIR = DOCKER_BUILD_CACHE
|
| 40 |
+
print(f"[VoiceEmotion] Using Docker build cache: {CACHE_DIR}")
|
| 41 |
+
elif os.path.exists('/data') and os.access('/data', os.W_OK):
|
| 42 |
+
CACHE_DIR = PERSISTENT_CACHE
|
| 43 |
else:
|
| 44 |
+
CACHE_DIR = FALLBACK_CACHE
|
| 45 |
|
| 46 |
os.makedirs(CACHE_DIR, exist_ok=True)
|
| 47 |
|
|
|
|
| 49 |
os.environ['MODELSCOPE_CACHE'] = CACHE_DIR
|
| 50 |
os.environ['MS_CACHE_HOME'] = CACHE_DIR
|
| 51 |
os.environ['FUNASR_CACHE'] = CACHE_DIR
|
| 52 |
+
os.environ['HF_HOME'] = os.path.dirname(CACHE_DIR) # Parent dir for HF
|
| 53 |
|
| 54 |
|
| 55 |
class VoiceEmotionWorker:
|
|
|
|
| 97 |
os.path.join(CACHE_DIR, 'hub', 'iic'),
|
| 98 |
os.path.join(CACHE_DIR, 'iic'),
|
| 99 |
os.path.join(CACHE_DIR, 'hub', 'models', 'iic'),
|
| 100 |
+
# Also check default location (Docker build)
|
| 101 |
+
'/home/user/.cache/modelscope/hub/iic',
|
| 102 |
+
'/home/user/.cache/modelscope/hub/models/iic',
|
| 103 |
]
|
| 104 |
|
| 105 |
model_cached = any(os.path.exists(p) for p in possible_cache_paths)
|
| 106 |
|
| 107 |
if model_cached:
|
| 108 |
+
print("[VoiceEmotion] β
Model found in cache - loading from disk (FAST)")
|
| 109 |
else:
|
| 110 |
+
print("[VoiceEmotion] β οΈ Model not cached - will download (~1.8GB, 5+ min)")
|
| 111 |
+
print("[VoiceEmotion] π‘ Tip: Add pre-download to Dockerfile for faster startup")
|
| 112 |
|
| 113 |
# Load emotion2vec model
|
| 114 |
try:
|
|
|
|
| 117 |
load_start = time.time()
|
| 118 |
|
| 119 |
# ============================================================
|
| 120 |
+
# FIXED:
|
| 121 |
+
# - Removed model_revision (was causing decoder weight mismatch)
|
| 122 |
+
# - disable_update=True since model is pre-downloaded in Docker
|
| 123 |
# ============================================================
|
| 124 |
self.model = AutoModel(
|
| 125 |
model="iic/emotion2vec_plus_large",
|
| 126 |
+
# model_revision removed - use latest compatible version
|
| 127 |
+
disable_update=True, # Model pre-downloaded in Docker build
|
| 128 |
hub="ms" # Explicitly use ModelScope hub
|
| 129 |
)
|
| 130 |
|