Configuration Whisper avec Docker : guide complet pour exécuter OpenAI Whisper dans Docker

Configuration Whisper avec Docker : guide complet pour exécuter OpenAI Whisper dans Docker

Eric King

Eric King

Author


Introduction

Exécuter OpenAI Whisper dans des conteneurs Docker offre un environnement cohérent et isolé qui simplifie le déploiement et évite les problèmes du type « ça marche sur ma machine ». Docker permet de :
  • Déployer partout – le même conteneur sur toute plateforme compatible Docker
  • Isoler les dépendances – éviter les conflits avec les paquets système
  • Mettre à l’échelle facilement – lancer plusieurs conteneurs pour le traitement parallèle
  • Contrôler les versions – figer des versions et configurations Whisper précises
  • Simplifier le déploiement – une seule commande pour tout
Ce guide couvre tout ce qu’il faut pour configurer Whisper dans Docker, des conteneurs de base aux configurations prêtes pour la production avec support GPU.

Pourquoi utiliser Docker pour Whisper ?

Avantages de la conteneurisation

1. Cohérence
  • le même environnement en développement, staging et production
  • pas de conflits de dépendances
  • builds reproductibles
2. Portabilité
  • exécution sur toute plateforme supportant Docker
  • migration facile entre serveurs
  • déploiement indépendant du cloud
3. Isolation
  • pas d’interférence avec le système hôte
  • désinstallation propre (supprimer le conteneur)
  • sécurité par isolation
4. Évolutivité
  • mise à l’échelle horizontale simple
  • répartition de charge entre conteneurs
  • limites de ressources par conteneur
5. Intégration DevOps
  • compatible avec les pipelines CI/CD
  • prêt pour Kubernetes
  • adapté au déploiement cloud

Prérequis

Avant de commencer, assurez-vous d’avoir :
  • Docker installé (version 20.10+)
  • Docker Compose (facultatif, pour plusieurs conteneurs)
  • NVIDIA Docker (facultatif, pour le support GPU)
  • des notions de base des commandes Docker

Installer 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 : Téléchargez Docker Desktop sur docker.com

Vérifier l’installation

docker --version
docker-compose --version

Dockerfile de base pour Whisper

Commençons par un Dockerfile simple pour 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"]

Construire l’image

docker build -t whisper:latest .

Exécuter le conteneur de base

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

Dockerfile avec serveur API

En production, un serveur API est souvent nécessaire. Voici un Dockerfile plus complet :
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"]

Exemple de serveur 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

Configuration Docker Compose

Pour une stack complète avec plusieurs services, utilisez 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:

Lancer avec Docker Compose

# Start services
docker-compose up -d

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

# Stop services
docker-compose down

Support GPU avec Docker

Pour l’accélération GPU, le runtime NVIDIA Docker est nécessaire :

Installer 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 avec support 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"]

Exécuter avec GPU

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

# Using docker-compose

docker-compose.yml avec 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 optimisé pour la production

Voici un Dockerfile prêt pour la production avec optimisations :
# 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"]

Avantages du build multi-étapes

  • Image plus petite – seules les dépendances d’exécution dans l’image finale
  • Builds plus rapides – mise en cache séparée des dépendances de build
  • Meilleure sécurité – utilisateur non root, surface d’attaque réduite

Variables d’environnement

Rendez votre configuration Docker paramétrable via des variables d’environnement :

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 avec variables d’environnement

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

Fichier .env

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

Gestion des volumes

Une configuration de volumes correcte assure la persistance des données :

docker-compose.yml avec 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

Avantages

  • Cache des modèles – téléchargement une fois, réutilisation entre conteneurs
  • Persistance des données – les fichiers de sortie survivent aux redémarrages
  • Configuration – mise à jour des configs sans reconstruire l’image

Health checks et supervision

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

Point de terminaison 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

Cas d’usage courants

Cas 1 : environnement de développement

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

Cas 2 : production avec file d’attente

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:

Cas 3 : configuration multi-modèles

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

