Настройка Whisper в Docker: полное руководство по запуску OpenAI Whisper в Docker

Настройка Whisper в Docker: полное руководство по запуску OpenAI Whisper в Docker

Eric King

Eric King

Author


Введение

Запуск OpenAI Whisper в Docker-контейнерах обеспечивает согласованную изолированную среду, упрощает развёртывание и устраняет проблему «у меня на машине работает». Docker позволяет:
  • Разворачивать где угодно — один и тот же контейнер на любой платформе с Docker
  • Изолировать зависимости — избегать конфликтов с системными пакетами
  • Легко масштабировать — поднимать несколько контейнеров для параллельной обработки
  • Управлять версиями — фиксировать конкретные версии и конфигурации Whisper
  • Упростить развёртывание — одна команда для всего
В этом руководстве описано всё необходимое для настройки Whisper в Docker — от базовых контейнеров до готовых к продакшену конфигураций с поддержкой GPU.

Зачем Docker для Whisper?

Преимущества контейнеризации

1. Согласованность
  • одна и та же среда в разработке, staging и продакшене
  • нет конфликтов зависимостей
  • воспроизводимые сборки
2. Переносимость
  • запуск на любой платформе с Docker
  • простая миграция между серверами
  • развёртывание независимо от облака
3. Изоляция
  • нет влияния на хост-систему
  • чистое удаление (достаточно удалить контейнер)
  • безопасность за счёт изоляции
4. Масштабируемость
  • простое горизонтальное масштабирование
  • балансировка нагрузки между контейнерами
  • лимиты ресурсов на контейнер
5. Интеграция с DevOps
  • работа в CI/CD-конвейерах
  • готовность к Kubernetes
  • удобство для облачного развёртывания

Требования

Перед началом убедитесь, что у вас есть:
  • установленный Docker (версия 20.10+)
  • Docker Compose (по желанию, для нескольких контейнеров)
  • NVIDIA Docker (по желанию, для GPU)
  • базовые знания команд Docker

Установка Docker

macOS:
# Install Docker Desktop from docker.com
# Or using Homebrew
brew install --cask docker
Ubuntu/Debian:
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
Windows: Скачайте Docker Desktop с docker.com

Проверка установки

docker --version
docker-compose --version

Базовый Dockerfile для Whisper

Начнём с простого Dockerfile для Whisper:
FROM python:3.10-slim

# Set working directory
WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies
RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio

# Copy application code (if you have custom scripts)
# COPY . .

# Set default command
CMD ["whisper", "--help"]

Сборка образа

docker build -t whisper:latest .

Запуск базового контейнера

docker run --rm whisper:latest whisper --version

Dockerfile с API-сервером

Для продакшена обычно нужен API-сервер. Ниже более полный Dockerfile:
FROM python:3.10-slim

WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies
RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    fastapi \
    uvicorn \
    python-multipart

# Create directories for audio and output
RUN mkdir -p /app/audio /app/output

# Copy application code
COPY app.py .
COPY requirements.txt .

# Expose API port
EXPOSE 8000

# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

# Run API server
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

Пример API-сервера (app.py)

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import whisper
import os

app = FastAPI()

# Load Whisper model (can be configured via env)
model_name = os.getenv("WHISPER_MODEL", "base")
model = whisper.load_model(model_name)

@app.get("/health")
def health():
    return {"status": "healthy"}

@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...)):
    # Save uploaded file
    file_path = f"/app/audio/{file.filename}"
    with open(file_path, "wb") as f:
        content = await file.read()
        f.write(content)
    
    # Transcribe
    result = model.transcribe(file_path)
    
    # Clean up
    os.remove(file_path)
    
    return JSONResponse(content={
        "text": result["text"],
        "language": result["language"]
    })

requirements.txt

fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
openai-whisper
torch
torchaudio

Настройка Docker Compose

Для полного стека с несколькими сервисами используйте Docker Compose:

docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    container_name: whisper-api
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    environment:
      - WHISPER_MODEL=base
      - CUDA_VISIBLE_DEVICES=0
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  # Optional: Redis for queue management
  redis:
    image: redis:7-alpine
    container_name: whisper-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    restart: unless-stopped

volumes:
  redis-data:

Запуск через Docker Compose

# Start services
docker-compose up -d

# View logs
docker-compose logs -f whisper-api

# Stop services
docker-compose down

Поддержка GPU в Docker

Для ускорения на GPU нужна среда выполнения NVIDIA Docker:

Установка NVIDIA Docker

Ubuntu/Debian:
# Add NVIDIA Docker repository
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
    sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# Install
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

Dockerfile с поддержкой GPU

FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04

WORKDIR /app

