sop-audio-analyzer / Dockerfile
daasime's picture
Fix demos: build to /app/demo_samples, copy to DATA_DIR at runtime
0c865ec
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"]