Points clés
- Un pipeline multimodal local repose sur quatre modèles orchestrés séparément — pas un modèle unique comme GPT-4o. whisper.cpp gère la voix, un VLM (LLaVA ou Llama 3.2 Vision) gère les images, un LLM gère le raisonnement textuel et Piper gère la sortie vocale. L'orchestrateur route les entrées vers le bon modèle et combine les sorties.
- Llama 3.2 Vision 11B peut remplacer à la fois le VLM et le LLM textuel en un seul modèle. Il accepte texte et images simultanément et gère description et raisonnement en un seul passage — réduisant la VRAM de ~15 Go (modèles séparés) à ~8 Go (Llama 3.2 Vision 11B seul).
- Matériel minimum pour le stack complet : RTX 4070 12 Go ou Apple M5 Pro 36 Go. Un RTX 3060 12 Go peut exécuter une version contrainte (Phi-4 au lieu de Llama 3.1 8B, ou chargement séquentiel des modèles) — utilisable mais plus lent.
- Cinq cas d'usage pratiques justifient la complexité : analyse de documents par commande vocale, Q&A visuel avec interaction vocale, transcription de réunions combinée à l'analyse de diapositives, outils d'accessibilité de lecteur d'écran local et analyse locale de caméras de sécurité.
- L'orchestration async est essentielle pour des performances acceptables. STT et vision peuvent fonctionner en parallèle lorsque des entrées audio et image sont disponibles — le LLM textuel attend les deux, puis génère une réponse combinée.
- Le streaming de la sortie LLM vers TTS réduit la latence perçue de 0,3–0,7 seconde. La génération audio commence dès la première phrase complète pendant que le LLM rédige encore le reste de la réponse.
- Ce n'est pas GPT-4o. Des modèles séparés produisent des « coutures » — la description du modèle de vision passe sous forme de texte au LLM, perdant une partie du raisonnement cross-modal. La qualité sur les tâches multimodales complexes est inférieure aux modèles fermés de pointe, mais suffisante pour les documents structurés et les photos claires.
Faits rapides
- VRAM totale pour le stack complet : ~15 Go (Whisper 3 Go + LLaVA 7B 6 Go + Llama 3.1 8B 6 Go). Piper tourne sur CPU.
- Stack simplifié (Llama 3.2 Vision 11B) : ~8 Go VRAM — gère vision et raisonnement textuel en un seul modèle.
- Latence vocale (Whisper small, RTX 4070) : ~200–500 ms STT. 500–1500 ms premier token LLM. 100 ms Piper TTS.
- Latence traitement image (LLaVA 7B, RTX 4070) : ~2–5 secondes par image selon résolution et prompt.
- Pas de vidéo temps réel : Les VLMs traitent des images individuelles, pas des flux vidéo continus. Pour la vidéo, extraire des images à 1 FPS et traiter chacune.
- Même instance Ollama pour VLM + LLM : Ollama peut servir Llama 3.2 Vision comme modèle de vision et modèle textuel, économisant la VRAM.
- Tous les composants sous licence MIT ou Apache 2.0 (whisper.cpp MIT, LLaVA MIT, Llama 3.1 8B Llama 3 Community License, Piper MIT).
Qu'est-ce qu'un pipeline IA multimodal ?
Un système IA multimodal accepte plusieurs types d'entrée (voix, images, texte) et produit plusieurs types de sortie (texte, parole). L'équivalent cloud est GPT-4o — un seul modèle acceptant audio, images et texte en toute combinaison.
- Approche cloud (GPT-4o) : Un modèle géant entraîné simultanément sur toutes les modalités. Le raisonnement cross-modal est appris à l'entraînement — le modèle peut raisonner nativement sur la relation entre contenu image et requêtes vocales.
- Approche locale (ce guide) : Modèles spécialisés séparés pour chaque modalité, connectés par un orchestrateur. Plus modulaire et moins coûteux à exécuter, mais produit des « coutures » — la sortie du modèle de vision est sérialisée en texte avant d'être transmise au LLM.
- Pourquoi construire localement : Confidentialité (images médicales, documents propriétaires, captures d'écran confidentielles), coût (zéro frais par requête), capacité hors ligne (aucun Internet requis après téléchargement du modèle), personnalisation (échange de tout composant).
- Avantage modulaire : Vous pouvez mettre à niveau n'importe quel composant indépendamment. Quand un meilleur modèle STT local sort, remplacez uniquement la couche STT.
Coût : Pipeline locale vs APIs cloud (mensuel)
À usage modéré (100+ requêtes/jour), un pipeline multimodal local s'amortit en 3–6 mois.
📍 En une phrase
Un pipeline multimodal local coûte 0 $/mois en frais d'API après l'investissement matériel unique (600–3 500 $), avec un seuil de rentabilité face aux coûts API GPT-4o (135–225 $/mois) en 3–18 mois selon le volume de requêtes.
| Usage | GPT-4o API | Google Cloud | Local |
|---|---|---|---|
| 100 requêtes vocales/jour | $90–150/mois | $60–120/mois | $0 |
| 50 analyses d'images/jour | $45–75/mois | $30–60/mois | $0 |
| Combiné (typique) | $135–225/mois | $90–180/mois | $0 |
| Matériel (une fois) | $0 | $0 | $600–3 500 |
| Seuil de rentabilité | — | — | 3–18 mois |
Le pipeline local s'amortit en 3–6 mois à usage modéré (100+ requêtes/jour). À usage léger (10 requêtes/jour), le seuil de rentabilité s'étend à 12–18 mois.
Vue d'ensemble de l'architecture
Le pipeline multimodal local utilise un pattern router-orchestrateur : les entrées sont typées à la frontière, routées vers le modèle approprié, et les sorties sont combinées par l'orchestrateur avant de générer la réponse finale.
- Types d'entrée : Audio microphone (voix), image caméra ou fichier (vision), texte clavier (texte).
- Logique de routage : Détecter le type d'entrée à la frontière. Audio → modèle STT. Image → VLM. Texte → LLM directement. Si audio et image arrivent ensemble, traiter en parallèle et combiner.
- Registre de modèles : Chaque type d'entrée est mappé à une fonction handler qui appelle le modèle approprié et retourne une description texte/transcription.
- Orchestrateur : Collecte toutes les sorties de modèles, les combine en un seul prompt pour le LLM textuel, obtient la réponse LLM et la route vers TTS pour la sortie vocale ou vers l'écran en texte.
- Types de sortie : Réponse vocale (Piper TTS), texte à l'écran, ou données structurées (JSON) pour intégration avec d'autres systèmes.
- Traitement parallèle : STT et VLM peuvent traiter simultanément — une requête audio sur une image peut avoir les deux traités en parallèle, réduisant la latence totale de 40–60 % vs. traitement séquentiel.
Le stack de composants
Stack complet avec exigences VRAM et rôle de chaque composant.
📍 En une phrase
Le stack multimodal local complet utilise ~15 Go VRAM : Whisper large-v3 (3 Go) + LLaVA 1.6 7B (6 Go) + Llama 3.1 8B (6 Go) ; Piper TTS tourne sur CPU sans coût VRAM.
💬 En termes simples
Vous pouvez réduire la VRAM à 8 Go en utilisant Llama 3.2 Vision 11B comme modèle de vision ET de texte — il gère photos ET conversation en un seul modèle.
| Couche | Outil | Modèle | VRAM | Rôle |
|---|---|---|---|---|
| STT | whisper.cpp | Whisper large-v3 | ~3 Go | Voix → transcription texte |
| Vision | Ollama | LLaVA 1.6 7B | ~6 Go | Image → description texte |
| Raisonnement | Ollama | Llama 3.1 8B Q4 | ~6 Go | Texte → réponse texte |
| TTS | Piper | en_US-lessac-medium | CPU uniquement | Texte → sortie vocale |
| Total (modèles séparés) | ~15 Go | Pipeline complet |
💡Tip: Utilisez Llama 3.2 Vision 11B au lieu de LLaVA + Llama 3.1 8B séparés pour réduire la VRAM à ~8 Go.
💡Tip: VLM alternatif : Qwen2-VL 7B (~6 Go VRAM) — plus puissant que LLaVA sur l'OCR multilingue et la compréhension de documents.
Niveaux matériels pour le multimodal
Cinq configurations matérielles, classées par capacité et VRAM.
| Niveau | GPU | RAM | Peut exécuter | Latence (requête vocale + image) |
|---|---|---|---|---|
| Entrée de gamme | RTX 3060 12 Go | 16 Go | STT + Phi-4 (vision séparée, séquentiel) | 5–10 sec |
| Milieu de gamme | RTX 4070 12 Go | 32 Go | Stack complet avec modèles 7B (LLaVA 7B + Llama 3.1 8B, ajustement serré) | 3–6 sec |
| Haut de gamme | RTX 4090 24 Go | 64 Go | Stack complet avec VLM 13B + LLM 8B simultanément | 2–4 sec |
| Apple milieu | M5 Pro 36 Go | 36 Go unifié | Stack complet avec modèles 8B via Metal (recommandé) | 2–4 sec |
| Apple haut de gamme | M5 Max 128 Go | 128 Go unifié | Stack complet avec modèles 70B — meilleure qualité locale | 1–3 sec |
La latence est mesurée de la fin de la requête vocale au début de la lecture TTS, traitement image inclus si une image est présente.
💡Tip: Le M5 Max avec 128 Go de mémoire unifiée est la plateforme multimodale locale ultime. Il peut exécuter Whisper large-v3 (3 Go) + Llama 3.2 Vision 90B (~64 Go) + Piper TTS simultanément.
Cas d'usage 1 : Analyseur de documents par commande vocale
Posez une question sur un document image ; le pipeline transcrit votre voix, traite le document visuellement et lit la réponse à voix haute.
- Exemple : Photographiez une facture et dites « Quel est le montant total dû et quelle est la date limite de paiement ? »
- Pipeline : Whisper transcrit la question → image envoyée à LLaVA ou Llama 3.2 Vision → VLM extrait texte et structure de la facture → LLM combine question + sortie VLM → Piper lit la réponse à voix haute.
- Prompt : « Voici une image : [description VLM]. L'utilisateur demande : [transcription]. Répondez à la question basée sur le contenu de l'image. »
- Meilleur VLM : MiniCPM-V 2.6 ou Llama 3.2 Vision 11B pour la précision OCR facture/document.
- Valeur confidentialité : Dossiers médicaux, documents juridiques, relevés financiers — traités entièrement localement sans aucune donnée quittant la machine.
Cas d'usage 2 : Assistant Q&A visuel
Pointez une caméra vers un objet ou une scène, posez une question verbalement et recevez une réponse vocale.
- Applications : Inventaire d'entrepôt, inspection de terrain, accessibilité pour malvoyants.
- Implémentation : Capturer une image caméra (OpenCV), sauvegarder en JPEG, passer au VLM avec la transcription Whisper.
- Meilleurs modèles : LLaVA 1.6 7B ou Llama 3.2 Vision 11B pour la compréhension générale d'objets/scènes.
- Latence : 3–6 secondes pour capture image + traitement VLM + LLM + TTS sur RTX 4070.
Cas d'usage 3 : Transcription de réunion + Analyse de diapositives
Exécutez Whisper en continu pendant une réunion pour construire une transcription, tout en capturant périodiquement des captures d'écran de diapositives pour analyse VLM. À la fin, combinez transcription + contenu des diapositives pour un résumé local — zéro cloud, zéro exposition de données.
- STT : Exécuter faster-whisper en mode streaming pendant la réunion.
- Vision : À chaque nouvelle diapositive, capturer un screenshot et le passer à LLaVA pour description.
- Combinaison : En fin de réunion, passer transcription + descriptions de diapositives à Llama 3.1 8B pour résumé et points d'action.
- Sortie : Résumé lu à voix haute (Piper TTS) + fichier texte sauvegardé localement.
- Valeur RGPD : Traitement complet de la réunion en local. Aucun audio, transcription ou diapositive envoyé à un service cloud.
Cas d'usage 4 : Outil d'accessibilité local
Un pipeline multimodal local peut servir de lecteur d'écran et d'assistant UI à commande vocale pour les utilisateurs ayant des déficiences visuelles ou motrices — fonctionnant hors ligne sans les problèmes de confidentialité des services d'accessibilité cloud.
- Lecteur d'écran : Capturer un screenshot toutes les 2 secondes → LLaVA décrit ce qui est à l'écran → Piper le lit à voix haute.
- Navigation vocale : Whisper transcrit les commandes vocales → LLM interprète l'intention → exécuter actions clavier/souris via pyautogui.
- Bénéfice confidentialité : Les utilisateurs handicapés utilisent souvent des outils d'accessibilité dans des contextes sensibles. Un outil local garantit qu'aucun contenu d'écran n'est transmis à des tiers.
- Choix de modèle pour l'accessibilité : Moondream 2 pour des descriptions d'écran rapides (2 Go VRAM). LLaVA 7B pour des descriptions plus riches (6 Go VRAM).
Cas d'usage 5 : Analyse locale de caméra de sécurité
Capturer des images d'une caméra IP, exécuter la détection de mouvement localement et déclencher l'analyse VLM uniquement quand un mouvement est détecté — sans services de caméra cloud ni stockage vidéo tiers.
- Capture d'image : Utiliser OpenCV pour capturer une image toutes les 5–10 secondes depuis une caméra IP via RTSP.
- Détection de mouvement : Calculer la différence entre images consécutives. Ignorer les images sous le seuil de mouvement.
- Analyse VLM : Quand un mouvement est détecté, envoyer l'image au VLM : « Décrivez ce qui se passe. Y a-t-il une personne ? »
- Sortie alerte : Si une personne est détectée, déclencher une notification de bureau locale et une annonce Piper TTS.
- Avantage confidentialité : Ring et Nest envoient la vidéo vers AWS et les serveurs Google respectivement. Cette configuration garde toutes les images sur votre matériel.
- Meilleur VLM pour la vitesse : Moondream 2 (~1 seconde par image, ~2 Go VRAM) ou LLaVA 7B (~3 secondes, ~6 Go VRAM).
Construire l'orchestrateur Python
Un orchestrateur Python async route les entrées vers le bon modèle et combine les sorties. asyncio permet à STT et au traitement vision de s'exécuter en parallèle.
#!/usr/bin/env python3
"""Local multimodal orchestrator: voice + vision + text, all offline."""
import asyncio
import base64
import subprocess
import tempfile
import sounddevice as sd
import soundfile as sf
import numpy as np
import requests
OLLAMA_URL = "http://localhost:11434/api/generate"
WHISPER_BIN = "./whisper.cpp/main"
WHISPER_MODEL = "./whisper.cpp/models/ggml-small.bin"
VISION_MODEL = "llava:7b"
TEXT_MODEL = "llama3.1:8b"
PIPER_VOICE = "voices/en_US-lessac-medium.onnx"
SAMPLE_RATE = 16000
async def transcribe_audio(audio: np.ndarray) -> str:
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
sf.write(f.name, audio, SAMPLE_RATE)
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, lambda: subprocess.run(
[WHISPER_BIN, "-m", WHISPER_MODEL, "-f", f.name, "--no-timestamps", "--no-prints"],
capture_output=True, text=True
))
return result.stdout.strip()
async def describe_image(image_path: str) -> str:
with open(image_path, "rb") as f:
image_b64 = base64.b64encode(f.read()).decode("utf-8")
loop = asyncio.get_event_loop()
response = await loop.run_in_executor(None, lambda: requests.post(
OLLAMA_URL,
json={"model": VISION_MODEL, "prompt": "Describe the content of this image in detail.", "images": [image_b64], "stream": False},
))
return response.json()["response"]
async def reason(transcript: str, image_description: str | None = None) -> str:
if image_description:
prompt = f"The user asked (via voice): {transcript}\n\nThe image shows: {image_description}\n\nAnswer based on the image. Be concise."
else:
prompt = transcript
loop = asyncio.get_event_loop()
response = await loop.run_in_executor(None, lambda: requests.post(
OLLAMA_URL, json={"model": TEXT_MODEL, "prompt": prompt, "stream": False},
))
return response.json()["response"]
async def speak(text: str) -> None:
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
await asyncio.get_event_loop().run_in_executor(None, lambda: subprocess.run(
f'echo "{text}" | piper --model {PIPER_VOICE} --output_file {f.name}', shell=True, check=True
))
data, sr = sf.read(f.name)
sd.play(data, sr)
sd.wait()
async def process_query(audio: np.ndarray, image_path: str | None = None) -> None:
if image_path:
transcript, image_desc = await asyncio.gather(transcribe_audio(audio), describe_image(image_path))
else:
transcript = await transcribe_audio(audio)
image_desc = None
if not transcript or len(transcript) < 3:
return
response = await reason(transcript, image_desc)
await speak(response)
async def main():
while True:
audio = sd.rec(int(5 * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1, dtype="int16")
sd.wait()
await process_query(audio)
if __name__ == "__main__":
asyncio.run(main())Optimisation des performances
Optimisations clés pour atteindre une latence acceptable sur le stack multimodal complet :
📍 En une phrase
Les deux plus grandes optimisations sont : (1) exécuter STT et VLM en parallèle avec asyncio quand audio et image sont disponibles, et (2) streamer la sortie LLM vers TTS phrase par phrase pour que l'audio commence avant la fin du LLM.
💬 En termes simples
Sans parallélisme : STT (0,5s) + VLM (3s) + LLM (1s) + TTS (0,1s) = 4,6s. Avec STT + VLM parallèles : max(0,5s, 3s) + LLM (1s) + TTS (0,1s) = 4,1s. Avec TTS streaming → l'utilisateur entend l'audio à 3,5s.
- STT + VLM parallèles : Utiliser
asyncio.gather(transcribe_audio(), describe_image())pour exécuter les deux simultanément. Économise 0,3–2 secondes. - Garder les modèles chauds : Ollama garde automatiquement les modèles en VRAM entre les requêtes. Ne jamais recharger entre les requêtes.
- Streamer LLM → TTS : Détecter les limites de phrases dans la sortie LLM. Passer chaque phrase complète à Piper pendant que le LLM continue de générer.
- Gestion VRAM : Si la VRAM est serrée, décharger le VLM après traitement image avant de charger le LLM textuel. Ajoute ~2–3 secondes mais permet à un GPU 8 Go de gérer le stack complet.
- Utiliser Llama 3.2 Vision comme VLM + LLM combiné : Élimine l'overhead de commutation de modèle — un modèle gère vision et raisonnement textuel.
- Cible premier audio TTS : Piper génère le premier audio en 50–100 ms. Streamer une phrase à la fois pour une latence TTS perçue inférieure à une seconde.
Limitations et évaluation honnête
Un pipeline multimodal local n'est pas GPT-4o. Être clair sur les lacunes évite la frustration et aide à concevoir des contournements.
- Coutures modales : La sortie vision est sérialisée en texte avant d'être transmise au LLM textuel. Le LLM ne peut pas raisonner directement sur les features visuelles — il raisonne sur une description texte de l'image.
- Pas de vidéo temps réel : Les VLMs locaux traitent des images individuelles, pas de vidéo continue. Pour la vidéo, extraire des images à 0,5–2 FPS et traiter séquentiellement.
- Écart de qualité VLM : Les modèles de vision locaux (LLaVA 7B, Llama 3.2 Vision 11B) sont en retrait par rapport à GPT-4o Vision sur les infographies complexes, le texte manuscrit et les scènes ambiguës.
- Pression VRAM : Exécuter trois modèles simultanément sur un seul GPU nécessite une gestion VRAM soigneuse. Sur les GPU 12 Go, les tailles de modèles doivent être choisies avec soin.
- Latence vs. cloud : Un appel multimodal cloud (GPT-4o) prend 1–3 secondes. Un pipeline local prend 3–8 secondes sur du matériel comparable.
- Cohérence : Les modèles locaux produisent une qualité de sortie plus variable que les modèles cloud. Des hallucinations occasionnelles sont à prévoir.
Questions fréquemment posées
Puis-je utiliser Llama 3.2 Vision seul pour la voix, la vision et le texte?
Oui. Llama 3.2 Vision 11B peut traiter les images et le texte. Vous pouvez l'utiliser comme modèle unique avec whisper.cpp pour la voix et Piper pour la sortie. Cela réduit VRAM de ~15 GB à ~8 GB. Inconvénient : pas de VLM spécialisé pour l'analyse d'images complexes.
Dois-je exécuter la vision et le LLM ensemble ou séparément?
Ensemble si 12+ GB VRAM. Séparé (échange) si 8 GB — charge VLM, stocke description, décharge, charge LLM. Séparé ajoute ~2–3 sec latence mais économise VRAM. Pour interactif : ensemble.
Quel modèle de vision: LLaVA 1.6, Qwen2-VL ou Llama 3.2 Vision?
LLaVA 1.6: rapide (~1s), suffisant. Qwen2-VL: meilleure compréhension (~1,5s). Llama 3.2 Vision: meilleure qualité, combine vision+texte (~2s). Pour vitesse: LLaVA. Pour qualité: Llama 3.2 Vision.
Le pipeline est-il assez rapide pour les assistants vocaux temps réel?
Oui si optimisé. whisper ~1–2s, LLM ~1–2s, TTS ~0,1s = ~2–4s total. Plus rapide que cloud APIs, mais pas synchrone. Parfait pour assistants asynchrones.
Puis-je exécuter le pipeline sur RTX 3060 12 GB?
Non les quatre simultanément (~15 GB requis). Solution: Llama 3.2 Vision 11B (8 GB) seul ou quantifiez à INT4 (~10 GB). Ou échangez modèles selon type d'entrée.
Est-ce conforme au RGPD pour utilisation médicale/juridique?
Oui par conception — zéro trafic réseau, zéro données personnelles qui quittent vos systèmes. Vérifiez avec Wireshark. Attention au stockage — si vous gardez historique/images, respectez les périodes de rétention (Article 5 RGPD).
Puis-je ajouter recherche web au pipeline?
Oui. Ajoutez étape recherche (DuckDuckGo API ou RAG local) entre orchestrateur et LLM texte. Ajoute 0,5–2s latence mais permet questions d'actualité.
Consommation électrique 24/7?
Au repos: ~50–80 W (GPU), ~15–25 W (Mac M5 Pro). Actif: ~150–300 W (GPU), ~30–60 W (Mac). Coût: $5–15 (Mac) ou $15–35 (desktop) par mois. Moins qu'API cloud comparable.
Puis-je exécuter sur laptop sans GPU externe?
CPU seul: très lent (~30s+ latence). GPU intégré (Metal, Arc): mieux mais pas idéal. Mieux: GPU externe ou cloud.
VLM spécialisé ou généraliste?
Spécialisé (LLaVA): plus rapide, plus léger. Généraliste (Llama 3.2 Vision): meilleur pour scènes complexes. Pratique: spécialisé + LLM reasoning donne souvent meilleurs résultats.
Sources
- Ollama — Orchestration locale LLM, supporte modèles vision et APIs chat.
- whisper.cpp sur GitHub — Speech-to-text rapide CPU, accélération Metal/CUDA.
- LLaVA sur Hugging Face — Modèle Vision-Language open source.
- Llama 3.2 Vision — LLM multimodal, 11B.
- Piper TTS sur GitHub — Text-to-speech local rapide.