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!

Som para Texto OnlineSom para Texto GratuitoConversor de Som para TextoSom para Texto MP3Som para Texto WAVSom para Texto com Carimbos de TempoSom em texto para reuniõesSound to Text Multi LanguageSom para Texto LegendasConverter WAV para textoVoz para TextoVoz para Texto OnlineFala para TextoConverter MP3 para TextoConverter gravação de voz em textoDigitação por Voz OnlineVoz para Texto com Carimbos de TempoVoz para Texto em Tempo RealVoz para Texto para Áudio LongoVoz para Texto para VídeoVoz para Texto para YouTubeVoz para Texto para Edição de VídeoVoz para Texto para LegendasVoz para Texto para PodcastsVoz para Texto para EntrevistasÁudio de Entrevista para TextoVoz para Texto para GravaçõesVoz para Texto para ReuniõesVoz para Texto para AulasVoz para Texto para NotasVoz para Texto MultilíngueVoz para Texto PrecisoVoz para Texto RápidoAlternativa Premiere Pro Voz para TextoAlternativa DaVinci Voz para TextoAlternativa VEED Voz para TextoAlternativa InVideo Voz para TextoAlternativa Otter.ai Voz para TextoAlternativa Descript Voz para TextoAlternativa Trint Voz para TextoAlternativa Rev Voz para TextoAlternativa Sonix Voz para TextoAlternativa Happy Scribe Voz para TextoAlternativa Zoom Voz para TextoAlternativa Google Meet Voz para TextoAlternativa Microsoft Teams Voz para TextoAlternativa Fireflies.ai Voz para TextoAlternativa Fathom Voz para TextoAlternativa FlexClip Voz para TextoAlternativa Kapwing Voz para TextoAlternativa Canva Voz para TextoVoz para Texto para Áudio LongoVoz IA para TextoVoz para Texto GrátisVoz para Texto sem AnúnciosVoz para Texto para Áudio RuidosoVoz para Texto com TempoGerar Legendas de ÁudioTranscrição de Podcast OnlineTranscrever Chamadas de ClientesVoz do TikTok para TextoÁudio do TikTok para TextoVoz do YouTube para TextoÁudio do YouTube para TextoNota de Voz para TextoMensagem de Voz do WhatsApp para TextoMensagem de Voz do Telegram para TextoTranscrição de Chamada DiscordVoz do Twitch para TextoVoz do Skype para TextoVoz do Messenger para TextoMensagem de Voz do LINE para TextoTranscrever Vlogs para TextoConverter Áudio de Sermão em TextoConverter Fala em EscritaTraduzir Áudio para TextoConverter Notas de Áudio em TextoDigitação por VozDigitação por Voz para ReuniõesDigitação por Voz para YouTubeFalar para DigitarDigitação Sem MãosVoz para PalavrasFala para PalavrasFala para Texto OnlineOnline Transcription SoftwareFala para Texto para ReuniõesFala para Texto RápidoReal Time Speech to TextLive Transcription AppFala para Texto para TikTokSom para Texto para TikTokFalando para PalavrasFalar para TextoTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsÁudio para DigitaçãoSom para TextoFerramenta de Escrita por VozFerramenta de Escrita por FalaDitado por VozFerramenta de Transcrição LegalFerramenta de Ditado MédicoTranscrição de Áudio JaponêsTranscrição de Reuniões em CoreanoFerramenta de Transcrição de ReuniõesÁudio de Reunião para TextoConversor de Aulas para TextoÁudio de Aula para TextoTranscrição de Vídeo para TextoGerador de Legendas para TikTokTranscrição de Call CenterFerramenta de Áudio Reels para TextoTranscrever MP3 para TextoTranscrever arquivo WAV para textoCapCut Voz para TextoCapCut Voz para TextoVoice to Text in EnglishÁudio para Texto em InglêsVoice to Text in SpanishVoice to Text in FrenchÁudio para Texto em FrancêsVoice to Text in GermanÁudio para Texto em AlemãoVoice to Text in JapaneseÁudio para Texto em JaponêsVoice to Text in KoreanÁudio para Texto em CoreanoVoice 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