# 베이스 이미지 선택 FROM python:3.10-slim # 필수 패키지 설치 RUN apt-get update && \ apt-get install -y \ git \ unzip \ ffmpeg \ build-essential \ g++ \ gcc \ python3-dev \ libffi-dev \ libssl-dev \ fontconfig && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* WORKDIR /app # 환경변수 설정 (/tmp 경로로 변경하여 캐시 문제 해결) ENV PYTHONPATH="/app/model:/app/model/third_party/Matcha-TTS:/app:$PYTHONPATH" ENV HF_HOME="/tmp/.cache/huggingface" ENV MPLCONFIGDIR="/tmp/.cache/matplotlib" ENV FONTCONFIG_PATH="/tmp/.cache/fontconfig" ENV NUMBA_DISABLE_JIT=1 ENV NUMBA_DISABLE_CUDA=1 ENV MODELSCOPE_CACHE="/tmp/.cache/modelscope" # 캐시 및 출력 디렉토리들 생성 및 권한 설정 RUN mkdir -p /tmp/.cache/huggingface && \ mkdir -p /tmp/.cache/matplotlib && \ mkdir -p /tmp/.cache/fontconfig && \ mkdir -p /tmp/.cache/modelscope && \ mkdir -p /app/outputs && \ mkdir -p /.config/matplotlib && \ mkdir -p /.modelscope && \ mkdir -p /tmp && \ chmod -R 777 /tmp/.cache && \ chmod -R 777 /app/outputs && \ chmod -R 777 /.config && \ chmod -R 777 /.modelscope && \ chmod -R 777 /tmp # requirements.txt 복사 및 설치 COPY requirements.txt . RUN pip install --upgrade pip RUN pip install -r requirements.txt # 모든 파일 복사 COPY . . # 디렉토리 구조 확인 및 생성 RUN mkdir -p /app/model/third_party/Matcha-TTS # 심볼릭 링크 생성 (cosyvoice와 matcha 모듈을 루트에서 접근 가능하게) RUN ln -sf /app/model/cosyvoice /app/cosyvoice RUN ln -sf /app/model/third_party/Matcha-TTS /app/matcha # CosyVoice가 찾는 경로에 맞춰 pretrained_models 심볼릭 링크 생성 # ROOT_DIR이 /app/cosyvoice라면 ../../pretrained_models는 /app/pretrained_models가 됨 RUN ln -sf /app/pretrained_models /app/model/pretrained_models RUN ln -sf /app/pretrained_models /app/cosyvoice/pretrained_models # 모델 다운로드 (빌드 타임에 수행) RUN python -c "\ from modelscope import snapshot_download;\ snapshot_download('iic/CosyVoice2-0.5B', local_dir='/app/pretrained_models/CosyVoice2-0.5B');\ snapshot_download('iic/CosyVoice-ttsfrd', local_dir='/app/pretrained_models/CosyVoice-ttsfrd')" # 리소스 압축 해제 RUN cd /app/pretrained_models/CosyVoice-ttsfrd && \ if [ -f "resource.zip" ]; then \ echo "Extracting resource.zip..."; \ unzip -o resource.zip && \ chmod -R 755 resource/ && \ echo "Resource extraction completed"; \ ls -la resource/; \ else \ echo "resource.zip not found"; \ ls -la .; \ fi # 디렉토리 구조 최종 확인 RUN echo "=== Final directory structure ===" && \ ls -la /app/pretrained_models/ && \ echo "=== CosyVoice-ttsfrd contents ===" && \ ls -la /app/pretrained_models/CosyVoice-ttsfrd/ && \ echo "=== Resource directory ===" && \ ls -la /app/pretrained_models/CosyVoice-ttsfrd/resource/ || echo "resource directory not found" # .whl 파일 설치 (빌드 타임에 수행) RUN cd /app && \ if [ -f "pretrained_models/CosyVoice-ttsfrd/ttsfrd_dependency-0.1-py3-none-any.whl" ]; then \ pip install pretrained_models/CosyVoice-ttsfrd/ttsfrd_dependency-0.1-py3-none-any.whl; \ else \ echo "ttsfrd_dependency whl not found"; \ fi RUN cd /app && \ if [ -f "pretrained_models/CosyVoice-ttsfrd/ttsfrd-0.4.2-cp310-cp310-linux_x86_64.whl" ]; then \ pip install pretrained_models/CosyVoice-ttsfrd/ttsfrd-0.4.2-cp310-cp310-linux_x86_64.whl; \ else \ echo "ttsfrd core whl not found"; \ ls -la pretrained_models/CosyVoice-ttsfrd/; \ fi # 포트 노출 (Hugging Face Spaces는 7860 사용) EXPOSE 7860 # FastAPI app 실행 (모델은 startup시 자동 초기화) CMD ["python", "app.py"]