Comment j’ai construit une pipeline d’automatisation complète pour iartshorts — un orchestrateur Python maison, 100% offline.
🔒 100% offline, zéro cloud. Tout tourne localement : LLMs, génération d’images, vidéo, TTS, recherche Wikipedia. Aucun appel API externe, aucune donnée qui quitte mon serveur.
Le Projet : Donnez Vie aux Tableaux
iartshorts (et aiartshorts en anglais) est une chaîne de shorts verticaux qui transforme des portraits de peintures en vidéos parlantes. Le personnage du tableau s’anime, raconte son histoire, ou celle de l’artiste qui l’a peint — le tout dans un ton un peu décontracté, en première personne.
Le but : une fois mise au point, tout automatiser. De la recherche historique à l’upload sur YouTube Shorts, TikTok et Instagram Reels. La seule intervention humaine pendant le traitement est la validation ou le rejet du résultat.
Mais pour que ça tourne, il faut du matériel.
🖥️ Homelab IA
💡 Perf LLM : 2× 4090D en Tensor Parallel 2 ≈ RTX 6000 Pro seule. Mais la 6000 Pro brille en génération image/vidéo et tourne beaucoup plus silencieusement.
La Stack Logicielle
Tout tourne sur Proxmox, puisque c’est aussi mon homelab. Un unique LXC Ubuntu héberge tout ce qui a besoin d’accéder aux GPUs.
Les LLMs
| Modèle | Usage |
|---|---|
| Qwen3.6-27B-FP8 | Daily driver (code + pipeline) |
| Qwen3.5-122B-AWQ | Ancien daily driver |
| Gemma4 31B | Ponctuel |
Les modèles sont gérés par llama-swap + un script Python maison qui génère la config depuis mon dossier de stockage de modèles. Les moteurs d’inférences tournent dans des conteneurs Docker (vLLM, SGLANG, llama.cpp).
ComfyUI
Toute la génération image/vidéo passe par ComfyUI, avec :
- Flux Klein 9b pour la restauration de peinture et la transformation réaliste
- Qwen TTS pour la synthèse vocale
- LTX2.3 pour la génération de vidéos lip-sync (AudioSync)
- Wan2.2 pour les transitions et animations sans paroles
La Pipeline :
10 Étapes
D’une peinture portrait à une vidéo courte prête à être publiée — entièrement automatisé
L’Astuce du Batch Processing
Plutôt que de traiter chaque peinture de bout en bout, je traite l’étape 1 pour TOUTES les peintures, puis l’étape 2 pour toutes, etc.
Ça réduit drastiquement les temps de chargement sur le GPU : un seul warmup par étape au lieu de 10 × N. C’est un gain important sur le temps total de processing.
Le State Machine
Chaque peinture est trackée dans une base SQLite avec un état précis : PENDING → PROCESSING → COMPLETE / FAILED / ABORTED / REDO.
Le système supporte les retries automatiques (×2) et le résumé depuis n’importe quelle étape. Un crash à l’étape 7 sur 50 vidéos ne signifie pas refaire tout le boulot.
Le Client ComfyUI Maison
Mon pipeline utilise un client HTTP + WebSocket custom pour interagir avec ComfyUI, avec tracking de progression temps réel et fallback polling. Entre les batchs, ComfyUI est redémarré automatiquement via SSH (systemctl restart comfyui) pour éviter les memory leaks.
Le Human-in-the-Loop : Les Chiffres Honnêtes
Contrairement à ce qu’on pourrait croire, le pipeline ne produit pas de contenu « plug-and-play ». Chaque jour, je vérifie manuellement toutes les vidéos, une par une.
Les Taux de Rejet
| Étape | Taux de rejet | Raisons |
|---|---|---|
| Pré-filtrage automatique (en étape 0) | ~30% | Plusieurs personnes, corps dénudés |
| Post-traitement manuel (après les 10 étapes) | ~30% | Animation faciale incorrecte, artefacts visuels, lip-sync raté, transition moche, script incorrecte |
| Taux de réussite global | ~49% |
Sur 30 000 tableaux en base (photos libre de droits), un tirage aléatoire pioche ~20 tableaux dans une liste prédéfinie censée correspondre à des portraits chaque soir.
Le matin : ~10 vidéos validées sur ~20 lancés.
💡 Le pré-filtrage est aussi critique que la pipeline elle-même. Mieux vaut rejeter 30% avant de gaspiller du temps GPU. L’analyse vision AI couvre une partie du filtrage (nudité, enfant, portrait unique), mais certains critères (flou, taille du personnage, orientation de la tête) nécessitent l’œil humain, mais avec maintenant l’expérience pourrait être aussi automatisé en pré-filtrage.
Pourquoi Local ? L’Argument Énergétique
Les modèles cloud sont plus puissants. Mais ici, je ne suis limité que par le coût de l’électricité.
En France :
- ✅ Électricité pas chère
- ✅ Faible carbone (nucléaire)
- ✅ Les GPUs tournent la nuit quand l’énergie est moins chère
- ✅ Indépendance totale : pas de crédits API, pas de limites de requêtes
💰 Coût Moyen par Vidéo générée : 0,0193 € (~1,9 ct) – au tarif heure creuse 0,1579€ / kWh (2.9 ct si on prend en compte les 30% de déchets)
Leçons Apprises
- Le state management SQLite est indispensable. Sans ça, un crash = refaire tout. Avec ça, on reprend là où on s’est arrêté.
- Le batch par étapes = gain important de temps. Un seul warmup GPU par étape au lieu d’un warmup par peinture par étape.
- Le restart automatique de ComfyUI. Via SSH entre les batchs, c’est la seule façon fiable d’éviter certains memory leaks sur des runs de plusieurs heures.
- La recherche hors-ligne via ZIM. Pas de dépendance réseau pour les données Wikipedia. Plus rapide, plus fiable, plus privé.
- 30% de rejet, c’est la réalité actuelle. Les modèles vidéo génèrent encore trop d’artefacts pour une automatisation 100%. Le human-in-the-loop est non-négociable pour du contenu qualité.
Tableau Récapitulatif des Licences
| Modèle | License | Usage commercial |
|---|---|---|
| Qwen3.6-27B | Apache 2.0 | ✅ Libre |
| Qwen3.5-122B | Apache 2.0 | ✅ Libre |
| Gemma4-31B | Apache 2.0 | ✅ Libre |
| Qwen TTS | Apache 2.0 | ✅ Libre |
| Wan2.2-I2V-A14B | Apache 2.0 | ✅ Libre |
| Flux.2 Klein 9B | FLUX Non-Commercial License v2.1 | ✅ exploitation des outputs |
| LTX-2.3 | LTX-2 License | ⚠️ Seulement < 10M$ |
Rapport d’Exécution Pipeline
Batch #0 · iartshorts · 2026-05-22 02:58 → 07:54 · 20 tableaux sélectionnés, 30 vidéos produites (15 FR + 15 EN)
✅ 15 tableaux traités → 30 vidéos (français + anglais chacun). 5 tableaux abandonnés à l’étape 0 (Analyse Vision) — tous rejetés en moins de 3 secondes
Efficacité GPU
Sur les 15 tableaux traités, le GPU a été actif à 89,4% du temps réel total. Seulement 31 minutes d’attente en file — un excellent taux d’utilisation pour une pipeline séquentielle.
Répartition du Temps par Étape
Chaque tableau passe par 10 étapes. Chaque étape avec un workflow ComfyUI est exécutée en français ET en anglais. Voici la répartition du temps sur les 15 tableaux traités :
Temps Réel par Étape (15 tableaux)
Calcul vs Attente par Étape
| Étape | Stage | Temps Réel | Calcul GPU | Attente File | GPU % |
|---|---|---|---|---|---|
| 0 | Préparation (Vision) | 0,9m | — | 0,9m | — |
| 1 | Script (LLM + ZIM) | 21,6m | — | 21,6m | — |
| 2 | Audio (TTS × 2) | 28,2m | 27,5m | 0,8m | 97,3% |
| 3 | Image Propre (Flux) | 2,3m | 1,5m | 0,8m | 66,2% |
| 4 | Image Réaliste (Flux) | 1,6m | 0,8m | 0,8m | 51,6% |
| 5 | Transition Vid (Wan) | 22,5m | 21,8m | 0,8m | 96,6% |
| 6 | LipSync Vid (LTX × 2) | 164,1m | 163,3m | 0,8m | 99,5% |
| 7 | Sous-titres (Wan) | 7,5m | 6,7m | 0,8m | 89,3% |
| 8 | Outro Vid (Wan × 2) | 42,8m | 42,0m | 0,8m | 98,1% |
| 9 | Vidéo Finale (FFmpeg) | 3,4m | — | 3,4m | — |
Top 3 des Goulots d’Étranglement
Ces trois étapes représentent 88,3% de tout le temps de calcul GPU :
| # | Étape | Modèle | Calcul GPU | % du Total | Moy. / Tableau |
|---|---|---|---|---|---|
| 1 | LipSync Vidéo | LTX2.3-AudioSync × 2 | 2h 43m | 62,0% | 10,9 min |
| 2 | Outro Vidéo | Wan2.2 × 2 | 42 min | 15,9% | 2,8 min |
| 3 | Audio (TTS) | Qwen TTS × 2 | 28 min | 10,4% | 1,8 min |
🐌 Le LipSync (LTX2.3) est le goulot d’étranglement principal avec 62% du temps GPU. Chaque tableau nécessite 2 vidéos lip-sync (FR + EN), d’environ 5,4 minutes chacune. Réduire la durée de cette étape aurait le plus grand impact sur le débit global.
Détail par Tableau (15 Traités)
| Tableau | Artiste | Temps Réel | Calcul GPU | GPU % | Étape la + Longue |
|---|---|---|---|---|---|
| Young_Girl_Holding_a_Basket | Berthe Morisot | 22,5m | 21,9m | 97,3% | LipSync 7,6m |
| Thomas_Howard_2nd_Earl_of_Arundel | Anthony van Dyck | 23,2m | 22,7m | 97,8% | LipSync 7,9m |
| The_Spanish_Guitarist | Pierre-Auguste Renoir | 25,5m | 25,2m | 98,8% | LipSync 10,0m |
| Woman_in_a_Flowered_Hat | Pierre-Auguste Renoir | 26,2m | 25,9m | 98,8% | LipSync 10,3m |
| Woman_in_a_Garden | Berthe Morisot | 26,5m | 26,2m | 98,9% | LipSync 10,6m |
| Young_Girl_with_an_Apron | Berthe Morisot | 26,9m | 26,5m | 98,5% | LipSync 10,8m |
| Woman_with_Red_Hair | Alice Pike Barney | 27,2m | 26,9m | 98,9% | LipSync 10,9m |
| Young_Woman_with_a_Water_Pitcher | Johannes Vermeer | 27,2m | 26,8m | 98,5% | LipSync 11,1m |
| Woman_in_Tulle_Blouse | Pierre-Auguste Renoir | 27,5m | 27,1m | 98,6% | LipSync 11,2m |
| The_Embroiderer | Jean Siméon Chardin | 27,6m | 27,2m | 98,6% | LipSync 11,3m |
| The_Stroller_Suzanne_Hoschedé | Claude Monet | 27,8m | 27,4m | 98,6% | LipSync 11,4m |
| Young_Woman_with_Roses | Alice Pike Barney | 29,0m | 28,6m | 98,6% | LipSync 12,2m |
| Woman_Seated_under_the_Willows | Claude Monet | 29,3m | 28,9m | 98,6% | LipSync 12,5m |
| Young_Girl_in_a_Pink-and-Black_Hat | Pierre-Auguste Renoir | 29,7m | 29,3m | 98,7% | LipSync 12,7m |
| The_Red_Kerchief | Claude Monet | 31,6m | 31,1m | 98,4% | LipSync 13,6m |
💡 Tableau le + rapide : « Young Girl Holding a Basket » de Berthe Morisot — 22,5 min total. Le + lent : « The Red Kerchief » de Claude Monet — 31,6 min total. Écart de 9 minutes, principalement dû aux différences de durée du lip-sync.

