- 전용 venv 워커(8002)로 격리, MeloTTS(8788)와 병행 - 남녀 10종 음성, 한국어/자동감지(다국어), 속도·피치 - 모델 ~260MB 베이킹, torch/GPU 불필요 - entrypoint로 워커+메인앱 동시 기동
83 lines
3.2 KiB
Docker
83 lines
3.2 KiB
Docker
# ---------- 빌더 단계 ----------
|
|
FROM python:3.11-slim AS builder
|
|
|
|
ENV PYTHONUNBUFFERED=1 \
|
|
PIP_NO_CACHE_DIR=1 \
|
|
HF_HOME=/models \
|
|
NLTK_DATA=/models/nltk_data \
|
|
HF_HUB_DISABLE_TELEMETRY=1
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
build-essential git ffmpeg libsndfile1 curl ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
RUN mkdir -p /models/nltk_data
|
|
|
|
# Blackwell(sm_120) 지원 torch cu128 휠
|
|
RUN pip install torch==2.11.0 torchaudio==2.11.0 \
|
|
--index-url https://download.pytorch.org/whl/cu128
|
|
|
|
COPY constraints.txt requirements.txt ./
|
|
RUN pip install -c constraints.txt -r requirements.txt
|
|
|
|
# MeloTTS(순수 파이썬) 벤더링
|
|
COPY vendor/melo /usr/local/lib/python3.11/site-packages/melo
|
|
|
|
# 한국어/영어 모델 사전 다운로드
|
|
COPY warmup.py ./
|
|
RUN python warmup.py
|
|
|
|
# 슬림화: 추론에 불필요한 패키지 제거
|
|
# - triton: torch.compile 전용(우리는 eager 추론이라 불필요)
|
|
# - gruut 미사용 언어(es/de/fr): 영어만 사용
|
|
RUN pip uninstall -y triton 2>/dev/null || true \
|
|
&& rm -rf /usr/local/lib/python3.11/site-packages/gruut_lang_es \
|
|
/usr/local/lib/python3.11/site-packages/gruut_lang_de \
|
|
/usr/local/lib/python3.11/site-packages/gruut_lang_fr \
|
|
/usr/local/lib/python3.11/site-packages/gruut_lang_es-*.dist-info \
|
|
/usr/local/lib/python3.11/site-packages/gruut_lang_de-*.dist-info \
|
|
/usr/local/lib/python3.11/site-packages/gruut_lang_fr-*.dist-info \
|
|
&& find /usr/local/lib/python3.11/site-packages -name "__pycache__" -type d -prune -exec rm -rf {} + 2>/dev/null || true
|
|
|
|
# 슬림화 후에도 한/영 모델이 정상 로드되는지 검증
|
|
RUN python -c "from melo.api import TTS; [TTS(l, device='cpu') for l in ('KR','EN','JP','ZH')]; print('slim import ok')"
|
|
|
|
# ---------- 런타임 단계 ----------
|
|
FROM python:3.11-slim AS runtime
|
|
|
|
ENV PYTHONUNBUFFERED=1 \
|
|
HF_HOME=/models \
|
|
NLTK_DATA=/models/nltk_data \
|
|
HF_HUB_DISABLE_TELEMETRY=1
|
|
|
|
# 런타임 필수 라이브러리만 (컴파일러 툴체인 제외)
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ffmpeg libsndfile1 libgomp1 ca-certificates rubberband-cli \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
|
COPY --from=builder /usr/local/bin /usr/local/bin
|
|
COPY --from=builder /models /models
|
|
|
|
# ===== Supertonic 엔진 (자연스러운 한국어, MIT, ONNX, torch 불필요) =====
|
|
# 전용 venv 로 의존성 격리(메인 melo 스택의 librosa 0.9.1 과 충돌 방지).
|
|
COPY supertonic_worker /opt/supertonic_worker
|
|
RUN python -m venv /opt/supertonic-venv \
|
|
&& /opt/supertonic-venv/bin/pip install --no-cache-dir -r /opt/supertonic_worker/requirements.txt
|
|
|
|
# 모델 사전 다운로드(베이킹, ~260MB) — HF_HOME=/models 캐시에 저장
|
|
RUN HF_HOME=/models /opt/supertonic-venv/bin/python -c "from supertonic import TTS; TTS(auto_download=True)"
|
|
|
|
ENV SUPERTONIC_URL=http://127.0.0.1:8002
|
|
|
|
COPY app ./app
|
|
COPY frontend ./frontend
|
|
COPY entrypoint.sh /entrypoint.sh
|
|
RUN chmod +x /entrypoint.sh
|
|
|
|
# MeloTTS(8788, 메인) + Supertonic 워커(8002) 동시 기동
|
|
EXPOSE 8788
|
|
CMD ["/entrypoint.sh"]
|