Configurazione Whisper con Docker: guida completa per eseguire OpenAI Whisper in Docker

Configurazione Whisper con Docker: guida completa per eseguire OpenAI Whisper in Docker

Eric King

Eric King

Author


Introduzione

Eseguire OpenAI Whisper in container Docker offre un ambiente coerente e isolato che semplifica il deployment ed evita i problemi del tipo «sul mio PC funziona». Docker consente di:
  • Distribuire ovunque – lo stesso container su qualsiasi piattaforma compatibile con Docker
  • Isolare le dipendenze – evitare conflitti con i pacchetti di sistema
  • Scalare facilmente – avviare più container per elaborazione parallela
  • Controllare le versioni – fissare versioni e configurazioni specifiche di Whisper
  • Semplificare il deployment – un solo comando per tutto
Questa guida copre tutto ciò che serve per configurare Whisper in Docker, dai container di base alle configurazioni pronte per la produzione con supporto GPU.

Perché usare Docker per Whisper?

Vantaggi della containerizzazione

1. Coerenza
  • stesso ambiente in sviluppo, staging e produzione
  • nessun conflitto di dipendenze
  • build riproducibili
2. Portabilità
  • esecuzione su qualsiasi piattaforma con Docker
  • migrazione semplice tra server
  • deployment indipendente dal cloud
3. Isolamento
  • nessuna interferenza con il sistema host
  • disinstallazione pulita (rimuovere il container)
  • sicurezza tramite isolamento
4. Scalabilità
  • scaling orizzontale semplice
  • bilanciamento del carico tra container
  • limiti di risorse per container
5. Integrazione DevOps
  • compatibile con pipeline CI/CD
  • pronto per Kubernetes
  • adatto al deployment cloud

Prerequisiti

Prima di iniziare, assicurati di avere:
  • Docker installato (versione 20.10+)
  • Docker Compose (opzionale, per setup multi-container)
  • NVIDIA Docker (opzionale, per supporto GPU)
  • conoscenze di base dei comandi Docker

Installare 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: Scarica Docker Desktop da docker.com

Verificare l’installazione

docker --version
docker-compose --version

Dockerfile di base per Whisper

Iniziamo con un Dockerfile semplice per 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"]

Costruire l’immagine

docker build -t whisper:latest .

Eseguire il container di base

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

Dockerfile con server API

In produzione spesso serve un server API. Ecco un Dockerfile più 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"]

Esempio di server 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

Configurazione Docker Compose

Per uno stack completo con più servizi 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:

Eseguire con Docker Compose

# Start services
docker-compose up -d

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

# Stop services
docker-compose down

Supporto GPU con Docker

Per l’accelerazione GPU serve il runtime NVIDIA Docker:

Installare 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 supporto 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"]

Eseguire 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 ottimizzato per la produzione

Ecco un Dockerfile pronto per la produzione con ottimizzazioni:
# 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"]

Vantaggi del build multi-stage

  • Immagine più piccola – solo dipendenze runtime nell’immagine finale
  • Build più veloci – cache separata per le dipendenze di build
  • Sicurezza migliore – utente non root, superficie di attacco ridotta

Variabili d’ambiente

Rendi configurabile il setup Docker tramite variabili d’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 con variabili d’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

File .env

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

Gestione dei volumi

Una configurazione corretta dei volumi garantisce la persistenza dei dati:

docker-compose.yml con volumi

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

Vantaggi

  • Cache modelli – download una volta, riuso tra container
  • Persistenza dati – i file di output sopravvivono ai riavvii
  • Configurazione – aggiornare le config senza ricostruire l’immagine

Health check e monitoraggio

Dockerfile con 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 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

Casi d’uso comuni

Caso 1: ambiente di sviluppo

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: produzione con coda

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: setup multi-modello

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

Best practice

1. Usare immagini base specifiche

Sbagliato:
FROM python:latest
Giusto:
FROM python:3.10-slim

2. Ridurre i layer

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

3. Usare .dockerignore

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

4. Impostare limiti di risorse

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

5. Usare health check

Includi sempre health check per i container in produzione:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1

6. Utente non root

Esegui i container come utente non privilegiato:
RUN useradd -m -u 1000 whisper
USER whisper

7. Cache dei modelli

Usa volumi per la cache dei modelli scaricati:
volumes:
  - whisper-models:/root/.cache/whisper

Risoluzione dei problemi comuni

Problema 1: il container termina subito

Problema: il container si avvia e poi esce
Soluzione:
# Check logs
docker logs <container-id>

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

Problema 2: GPU non disponibile

Problema: la GPU non viene rilevata nel container
Soluzione:
# 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: memoria insufficiente

Problema: il container va fuori memoria
Soluzione:
# Increase memory limit
deploy:
  resources:
    limits:
      memory: 8G

Problema 4: download del modello lento

Problema: i modelli si scaricano a ogni avvio
Soluzione:
# Use volume for model cache
volumes:
  - whisper-models:/root/.cache/whisper

Problema 5: permesso negato

Problema: impossibile scrivere sui volumi
Soluzione:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app

Ottimizzazione delle prestazioni

1. Precaricamento del modello

Precarica i modelli nel Dockerfile:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"

2. Usare faster-whisper

Per prestazioni migliori usa faster-whisper:
RUN pip install --no-cache-dir faster-whisper

3. Multithreading

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

4. Allocazione risorse

Assegna risorse appropriate:
deploy:
  resources:
    limits:
      cpus: '4'
      memory: 8G

Considerazioni sulla sicurezza

1. Usare immagini base ufficiali

FROM python:3.10-slim  # Official Python image

2. Scansionare le vulnerabilità

docker scan whisper:latest

3. Aggiornare le immagini

