File size: 3,288 Bytes
4257f13
7a1cbf5
 
 
 
4257f13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7a1cbf5
 
 
 
d938a0e
4257f13
f50a207
4257f13
 
 
 
 
7a1cbf5
4257f13
7a1cbf5
 
 
 
 
4257f13
 
 
 
 
 
 
 
 
7a1cbf5
4257f13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7a1cbf5
 
 
 
 
 
 
44c65c0
7a1cbf5
44c65c0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
FROM nvidia/cuda:12.9.0-runtime-ubuntu24.04

# Avoid interactive prompts during package installation
ENV DEBIAN_FRONTEND=noninteractive

# Make apt resilient to slow/stalled mirrors: fail a stuck download fast and retry a few
# times instead of hanging for hours on a single package.
RUN printf 'Acquire::Retries "5";\nAcquire::http::Timeout "30";\nAcquire::https::Timeout "30";\n' \
    > /etc/apt/apt.conf.d/99-retries-timeout

# Some build hosts can't reach security.ubuntu.com (its mirror IPs time out on :80), which
# breaks apt on the krb5/security-pocket packages. archive.ubuntu.com carries the same
# packages and is reachable, so redirect the security pocket to it. Handles both the
# deb822 (.sources, default on 24.04) and legacy sources.list layouts.
RUN sed -i 's|http://security.ubuntu.com/ubuntu|http://archive.ubuntu.com/ubuntu|g' \
        /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null || true; \
    sed -i 's|http://security.ubuntu.com/ubuntu|http://archive.ubuntu.com/ubuntu|g' \
        /etc/apt/sources.list 2>/dev/null || true

# System deps: git(-lfs) to clone the repo + weights; portaudio19-dev + build-essential to
# build pyaudio (a fish-speech dep); ffmpeg/libsndfile1 for audio I/O.
RUN apt-get update && apt-get install -y --no-install-recommends \
    python3 \
    python3-pip \
    python3-dev \
    git \
    git-lfs \
    ffmpeg \
    libsndfile1 \
    portaudio19-dev \
    build-essential \
    && rm -rf /var/lib/apt/lists/* \
    && git lfs install

# Set Python alias (Ubuntu 24.04 ships Python 3.12)
RUN ln -sf /usr/bin/python3 /usr/bin/python
ENV PIP_BREAK_SYSTEM_PACKAGES=1

WORKDIR /app

RUN apt-get update && apt-get install -y --no-install-recommends cargo \
    && rm -rf /var/lib/apt/lists/*

# Upgrade pip so it fetches prebuilt manylinux wheels (e.g. tokenizers) instead of trying to
# build them from source — the base image's system pip is old enough to miss them, which would
# otherwise require a Rust toolchain to compile `tokenizers`.
RUN pip install --no-cache-dir --upgrade --ignore-installed pip setuptools wheel

# Install PyTorch (cu128 wheels). fish-speech hard-pins torch==2.8.0 / torchaudio==2.8.0.
RUN pip install --no-cache-dir \
    torch==2.8.0 \
    torchaudio==2.8.0 \
    --index-url https://download.pytorch.org/whl/cu128

# Clone fish-speech (= S2 codebase) and install it editable. Provides the inference module
# run_eval.py imports and the vendored configs / .project-root it resolves at runtime.
RUN git clone https://github.com/fishaudio/fish-speech.git /opt/fish-speech \
    && cd /opt/fish-speech && pip install --no-cache-dir -e .

# datasets + tqdm for the eval loop (soundfile comes in via fish-speech deps).
RUN pip install --no-cache-dir datasets tqdm

# Download the S2-Pro weights (~11 GB: safetensors + codec.pth) into the checkpoint dir.
# S2-Pro is ungated, so this needs no HF token. Baked in so the eval runs offline.
RUN python3 -c "from huggingface_hub import snapshot_download; snapshot_download('fishaudio/s2-pro', local_dir='/opt/fish-speech/checkpoints/s2-pro')"

# Copy the full repository
COPY . /app

# Default entrypoint
ENTRYPOINT ["bash"]

# Keep-alive CMD so the Space runtime stays healthy; `docker run` overrides it.
EXPOSE 7860
CMD ["-c", "python3 -m http.server 7860"]