MusaedMusaedSadeqMusaedAl-Fareh225739 commited on
Commit
51afead
Β·
1 Parent(s): bd8aa92

updated docker file

Browse files
Files changed (2) hide show
  1. Dockerfile +27 -7
  2. 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('βœ… Download complete.')"
 
 
 
 
 
 
 
 
 
 
 
 
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 downloads once, then cached\n# ============================================================\nexport MODELSCOPE_CACHE=/data/modelscope\nexport MS_CACHE_HOME=/data/modelscope\nmkdir -p /data/modelscope 2>/dev/null || true\n\nif [ -d "/data" ] && [ -w "/data" ]; then\n echo "Persistent storage: /data"\n echo "Model cache: /data/modelscope"\n chmod 777 /data 2>/dev/null || true\n chmod 777 /data/modelscope 2>/dev/null || true\nelse\n echo "Ephemeral storage: /tmp"\n export MODELSCOPE_CACHE=/tmp/modelscope\n export MS_CACHE_HOME=/tmp/modelscope\n mkdir -p /tmp/modelscope\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)..."\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
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 - MUST match Dockerfile ENV variables!
25
  # ============================================================
26
- # Dockerfile sets: ENV MODELSCOPE_CACHE=/data/modelscope
27
- # So we MUST use the same path here!
28
- if os.path.exists('/data') and os.access('/data', os.W_OK):
29
- CACHE_DIR = '/data/modelscope' # βœ… FIXED: Match Dockerfile
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  else:
31
- CACHE_DIR = '/tmp/modelscope' # Fallback for local dev
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 # Some models also use HuggingFace
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] ⏳ Model not cached - downloading (one-time, ~1.8GB)")
 
95
 
96
  # Load emotion2vec model
97
  try:
@@ -100,14 +117,14 @@ class VoiceEmotionWorker:
100
  load_start = time.time()
101
 
102
  # ============================================================
103
- # FIX: Remove model_revision to use latest compatible version
104
- # The v2.0.4 revision was causing decoder weight mismatches
105
- # which resulted in uniform 0.25 probability distributions
106
  # ============================================================
107
  self.model = AutoModel(
108
  model="iic/emotion2vec_plus_large",
109
- # model_revision="v2.0.4", # ❌ REMOVED - causes decoder mismatch!
110
- disable_update=model_cached, # Only disable updates if already cached
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