Bonnes pratiques

1. Utiliser des images de base spécifiques

Mauvais :
FROM python:latest
Bon :
FROM python:3.10-slim

2. Minimiser les couches

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

3. Utiliser .dockerignore

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

4. Définir des limites de ressources

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

5. Utiliser des health checks

Incluez toujours des health checks pour les conteneurs de production :
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1

6. Utilisateur non root

Exécutez les conteneurs sans privilèges root :
RUN useradd -m -u 1000 whisper
USER whisper

7. Mettre en cache les modèles

Utilisez des volumes pour mettre en cache les modèles téléchargés :
volumes:
  - whisper-models:/root/.cache/whisper

Dépannage des problèmes courants

Problème 1 : le conteneur s’arrête immédiatement

Problème : le conteneur démarre puis se termine
Solution :
# Check logs
docker logs <container-id>

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

Problème 2 : GPU non disponible

Problème : la GPU n’est pas détectée dans le conteneur
Solution :
# 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

Problème 3 : manque de mémoire

Problème : le conteneur manque de mémoire
Solution :
# Increase memory limit
deploy:
  resources:
    limits:
      memory: 8G

Problème 4 : téléchargement de modèle lent

Problème : les modèles se téléchargent à chaque démarrage
Solution :
# Use volume for model cache
volumes:
  - whisper-models:/root/.cache/whisper

Problème 5 : permission refusée

Problème : impossible d’écrire sur les volumes
Solution :
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app

Optimisation des performances

1. Préchargement du modèle

Préchargez les modèles dans le Dockerfile :
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"

2. Utiliser faster-whisper

Pour de meilleures performances, utilisez faster-whisper :
RUN pip install --no-cache-dir faster-whisper

3. Multithreading

Configurez les processus workers :
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

4. Allocation des ressources

Allouez des ressources adaptées :
deploy:
  resources:
    limits:
      cpus: '4'
      memory: 8G

Considérations de sécurité

1. Utiliser des images de base officielles

FROM python:3.10-slim  # Official Python image

2. Scanner les vulnérabilités

docker scan whisper:latest

3. Mettre à jour les images

Mettez régulièrement à jour les images de base et les dépendances :
FROM python:3.10-slim  # Use latest patch version
RUN pip install --upgrade pip

4. Limiter l’accès réseau

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

Conclusion

Conteneuriser Whisper offre une solution robuste et évolutive pour la transcription parole-texte. Points clés :
  1. Commencer simplement – avec un Dockerfile de base
  2. Utiliser Docker Compose – pour simplifier les stacks multi-services
  3. Activer le GPU – pour les performances en production
  4. Suivre les bonnes pratiques – sécurité, optimisation, supervision
  5. Tester en profondeur – avant la mise en production
Avec une bonne configuration Docker, vous pouvez déployer Whisper de façon cohérente dans tout environnement, du développement local à la production cloud.

Prochaines étapes

  • Construire votre premier conteneur – commencez par le Dockerfile de base
  • Ajouter le support GPU – si vous disposez de GPU NVIDIA
  • Configurer Docker Compose – pour la pile applicative complète
  • Déployer dans le cloud – services de conteneurs (ECS, GKE, AKS)
Pour d’autres stratégies de déploiement, consultez nos guides Whisper Cloud Deployment et Whisper API vs Local Deployment.

Essayer gratuitement maintenant

Testez dès maintenant notre service IA pour la voix, l’audio et la vidéo. Vous bénéficiez d’une transcription vocale en texte très précise, de la traduction multilingue et d’une identification intelligente des locuteurs, mais aussi de la génération automatique de sous‑titres vidéo, de l’édition intelligente de contenu audiovisuel et d’analyses audio‑visuelles synchronisées. La solution couvre tous les cas d’usage : comptes‑rendus de réunion, création de vidéos courtes, production de podcasts, et bien plus encore. Lancez votre essai gratuit dès aujourd’hui !

