Configuración de Whisper con Docker: guía completa para ejecutar OpenAI Whisper en Docker

Configuración de Whisper con Docker: guía completa para ejecutar OpenAI Whisper en Docker

Eric King

Eric King

Author


Introducción

Ejecutar OpenAI Whisper en contenedores Docker ofrece un entorno consistente y aislado que simplifica el despliegue y evita el problema de «en mi máquina sí funciona». Docker facilita:
  • Desplegar en cualquier sitio – el mismo contenedor en cualquier plataforma compatible con Docker
  • Aislar dependencias – evitar conflictos con paquetes del sistema
  • Escalar con facilidad – levantar varios contenedores para procesamiento en paralelo
  • Control de versiones – fijar versiones y configuraciones concretas de Whisper
  • Simplificar el despliegue – un solo comando para todo
Esta guía cubre lo necesario para configurar Whisper en Docker, desde contenedores básicos hasta configuraciones listas para producción con soporte GPU.

¿Por qué usar Docker para Whisper?

Ventajas de la containerización

1. Consistencia
  • el mismo entorno en desarrollo, staging y producción
  • sin conflictos de dependencias
  • builds reproducibles
2. Portabilidad
  • ejecución en cualquier plataforma con Docker
  • migración sencilla entre servidores
  • despliegue independiente del proveedor cloud
3. Aislamiento
  • sin interferir con el sistema anfitrión
  • desinstalación limpia (solo eliminar el contenedor)
  • seguridad mediante aislamiento
4. Escalabilidad
  • escalado horizontal sencillo
  • balanceo de carga entre contenedores
  • límites de recursos por contenedor
5. Integración DevOps
  • compatible con pipelines CI/CD
  • preparado para Kubernetes
  • adecuado para despliegues en la nube

Requisitos previos

Antes de empezar, asegúrate de tener:
  • Docker instalado (versión 20.10+)
  • Docker Compose (opcional, para varios contenedores)
  • NVIDIA Docker (opcional, para soporte GPU)
  • conocimientos básicos de comandos de Docker

Instalar 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: Descarga Docker Desktop desde docker.com

Verificar la instalación

docker --version
docker-compose --version

Dockerfile básico para Whisper

Empecemos con un Dockerfile sencillo para 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 la imagen

docker build -t whisper:latest .

Ejecutar el contenedor básico

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

Dockerfile con servidor API

En producción suele hacer falta un servidor API. Aquí un Dockerfile más 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"]

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

Configuración con Docker Compose

Para un entorno completo con varios servicios, usa 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:

Ejecutar con Docker Compose

# Start services
docker-compose up -d

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

# Stop services
docker-compose down

Soporte GPU con Docker

Para aceleración por GPU necesitas el runtime de NVIDIA para Docker:

Instalar 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 con soporte 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"]

Ejecutar con GPU

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

# Using docker-compose

docker-compose.yml con 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 optimizado para producción

Aquí tienes un Dockerfile listo para producción con optimizaciones:
# 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"]

Ventajas del build multietapa

  • Imagen más pequeña – solo dependencias de ejecución en la imagen final
  • Builds más rápidos – caché separada para dependencias de compilación
  • Mayor seguridad – usuario no root y superficie de ataque reducida

Variables de entorno

Haz tu configuración de Docker parametrizable con variables de entorno:

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 con variables de entorno

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

Archivo .env

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

Gestión de volúmenes

Una configuración adecuada de volúmenes garantiza la persistencia de datos:

docker-compose.yml con volúmenes

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

Ventajas

  • Caché de modelos – los modelos se descargan una vez y se reutilizan
  • Persistencia de datos – los archivos de salida sobreviven a reinicios del contenedor
  • Configuración – actualizar configs sin reconstruir la imagen

Comprobaciones de salud y monitorización

Dockerfile con comprobación de salud

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 habituales

Caso 1: Entorno de desarrollo

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: Producción con cola

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: Varios modelos

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

