FROM python:3.11-slim WORKDIR /app # Install system dependencies for audio processing RUN apt-get update && apt-get install -y \ ffmpeg \ libsndfile1 \ git \ && rm -rf /var/lib/apt/lists/* # Copy requirements first for better caching COPY requirements.txt . # Install Python dependencies RUN pip install --no-cache-dir -r requirements.txt # HF Spaces runs as user 1000 - create user before downloads RUN useradd -m -u 1000 user # Create model & data dirs under /home/user (NOT /app, which HF mounts over) RUN mkdir -p /home/user/models/vad /home/user/models/spkrec \ /home/user/data/db /home/user/data/clips /home/user/data/logs \ && chown -R user:user /home/user # Pre-download models AS the user so files are owned by user USER user RUN python -c "\ from speechbrain.inference.VAD import VAD; \ VAD.from_hparams(source='speechbrain/vad-crdnn-libriparty', savedir='/home/user/models/vad'); \ print('VAD model downloaded')" RUN python -c "\ from speechbrain.inference.speaker import SpeakerRecognition; \ SpeakerRecognition.from_hparams(source='speechbrain/spkrec-ecapa-voxceleb', savedir='/home/user/models/spkrec'); \ print('Speaker Recognition model downloaded')" # Copy application code (switch back to root, then back to user) USER root COPY . . RUN chown -R user:user /app USER user # Generate demo audio samples at build time (gTTS needs network) # Save to /app/demo_samples (NOT /home/user/data which gets mounted over) RUN mkdir -p /app/demo_samples && \ DATA_DIR=/app/demo python generate_demos.py && \ mv /app/demo/samples/* /app/demo_samples/ && \ rm -rf /app/demo || echo "Demo generation failed (non-fatal)" # Expose port (HF Spaces uses 7860) EXPOSE 7860 # Set environment variables ENV STREAMLIT_SERVER_PORT=7860 ENV STREAMLIT_SERVER_ADDRESS=0.0.0.0 ENV HOME=/home/user ENV MPLCONFIGDIR=/tmp/matplotlib ENV HF_HOME=/tmp/hf_home ENV MODEL_DIR=/home/user/models ENV DATA_DIR=/home/user/data # Run Streamlit CMD ["streamlit", "run", "app.py", "--server.port=7860", "--server.address=0.0.0.0", "--server.headless=true"]