# Install Python
RUN apt-get update && apt-get install -y \
    python3.10 \
    python3-pip \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies with CUDA support
RUN pip3 install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    --index-url https://download.pytorch.org/whl/cu118

# Install API dependencies
RUN pip3 install --no-cache-dir \
    fastapi \
    uvicorn \
    python-multipart

COPY app.py .
EXPOSE 8000

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

Запуск с GPU

# Using docker run
docker run --gpus all -p 8000:8000 whisper-gpu:latest

# Using docker-compose

docker-compose.yml с GPU

version: '3.8'

services:
  whisper-api:
    build: .
    container_name: whisper-api-gpu
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Оптимизированный Dockerfile для продакшена

Ниже production-ready Dockerfile с оптимизациями:
# Multi-stage build for smaller image
FROM python:3.10-slim as builder

WORKDIR /app

# Install build dependencies
RUN apt-get update && apt-get install -y \
    gcc \
    g++ \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install Python packages
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# Final stage
FROM python:3.10-slim

WORKDIR /app

# Install runtime dependencies only
RUN apt-get update && apt-get install -y \
    ffmpeg \
    curl \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# Copy Python packages from builder
COPY --from=builder /root/.local /root/.local

# Make sure scripts in .local are usable
ENV PATH=/root/.local/bin:$PATH

# Create non-root user for security
RUN useradd -m -u 1000 whisper && \
    mkdir -p /app/audio /app/output && \
    chown -R whisper:whisper /app

USER whisper

# Copy application code
COPY --chown=whisper:whisper app.py .
COPY --chown=whisper:whisper requirements.txt .

EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

Преимущества многоэтапной сборки

  • Меньший образ — в финальном образе только runtime-зависимости
  • Быстрее сборки — отдельное кэширование build-зависимостей
  • Выше безопасность — непривилегированный пользователь, меньше поверхность атаки

Переменные окружения

Сделайте Docker-настройку настраиваемой через переменные окружения:

Dockerfile

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    fastapi \
    uvicorn \
    python-multipart

COPY app.py .

# Environment variables with defaults
ENV WHISPER_MODEL=base
ENV MAX_FILE_SIZE=100MB
ENV LOG_LEVEL=INFO

EXPOSE 8000

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

docker-compose.yml с переменными окружения

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    environment:
      - WHISPER_MODEL=small
      - MAX_FILE_SIZE=200MB
      - LOG_LEVEL=DEBUG
      - CUDA_VISIBLE_DEVICES=0
    env_file:
      - .env
    restart: unless-stopped

Файл .env

WHISPER_MODEL=small
MAX_FILE_SIZE=200MB
LOG_LEVEL=INFO
CUDA_VISIBLE_DEVICES=0

Управление томами

Правильная конфигурация томов обеспечивает сохранность данных:

docker-compose.yml с томами

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    volumes:
      # Bind mount for development
      - ./audio:/app/audio
      - ./output:/app/output
      
      # Named volume for model cache (persists across containers)
      - whisper-models:/root/.cache/whisper
      
      # Config volume
      - ./config:/app/config:ro
    environment:
      - WHISPER_MODEL=base

volumes:
  whisper-models:
    driver: local

Преимущества

  • Кэш моделей — загрузка один раз, повторное использование между контейнерами
  • Сохранность данных — выходные файлы переживают перезапуски контейнера
  • Конфигурация — обновление настроек без пересборки образа

Проверки работоспособности и мониторинг

Dockerfile с health check

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    ffmpeg \
    curl \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir \
    openai-whisper \
    fastapi \
    uvicorn

COPY app.py .

# Health check endpoint
HEALTHCHECK --interval=30s \
            --timeout=10s \
            --start-period=40s \
            --retries=3 \
            CMD curl -f http://localhost:8000/health || exit 1

EXPOSE 8000
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

Эндпоинт health check

from fastapi import FastAPI
import whisper

app = FastAPI()
model = whisper.load_model("base")

@app.get("/health")
def health():
    try:
        # Quick test transcription
        return {"status": "healthy", "model": "base"}
    except Exception as e:
        return {"status": "unhealthy", "error": str(e)}, 503

Типичные сценарии использования

Сценарий 1: среда разработки

version: '3.8'

services:
  whisper-dev:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/__pycache__
    ports:
      - "8000:8000"
    environment:
      - WHISPER_MODEL=tiny
      - DEBUG=true
    command: uvicorn app.py:app --reload --host 0.0.0.0 --port 8000

Сценарий 2: продакшен с очередью

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - REDIS_URL=redis://redis:6379
      - WHISPER_MODEL=small
    depends_on:
      - redis
      - worker

  worker:
    build: .
    command: python worker.py
    environment:
      - REDIS_URL=redis://redis:6379
      - WHISPER_MODEL=small
    volumes:
      - ./audio:/app/audio
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:

