Configuração Whisper com Docker: guia completo para executar OpenAI Whisper no Docker

Configuração Whisper com Docker: guia completo para executar OpenAI Whisper no Docker

Eric King

Eric King

Author


Introdução

Executar o OpenAI Whisper em contêineres Docker oferece um ambiente consistente e isolado que simplifica a implantação e evita o problema de «funciona na minha máquina». O Docker permite:
  • Implantar em qualquer lugar – o mesmo contêiner em qualquer plataforma compatível com Docker
  • Isolar dependências – evitar conflitos com pacotes do sistema
  • Escalar com facilidade – subir vários contêineres para processamento paralelo
  • Controlar versões – fixar versões e configurações específicas do Whisper
  • Simplificar a implantação – um único comando para tudo
Este guia cobre o necessário para configurar o Whisper no Docker, desde contêineres básicos até configurações prontas para produção com suporte a GPU.

Por que usar Docker para o Whisper?

Benefícios da containerização

1. Consistência
  • o mesmo ambiente em desenvolvimento, homologação e produção
  • sem conflitos de dependências
  • builds reproduzíveis
2. Portabilidade
  • execução em qualquer plataforma com Docker
  • migração fácil entre servidores
  • implantação independente de nuvem
3. Isolamento
  • sem interferir no sistema host
  • desinstalação limpa (basta remover o contêiner)
  • segurança por isolamento
4. Escalabilidade
  • escalonamento horizontal simples
  • balanceamento de carga entre contêineres
  • limites de recursos por contêiner
5. Integração DevOps
  • compatível com pipelines CI/CD
  • pronto para Kubernetes
  • adequado para implantação em nuvem

Pré-requisitos

Antes de começar, certifique-se de ter:
  • Docker instalado (versão 20.10+)
  • Docker Compose (opcional, para vários contêineres)
  • NVIDIA Docker (opcional, para suporte a GPU)
  • conhecimento básico de comandos do Docker

Instalar o 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: Baixe o Docker Desktop em docker.com

Verificar a instalação

docker --version
docker-compose --version

Dockerfile básico para o Whisper

Comecemos com um Dockerfile simples para o 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"]

Construir a imagem

docker build -t whisper:latest .

Executar o contêiner básico

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

Dockerfile com servidor de API

Em produção, costuma ser necessário um servidor de API. Aqui está um Dockerfile mais completo:
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"]

Exemplo de servidor de 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

Configuração com Docker Compose

Para um ambiente completo com vários serviços, use o 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:

Executar com Docker Compose

# Start services
docker-compose up -d

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

# Stop services
docker-compose down

Suporte a GPU com Docker

Para aceleração por GPU é necessário o runtime NVIDIA Docker:

Instalar o 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 com suporte a 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"]

Executar com GPU

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

# Using docker-compose

docker-compose.yml com 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 otimizado para produção

Aqui está um Dockerfile pronto para produção com otimizações:
# 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"]

Benefícios do build multiestágio

  • Imagem menor – apenas dependências de runtime na imagem final
  • Builds mais rápidos – cache separada para dependências de compilação
  • Melhor segurança – usuário não root, superfície de ataque reduzida

Variáveis de ambiente

Torne sua configuração Docker parametrizável com variáveis de ambiente:

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 com variáveis de ambiente

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

Arquivo .env

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

Gerenciamento de volumes

Uma configuração adequada de volumes garante persistência de dados:

docker-compose.yml com volumes

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

Benefícios

  • Cache de modelos – download uma vez, reutilização entre contêineres
  • Persistência de dados – arquivos de saída sobrevivem a reinicializações
  • Configuração – atualizar configs sem reconstruir a imagem

Verificações de saúde e monitoramento

Dockerfile com 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"]

Endpoint de 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

Casos de uso comuns

Caso 1: ambiente de desenvolvimento

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

Caso 2: produção com fila

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:

Caso 3: configuração multi-modelo

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

Boas práticas

1. Usar imagens base específicas

Ruim:
FROM python:latest
Bom:
FROM python:3.10-slim

2. Minimizar camadas

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

3. Usar .dockerignore

Crie .dockerignore:
__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store

4. Definir limites de recursos

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

5. Usar health checks

Inclua sempre health checks em contêineres de produção:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1

6. Usuário não root

Execute contêineres como usuário não privilegiado:
RUN useradd -m -u 1000 whisper
USER whisper

7. Cachear modelos

Use volumes para cachear modelos baixados:
volumes:
  - whisper-models:/root/.cache/whisper

Solução de problemas comuns

Problema 1: contêiner encerra imediatamente

Problema: o contêiner inicia e encerra logo em seguida
Solução:
# Check logs
docker logs <container-id>

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

Problema 2: GPU não disponível

Problema: GPU não detectada no contêiner
Solução:
# 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

Problema 3: falta de memória

Problema: o contêiner fica sem memória
Solução:
# Increase memory limit
deploy:
  resources:
    limits:
      memory: 8G

Problema 4: download lento do modelo

Problema: modelos baixados a cada inicialização
Solução:
# Use volume for model cache
volumes:
  - whisper-models:/root/.cache/whisper

Problema 5: permissão negada

Problema: não é possível gravar nos volumes
Solução:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app

Otimização de desempenho

1. Pré-carregamento do modelo

Pré-carregue modelos no Dockerfile:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"

2. Usar faster-whisper

Para melhor desempenho, use faster-whisper:
RUN pip install --no-cache-dir faster-whisper

3. Multithreading

Configure processos worker:
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

4. Alocação de recursos

Aloque recursos adequados:
deploy:
  resources:
    limits:
      cpus: '4'
      memory: 8G

Considerações de segurança

1. Usar imagens base oficiais

FROM python:3.10-slim  # Official Python image

2. Escanear vulnerabilidades

docker scan whisper:latest

3. Manter imagens atualizadas

Atualize periodicamente imagens base e dependências:
FROM python:3.10-slim  # Use latest patch version
RUN pip install --upgrade pip

4. Limitar acesso à rede

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

Conclusão

Containerizar o Whisper oferece uma solução robusta e escalável para transcrição fala-texto. Pontos principais:
  1. Começar simples – com um Dockerfile básico
  2. Usar Docker Compose – para simplificar stacks multi-serviço
  3. Habilitar GPU – para desempenho em produção
  4. Seguir boas práticas – segurança, otimização, monitoramento
  5. Testar bem – antes da implantação em produção
Com uma configuração Docker adequada, você pode implantar o Whisper de forma consistente em qualquer ambiente, do desenvolvimento local à produção na nuvem.

Próximos passos

  • Construa seu primeiro contêiner – comece pelo Dockerfile básico
  • Adicione suporte a GPU – se tiver GPUs NVIDIA disponíveis
  • Configure o Docker Compose – para a pilha completa da aplicação
  • Implante na nuvem – serviços de contêiner (ECS, GKE, AKS)
Para mais estratégias de implantação, consulte nossos guias Whisper Cloud Deployment e Whisper API vs Local Deployment.

Experimente grátis agora

Experimente agora o nosso serviço de voz, áudio e vídeo com IA. Você terá não só transcrição de voz para texto de alta precisão, tradução multilíngue e diarização inteligente de falantes, como também geração automática de legendas para vídeos, edição inteligente de conteúdo audiovisual e análise sincronizada de áudio e imagem. Cobrimos cenários como atas de reunião, criação de vídeos curtos e produção de podcasts — comece hoje mesmo o seu teste gratuito!