Aggiorna periodicamente immagini base e dipendenze:
FROM python:3.10-slim  # Use latest patch version
RUN pip install --upgrade pip

4. Limitare l’accesso di rete

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

Conclusione

Containerizzare Whisper offre una soluzione robusta e scalabile per la trascrizione voce-testo. Punti chiave:
  1. Iniziare in modo semplice – con un Dockerfile di base
  2. Usare Docker Compose – per stack multi-servizio
  3. Abilitare la GPU – per le prestazioni in produzione
  4. Seguire le best practice – sicurezza, ottimizzazione, monitoraggio
  5. Testare a fondo – prima del deployment in produzione
Con una configurazione Docker adeguata puoi distribuire Whisper in modo coerente in qualsiasi ambiente, dallo sviluppo locale alla produzione cloud.

Passi successivi

  • Costruisci il primo container – inizia dal Dockerfile di base
  • Aggiungi il supporto GPU – se hai GPU NVIDIA disponibili
  • Configura Docker Compose – per l’intero stack applicativo
  • Distribuisci sul cloud – servizi container (ECS, GKE, AKS)
Per altre strategie di deployment consulta le nostre guide su Whisper Cloud Deployment e Whisper API vs Local Deployment.

Provalo gratis ora

Prova subito il nostro servizio basato su IA per voce, audio e video! Non solo ottieni una trascrizione voce‑testo ad alta precisione, traduzione multilingue e identificazione intelligente dei parlanti, ma puoi anche generare automaticamente sottotitoli per i video, modificare in modo intelligente i contenuti audio‑video ed effettuare analisi sincronizzate di audio e immagine. Copri tutti gli scenari: verbali di riunioni, creazione di video brevi, produzione di podcast e molto altro. Inizia ora la tua prova gratuita!

Suono a Testo OnlineSuono a Testo GratuitoConvertitore Suono in TestoSuono a Testo MP3Suono a Testo WAVSuono a Testo con TimestampVoce in testo per riunioniSound to Text Multi LanguageSuono a Testo SottotitoliConvertire WAV in testoVoce in TestoVoce in Testo OnlineVoce in TestoConvertire MP3 in TestoConvertire registrazione vocale in testoDigitazione Vocale OnlineVoce in Testo con TimestampVoce in Testo in Tempo RealeVoce in Testo per Audio LunghiVoce in Testo per VideoVoce a Testo per YouTubeVoce a Testo per Montaggio VideoVoce a Testo per SottotitoliVoce a Testo per PodcastVoce a Testo per IntervisteAudio Intervista in TestoVoce a Testo per RegistrazioniVoce a Testo per RiunioniVoce a Testo per LezioniVoce a Testo per NoteVoce in Testo MultilingueVoce in Testo PrecisaVoce in Testo VeloceAlternativa Premiere Pro Voce in TestoAlternativa DaVinci Voce in TestoAlternativa VEED Voce in TestoAlternativa InVideo Voce in TestoAlternativa Otter.ai Voce in TestoAlternativa Descript Voce in TestoAlternativa Trint Voce in TestoAlternativa Rev Voce in TestoAlternativa Sonix Voce in TestoAlternativa Happy Scribe Voce in TestoAlternativa Zoom Voce in TestoAlternativa Google Meet Voce in TestoAlternativa Microsoft Teams Voce in TestoAlternativa Fireflies.ai Voce in TestoAlternativa Fathom Voce in TestoAlternativa FlexClip Voce in TestoAlternativa Kapwing Voce in TestoAlternativa Canva Voce in TestoVoce a Testo per Audio LunghiVoce IA in TestoVoce in Testo GratuitoVoce in Testo Senza PubblicitàVoce in Testo per Audio RumorosoVoce in Testo con TempoGenera Sottotitoli da AudioTrascrizione Podcast OnlineTrascrivi Chiamate ClientiVoce TikTok a TestoAudio TikTok a TestoVoce YouTube in TestoAudio YouTube in TestoMemo Vocale in TestoMessaggio Vocale WhatsApp in TestoMessaggio Vocale Telegram in TestoTrascrizione Chiamata DiscordVoce Twitch in TestoVoce Skype in TestoVoce Messenger in TestoMessaggio Vocale LINE in TestoTrascrivi Vlog in TestoConverti Audio Sermone in TestoConverti Parlato in ScritturaTraduci Audio in TestoConverti Note Audio in TestoDigitazione VocaleDigitazione Vocale per RiunioniDigitazione Vocale per YouTubeParla per ScrivereDigitazione Senza ManiVoce in ParoleParlato in ParoleParlato in Testo OnlineOnline Transcription SoftwareParlato in Testo per RiunioniParlato in Testo VeloceReal Time Speech to TextLive Transcription AppParlato in Testo per TikTokSuono in Testo per TikTokParlare in ParoleParlato in TestoTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsAudio in DigitazioneSuono in TestoStrumento di Scrittura VocaleStrumento di Scrittura VocaleDettatura VocaleStrumento di Trascrizione LegaleStrumento di Dettatura MedicaTrascrizione Audio GiapponeseTrascrizione Riunioni CoreaneStrumento di Trascrizione RiunioniAudio Riunione in TestoConvertitore Lezione a TestoAudio Lezione in TestoTrascrizione Video a TestoGeneratore di Sottotitoli per TikTokTrascrizione Call CenterStrumento Audio Reels a TestoTrascrivere MP3 in TestoTrascrivere file WAV in testoCapCut Voce in TestoCapCut Voce in TestoVoice to Text in EnglishAudio in Testo IngleseVoice to Text in SpanishVoice to Text in FrenchAudio in Testo FranceseVoice to Text in GermanAudio in Testo TedescoVoice to Text in JapaneseAudio in Testo GiapponeseVoice to Text in KoreanAudio in Testo 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