Сценарий 3: несколько моделей

version: '3.8'

services:
  whisper-fast:
    build: .
    ports:
      - "8001:8000"
    environment:
      - WHISPER_MODEL=tiny
      - PORT=8000

  whisper-balanced:
    build: .
    ports:
      - "8002:8000"
    environment:
      - WHISPER_MODEL=base
      - PORT=8000

  whisper-accurate:
    build: .
    ports:
      - "8003:8000"
    environment:
      - WHISPER_MODEL=large
      - PORT=8000

Лучшие практики

1. Использовать конкретные базовые образы

Плохо:
FROM python:latest
Хорошо:
FROM python:3.10-slim

2. Минимизировать слои

Плохо:
RUN apt-get update
RUN apt-get install -y ffmpeg
RUN apt-get install -y git
Хорошо:
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    && rm -rf /var/lib/apt/lists/*

3. Использовать .dockerignore

Создайте .dockerignore:
__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store

4. Задавать лимиты ресурсов

services:
  whisper-api:
    build: .
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
        reservations:
          cpus: '1'
          memory: 2G

5. Использовать health checks

Всегда добавляйте health checks для продакшен-контейнеров:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1

6. Непривилегированный пользователь

Запускайте контейнеры не от root:
RUN useradd -m -u 1000 whisper
USER whisper

7. Кэшировать модели

Используйте тома для кэша загруженных моделей:
volumes:
  - whisper-models:/root/.cache/whisper

Решение типичных проблем

Проблема 1: контейнер сразу завершается

Проблема: контейнер запускается и сразу выходит
Решение:
# Check logs
docker logs <container-id>

# Run interactively to debug
docker run -it whisper:latest /bin/bash

Проблема 2: GPU недоступна

Проблема: GPU не определяется в контейнере
Решение:
# Verify NVIDIA Docker
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

# Check runtime
docker info | grep -i runtime

Проблема 3: нехватка памяти

Проблема: контейнеру не хватает памяти
Решение:
# Increase memory limit
deploy:
  resources:
    limits:
      memory: 8G

Проблема 4: медленная загрузка модели

Проблема: модели загружаются при каждом запуске
Решение:
# Use volume for model cache
volumes:
  - whisper-models:/root/.cache/whisper

Проблема 5: отказ в доступе

Проблема: нельзя записать на тома
Решение:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app

Оптимизация производительности

1. Предзагрузка модели

Предзагружайте модели в Dockerfile:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"

2. Использовать faster-whisper

Для лучшей производительности используйте faster-whisper:
RUN pip install --no-cache-dir faster-whisper

3. Многопоточность

Настройте worker-процессы:
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

4. Выделение ресурсов

Выделяйте достаточные ресурсы:
deploy:
  resources:
    limits:
      cpus: '4'
      memory: 8G

Безопасность

1. Официальные базовые образы

FROM python:3.10-slim  # Official Python image

2. Сканирование уязвимостей

docker scan whisper:latest

3. Обновление образов

Регулярно обновляйте базовые образы и зависимости:
FROM python:3.10-slim  # Use latest patch version
RUN pip install --upgrade pip

4. Ограничение сетевого доступа

services:
  whisper-api:
    build: .
    networks:
      - internal
    # No external ports if accessed via reverse proxy

Заключение

Контейнеризация Whisper даёт надёжное масштабируемое решение для преобразования речи в текст. Главное:
  1. Начать с простого — с базового Dockerfile
  2. Использовать Docker Compose — для многосервисных стеков
  3. Включить GPU — для производительности в продакшене
  4. Следовать лучшим практикам — безопасность, оптимизация, мониторинг
  5. Тщательно тестировать — перед продакшеном
При правильной настройке Docker можно стабильно разворачивать Whisper в любой среде — от локальной разработки до облачного продакшена.

Следующие шаги

  • Соберите первый контейнер — начните с базового Dockerfile
  • Добавьте поддержку GPU — если есть GPU NVIDIA
  • Настройте Docker Compose — для полного стека приложения
  • Разверните в облаке — контейнерные сервисы (ECS, GKE, AKS)
Дополнительные стратегии развёртывания — в руководствах Whisper Cloud Deployment и Whisper API vs Local Deployment.

Попробовать бесплатно

Попробуйте наш сервис ИИ для работы с голосом, аудио и видео уже сейчас! Вы получите не только высокоточную транскрипцию речи в текст, многоязычный перевод и интеллектуальное разделение по дикторам, но и автоматическую генерацию субтитров к видео, умное редактирование аудио‑ и видеоконтента и синхронный аудио‑видео‑анализ. Решение охватывает все сценарии — от протоколирования встреч до создания коротких видео и подкастов. Начните бесплатный тест уже сегодня!

Звук в текст онлайнЗвук в текст бесплатноКонвертер звука в текстЗвук в текст MP3Звук в текст WAVЗвук в текст с метками времениЗвук в текст для встречSound to Text Multi LanguageЗвук в текст субтитрыКонвертировать WAV в текстГолос в ТекстГолос в Текст ОнлайнРечь в ТекстКонвертировать MP3 в текстКонвертировать голосовую запись в текстГолосовой Ввод ОнлайнГолос в Текст с Временными МеткамиГолос в Текст в Реальном ВремениГолос в Текст для Длинного АудиоГолос в Текст для ВидеоГолос в Текст для YouTubeГолос в Текст для ВидеомонтажаГолос в Текст для СубтитровГолос в Текст для ПодкастовГолос в Текст для ИнтервьюАудио интервью в текстГолос в Текст для ЗаписейГолос в Текст для ВстречГолос в Текст для ЛекцийГолос в Текст для ЗаметокГолос в Текст МногоязычныйГолос в Текст ТочныйГолос в Текст БыстроАльтернатива Premiere Pro Голос в ТекстАльтернатива DaVinci Голос в ТекстАльтернатива VEED Голос в ТекстАльтернатива InVideo Голос в ТекстАльтернатива Otter.ai Голос в ТекстАльтернатива Descript Голос в ТекстАльтернатива Trint Голос в ТекстАльтернатива Rev Голос в ТекстАльтернатива Sonix Голос в ТекстАльтернатива Happy Scribe Голос в ТекстАльтернатива Zoom Голос в ТекстАльтернатива Google Meet Голос в ТекстАльтернатива Microsoft Teams Голос в ТекстАльтернатива Fireflies.ai Голос в ТекстАльтернатива Fathom Голос в ТекстАльтернатива FlexClip Голос в ТекстАльтернатива Kapwing Голос в ТекстАльтернатива Canva Голос в ТекстГолос в Текст для Длинного АудиоИИ Голос в ТекстГолос в Текст БесплатноГолос в Текст Без РекламыГолос в Текст для Шумного АудиоГолос в Текст с ВременемГенерировать Субтитры из АудиоТранскрипция Подкастов ОнлайнТранскрибировать Звонки КлиентовГолос TikTok в ТекстАудио TikTok в ТекстYouTube Голос в ТекстYouTube Аудио в ТекстГолосовая Заметка в ТекстГолосовое Сообщение WhatsApp в ТекстГолосовое Сообщение Telegram в ТекстТранскрипция Звонка DiscordГолос Twitch в ТекстГолос Skype в ТекстГолос Messenger в ТекстГолосовое Сообщение LINE в ТекстТранскрибировать Влоги в ТекстКонвертировать Аудио Проповеди в ТекстПреобразовать Речь в ПисьмоПеревести Аудио в ТекстПреобразовать Аудио Заметки в ТекстГолосовой ВводГолосовой Ввод для ВстречГолосовой Ввод для YouTubeГовори и ПечатайПечать Без РукГолос в СловаРечь в СловаРечь в Текст ОнлайнOnline Transcription SoftwareРечь в Текст для ВстречБыстрая Речь в ТекстReal Time Speech to TextLive Transcription AppРечь в Текст для TikTokЗвук в Текст для TikTokРечь в Слова (говоря)Речь в ТекстTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsАудио в ПечатьЗвук в ТекстИнструмент Голосового ПисанияИнструмент Речевого ПисанияГолосовая ДиктовкаИнструмент Юридической ТранскрипцииИнструмент Медицинской ДиктовкиЯпонская Аудио ТранскрипцияКорейская Транскрипция ВстречИнструмент Транскрипции ВстречАудио встречи в текстКонвертер Лекций в ТекстАудио лекции в текстТранскрипция Видео в ТекстГенератор Субтитров для TikTokТранскрипция Колл-ЦентраИнструмент Reels Аудио в ТекстТранскрибировать MP3 в ТекстТранскрибировать WAV файл в текстCapCut Голос в ТекстCapCut Голос в ТекстVoice to Text in EnglishАудио в текст на английскомVoice to Text in SpanishVoice to Text in FrenchАудио в текст на французскомVoice to Text in GermanАудио в текст на немецкомVoice to Text in JapaneseАудио в текст на японскомVoice to Text in KoreanАудио в текст на корейскомVoice to Text in PortugueseVoice to Text in ArabicVoice to Text in ChineseVoice to Text in HindiVoice to Text in RussianWeb Voice Typing ToolVoice Typing Website