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é¶
DAG Airflow¶
Le DAG akko_audio_transcription s'exécute toutes les 15 minutes et automatiquement :
- Liste les nouveaux fichiers audio dans le bucket object storage
akko-documents - Transcrit chaque fichier via le endpoint
/v1/transcribedu service AI - Stocke la transcription dans pgvector
rag.documents(content_type=audio/transcript) - 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 :