Son à Texte en LigneSon à Texte GratuitConvertisseur Son à TexteSon à Texte MP3Son à Texte WAVSon à Texte avec HorodatageVoix en texte pour réunionsSound to Text Multi LanguageSon à Texte Sous-titresConvertir WAV en texteVoix en TexteVoix en Texte en LigneParole en texteConvertir MP3 en texteConvertir enregistrement vocal en texteSaisie Vocale en LigneVoix en Texte avec HorodatageVoix en Texte en Temps RéelVoix en Texte pour Audio LongVoix en Texte pour VidéoVoix en Texte pour YouTubeVoix en Texte pour Montage VidéoVoix en Texte pour Sous-titresVoix en Texte pour PodcastsVoix en Texte pour InterviewsAudio d'Entretien en TexteVoix en Texte pour EnregistrementsVoix en Texte pour RéunionsVoix en Texte pour CoursVoix en Texte pour NotesVoix en Texte MultilingueVoix en Texte PréciseVoix en Texte RapideAlternative Premiere Pro Voix en TexteAlternative DaVinci Voix en TexteAlternative VEED Voix en TexteAlternative InVideo Voix en TexteAlternative Otter.ai Voix en TexteAlternative Descript Voix en TexteAlternative Trint Voix en TexteAlternative Rev Voix en TexteAlternative Sonix Voix en TexteAlternative Happy Scribe Voix en TexteAlternative Zoom Voix en TexteAlternative Google Meet Voix en TexteAlternative Microsoft Teams Voix en TexteAlternative Fireflies.ai Voix en TexteAlternative Fathom Voix en TexteAlternative FlexClip Voix en TexteAlternative Kapwing Voix en TexteAlternative Canva Voix en TexteReconnaissance Vocale pour Audio LongVoix IA en TexteVoix en Texte GratuitVoix en Texte Sans PublicitéVoix en Texte pour Audio BruyantVoix en Texte avec TempsGénérer des Sous-titres depuis l'AudioTranscription de Podcasts en LigneTranscrire les Appels ClientsVoix TikTok vers TexteAudio TikTok vers TexteVoix YouTube en TexteAudio YouTube en TexteMémo Vocal en TexteMessage Vocal WhatsApp en TexteMessage Vocal Telegram en TexteTranscription d'Appel DiscordVoix Twitch en TexteVoix Skype en TexteVoix Messenger en TexteMessage Vocal LINE en TexteTranscrire les Vlogs en TexteConvertir l'Audio de Sermon en TexteConvertir la Parole en ÉcritureTraduire l'Audio en TexteConvertir les Notes Audio en TexteSaisie VocaleSaisie Vocale pour RéunionsSaisie Vocale pour YouTubeParler pour ÉcrireSaisie Sans MainsVoix en MotsParole en MotsParole en Texte en LigneOnline Transcription SoftwareParole en Texte pour RéunionsParole en Texte RapideReal Time Speech to TextLive Transcription AppParole en Texte pour TikTokSon en Texte pour TikTokParler en MotsParole en TexteTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsAudio en SaisieSon en TexteOutil d'Écriture VocaleOutil d'Écriture par ParoleDictée VocaleOutil de Transcription JuridiqueOutil de Dictée MédicaleTranscription Audio JaponaiseTranscription de Réunions en CoréenOutil de Transcription de RéunionsAudio Réunion en TexteConvertisseur de Conférences en TexteAudio de Conférence en TexteTranscription Vidéo en TexteGénérateur de Sous-titres pour TikTokTranscription de Centre d'AppelsOutil Audio Reels vers TexteTranscrire MP3 en TexteTranscrire fichier WAV en texteCapCut Voix en TexteCapCut Voix en TexteVoice to Text in EnglishAudio en Texte AnglaisVoice to Text in SpanishVoice to Text in FrenchAudio en Texte FrançaisVoice to Text in GermanAudio en Texte AllemandVoice to Text in JapaneseAudio en Texte JaponaisVoice to Text in KoreanAudio en Texte CoréenVoice 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