Buenas prácticas

1. Usar imágenes base específicas

Mal:
FROM python:latest
Bien:
FROM python:3.10-slim

2. Minimizar capas

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

3. Usar .dockerignore

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

4. Definir límites de recursos

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

5. Usar comprobaciones de salud

Incluye siempre health checks en contenedores de producción:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1

6. Usuario no root

Ejecuta los contenedores como usuario no privilegiado:
RUN useradd -m -u 1000 whisper
USER whisper

7. Cachear modelos

Usa volúmenes para cachear modelos descargados:
volumes:
  - whisper-models:/root/.cache/whisper

Solución de problemas frecuentes

Problema 1: El contenedor sale al instante

Problema: el contenedor arranca y termina de inmediato
Solución:
# Check logs
docker logs <container-id>

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

Problema 2: GPU no disponible

Problema: la GPU no se detecta en el contenedor
Solución:
# 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: Sin memoria

Problema: el contenedor se queda sin memoria
Solución:
# Increase memory limit
deploy:
  resources:
    limits:
      memory: 8G

Problema 4: Descarga lenta del modelo

Problema: los modelos se descargan en cada arranque
Solución:
# Use volume for model cache
volumes:
  - whisper-models:/root/.cache/whisper

Problema 5: Permiso denegado

Problema: no se puede escribir en los volúmenes
Solución:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app

Optimización del rendimiento

1. Precarga del modelo

Precarga modelos en el Dockerfile:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"

2. Usar faster-whisper

Para mejor rendimiento, usa faster-whisper:
RUN pip install --no-cache-dir faster-whisper

3. Multihilo

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

4. Asignación de recursos

Asigna recursos adecuados:
deploy:
  resources:
    limits:
      cpus: '4'
      memory: 8G

Consideraciones de seguridad

1. Usar imágenes base oficiales

FROM python:3.10-slim  # Official Python image

2. Escanear vulnerabilidades

docker scan whisper:latest

3. Mantener imágenes actualizadas

Actualiza periódicamente imágenes base y dependencias:
FROM python:3.10-slim  # Use latest patch version
RUN pip install --upgrade pip

4. Limitar el acceso de red

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

Conclusión

Dockerizar Whisper ofrece una solución robusta y escalable para la transcripción voz a texto. Ideas clave:
  1. Empezar simple – con un Dockerfile básico
  2. Usar Docker Compose – para stacks con varios servicios
  3. Activar GPU – para rendimiento en producción
  4. Seguir buenas prácticas – seguridad, optimización, monitorización
  5. Probar a fondo – antes de pasar a producción
Con una configuración Docker adecuada puedes desplegar Whisper de forma coherente en cualquier entorno, desde desarrollo local hasta producción en la nube.

Próximos pasos

  • Construye tu primer contenedor – empieza con el Dockerfile básico
  • Añade soporte GPU – si tienes GPUs NVIDIA
  • Configura Docker Compose – para la pila completa de la aplicación
  • Despliega en la nube – usa servicios de contenedores (ECS, GKE, AKS)
Para más estrategias de despliegue, consulta nuestras guías sobre Whisper Cloud Deployment y Whisper API vs Local Deployment.

Pruébalo gratis ahora

Prueba ahora nuestro servicio de voz y audio/vídeo con IA. Disfruta de transcripción de voz a texto de alta precisión, traducción multilingüe y diarización inteligente de hablantes, además de generación automática de subtítulos de vídeo, edición inteligente de contenido audiovisual y análisis sincronizado de audio e imagen. Cubre por completo casos como actas de reuniones, creación de vídeos cortos y producción de pódcasts. ¡Empieza tu prueba gratuita hoy mismo!

