Aller au contenu

Whisper — Reconnaissance vocale

Whisper fournit la transcription audio (reconnaissance vocale) pour les pipelines RAG et l'analyse audio dans AKKO. Il utilise une API compatible OpenAI pour transcrire les fichiers audio en texte — entièrement hors ligne, sans appels API externes.

Architecture

ai-service / ADEN / Cockpit
            |
      +-----v------+
      |   Whisper   |  API REST (port 8000)
      | (Reconnais- |  WAV/MP3/M4A/FLAC/OGG -> Texte
      |  sance      |
      |  vocale)    |
      +------------+

Formats supportés

Format d'entrée Description
WAV Audio PCM non compressé
MP3 Audio compressé MPEG Layer 3
M4A Audio compressé AAC/ALAC
FLAC Audio compressé sans perte
OGG Audio compressé Vorbis/Opus

Utilisation

Depuis Trino (akko_ai_transcribe)

-- Transcrire un fichier audio depuis object storage
SELECT akko_ai_transcribe('s3://akko-documents/reunion-2026-04.wav');

-- Transcrire tous les fichiers audio et stocker les résultats
SELECT
    file_path,
    akko_ai_transcribe(file_path) AS transcript
FROM iceberg.raw.audio_files;

Depuis ai-service (API REST)

import httpx

# Téléverser un fichier
with open("reunion.wav", "rb") as f:
    response = httpx.post(
        "http://akko-akko-ai-service:8000/v1/transcribe",
        files={"file": ("reunion.wav", f)},
    )
print(response.json()["text"])

# Ou utiliser un URI S3
response = httpx.get(
    "http://akko-akko-ai-service:8000/v1/transcribe",
    params={"s3_uri": "s3://akko-documents/reunion.wav"},
)
print(response.json()["text"])

Depuis les notebooks

import requests

# Transcrire un fichier audio depuis object storage
resp = requests.get(
    "http://akko-akko-ai-service:8000/v1/transcribe",
    params={"s3_uri": "s3://akko-documents/entretien.mp3"},
    timeout=300,
)
result = resp.json()
print(f"Langue : {result['language']}")
print(f"Durée : {result['duration_seconds']}s")
print(f"Transcription :\n{result['text']}")

Vérification de santé

curl http://akko-akko-whisper:8000/health

DAG Airflow

Le DAG akko_audio_transcription s'exécute toutes les 15 minutes et automatiquement :

  1. Liste les nouveaux fichiers audio dans le bucket object storage akko-documents
  2. Transcrit chaque fichier via le endpoint /v1/transcribe du service AI
  3. Stocke la transcription dans pgvector rag.documents (content_type=audio/transcript)
  4. Suit les fichiers traités dans rag.audio_transcription_tracking

Configuration

Kubernetes (Helm)

akko-whisper:
  enabled: true
  image:
    repository: hwdsl2/whisper-server
    tag: "latest"  # Épingler une version spécifique en production
  whisperModel: "base"  # Options : tiny, base, small, medium, large
  resources:
    requests:
      cpu: 250m
      memory: 256Mi
    limits:
      cpu: "2"
      memory: 2Gi

Sélection du modèle Whisper

Modèle Taille Vitesse Précision Cas d'usage
tiny 39 Mo Plus rapide Faible Aperçus rapides, développement
base 74 Mo Rapide Modérée Par défaut, bon équilibre
small 244 Mo Modérée Bonne Production avec matériel correct
medium 769 Mo Lente Élevée Transcription de haute qualité
large 1,5 Go Plus lente Maximale Précision maximale

Exigence mémoire

Le modèle Whisper est chargé en mémoire au démarrage. Le modèle base nécessite environ 256 Mi, tandis que large nécessite environ 2 Gi. Ajustez les limites de ressources en conséquence.

Accès réseau

Whisper est un service interne sans accès internet. Il traite l'audio localement avec la reconnaissance vocale sur CPU. La NetworkPolicy restreint :

  • Entrée : Seuls ai-service, ADEN et cockpit peuvent atteindre le port 8000
  • Sortie : DNS uniquement (pas d'accès internet)

RBAC

La fonction Trino akko_ai_transcribe est accessible à :

  • admin — Accès complet
  • engineer — Accès complet
  • analyst — Accès complet
  • steward — Pas d'accès (rôle gouvernance uniquement)
  • viewer — Pas d'accès

Dépannage

Pod Whisper en CrashLoopBackOff (OOMKilled)

Symptômes : Le pod Whisper entre en statut CrashLoopBackOff. kubectl describe pod affiche OOMKilled comme dernière raison de terminaison.

Cause : Le modèle Whisper sélectionné est trop volumineux pour les limites mémoire configurées.

Solution :

# Vérifier les limites mémoire actuelles
kubectl get pod -n akko -l app.kubernetes.io/name=akko-whisper -o jsonpath='{.items[0].spec.containers[0].resources}'

# Utiliser un modèle plus petit ou augmenter la mémoire
helm upgrade akko helm/akko/ -n akko -f helm/examples/values-dev.yaml \
  --set akko-whisper.whisperModel=tiny \
  --set akko-whisper.resources.limits.memory=1Gi

Transcription lente

Symptômes : La transcription audio prend plusieurs minutes pour de courts fichiers. L'utilisation CPU est à 100%.

Cause : Whisper utilise l'inférence sur CPU. Les modèles plus grands et les fichiers audio plus longs nécessitent plus de temps de traitement.

Solution :

# Vérifier l'allocation CPU
kubectl top pod -n akko -l app.kubernetes.io/name=akko-whisper

# Utiliser un modèle plus petit pour un traitement plus rapide
helm upgrade akko helm/akko/ -n akko -f helm/examples/values-dev.yaml \
  --set akko-whisper.whisperModel=tiny

# Ou augmenter les limites CPU
helm upgrade akko helm/akko/ -n akko -f helm/examples/values-dev.yaml \
  --set akko-whisper.resources.limits.cpu=4

Résultats de transcription vides

Symptômes : Le endpoint /v1/transcribe retourne {"status": "error", "error": "Could not transcribe audio"}.

Cause : Le fichier audio peut être corrompu, dans un format non supporté, ou ne contenir que du silence.

Solution :

# Vérifier les logs du pod Whisper
kubectl logs -n akko -l app.kubernetes.io/name=akko-whisper --tail=50

# Vérifier que le fichier audio est valide
kubectl exec -n akko deploy/akko-akko-ai-service -- \
  curl -s "http://akko-akko-whisper:8000/health"