Sonido a Texto OnlineSonido a Texto GratisConvertidor de Sonido a TextoSonido a Texto MP3Sonido a Texto WAVSonido a Texto con Marcas de TiempoVoz a texto para reunionesSound to Text Multi LanguageSonido a Texto SubtítulosConvertir WAV a textoVoz a TextoVoz a Texto en LíneaVoz a textoConvertir MP3 a textoConvertir grabación de voz a textoEscritura por Voz OnlineVoz a Texto con Marcas de TiempoVoz a Texto en Tiempo RealVoz a Texto para Audio LargoVoz a Texto para VideoVoz a Texto para YouTubeVoz a Texto para Edición de VideoVoz a Texto para SubtítulosVoz a Texto para PodcastsVoz a Texto para EntrevistasAudio de Entrevista a TextoVoz a Texto para GrabacionesVoz a Texto para ReunionesVoz a Texto para ConferenciasVoz a Texto para NotasVoz a Texto MultiidiomaVoz a Texto PrecisaVoz a Texto RápidaAlternativa Premiere Pro Voz a TextoAlternativa DaVinci Voz a TextoAlternativa VEED Voz a TextoAlternativa InVideo Voz a TextoAlternativa Otter.ai Voz a TextoAlternativa Descript Voz a TextoAlternativa Trint Voz a TextoAlternativa Rev Voz a TextoAlternativa Sonix Voz a TextoAlternativa Happy Scribe Voz a TextoAlternativa Zoom Voz a TextoAlternativa Google Meet Voz a TextoAlternativa Microsoft Teams Voz a TextoAlternativa Fireflies.ai Voz a TextoAlternativa Fathom Voz a TextoAlternativa FlexClip Voz a TextoAlternativa Kapwing Voz a TextoAlternativa Canva Voz a TextoVoz a Texto para Audio LargoVoz a Texto con IAVoz a Texto GratisVoz a Texto Sin AnunciosVoz a Texto para Audio con RuidoVoz a Texto con TiempoGenerar Subtítulos desde AudioTranscripción de Podcasts OnlineTranscribir Llamadas de ClientesVoz de TikTok a TextoAudio de TikTok a TextoVoz de YouTube a TextoAudio de YouTube a TextoNota de Voz a TextoMensaje de Voz de WhatsApp a TextoMensaje de Voz de Telegram a TextoTranscripción de Llamadas DiscordVoz de Twitch a TextoVoz de Skype a TextoVoz de Messenger a TextoMensaje de Voz de LINE a TextoTranscribir Vlogs a TextoConvertir Audio de Sermón a TextoConvertir Habla en EscrituraTraducir Audio a TextoConvertir Notas de Audio a TextoEscritura por VozEscritura por Voz para ReunionesEscritura por Voz para YouTubeHablar para EscribirEscritura Sin ManosVoz a PalabrasHabla a PalabrasHabla a Texto en LíneaOnline Transcription SoftwareHabla a Texto para ReunionesHabla a Texto RápidoReal Time Speech to TextLive Transcription AppHabla a Texto para TikTokSonido a Texto para TikTokHablar a PalabrasHablar a TextoTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsAudio a EscrituraSonido a TextoHerramienta de Escritura por VozHerramienta de Escritura por HablaDictado por VozHerramienta de Transcripción LegalHerramienta de Dictado MédicoTranscripción de Audio JaponésTranscripción de Reuniones en CoreanoHerramienta de Transcripción de ReunionesAudio de Reunión a TextoConvertidor de Conferencias a TextoAudio de Conferencia a TextoTranscripción de Video a TextoGenerador de Subtítulos para TikTokTranscripción de Centro de LlamadasHerramienta de Audio de Reels a TextoTranscribir MP3 a TextoTranscribir archivo WAV a textoCapCut Voz a TextoCapCut Voz a TextoVoice to Text in EnglishAudio a Texto en InglésVoice to Text in SpanishVoice to Text in FrenchAudio a Texto en FrancésVoice to Text in GermanAudio a Texto en AlemánVoice to Text in JapaneseAudio a Texto en JaponésVoice to Text in KoreanAudio a Texto en 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