Pipeline de Production Vidéo ASCII
Quand l'utiliser
Utiliser lorsque les utilisateurs demandent : vidéo ASCII, vidéo en art textuel, vidéo style terminal, animation d'art typographique, visualisation rétro en texte, visualiseur audio en ASCII, conversion de vidéo en art ASCII, effets matrix, ou toute sortie ASCII animée.
Contenu
Pipeline de production pour vidéo ASCII artistique — n'importe quel format. Convertit vidéo/audio/images/entrée générative en sortie vidéo ASCII colorée (MP4, GIF, séquence d'images). Couvre : conversion vidéo vers ASCII, visualiseurs musicaux audio-réactifs, animations génératives en ASCII, hybride vidéo+audio réactif, superpositions de texte/paroles, rendu terminal en temps réel.
Standard créatif
C'est de l'art visuel. Les caractères ASCII sont le médium ; le cinéma est la norme.
Avant d'écrire une seule ligne de code, articulez le concept créatif. Quelle est l'ambiance ? Quelle histoire visuelle cela raconte-t-il ? Qu'est-ce qui rend CE projet différent de toutes les autres vidéos ASCII ? Le prompt de l'utilisateur est un point de départ — interprétez-le avec ambition créative, pas de transcription littérale.
L'excellence dès le premier rendu est non négociable. La sortie doit être visuellement frappante sans nécessiter de cycles de révision. Si quelque chose semble générique, plat, ou "art ASCII généré par IA", c'est faux — repensez le concept créatif avant de livrer.
Allez au-delà du vocabulaire de référence. Les catalogues d'effets, les préréglages de shader et les bibliothèques de palettes dans les références sont un vocabulaire de départ. Pour chaque projet, combinez, modifiez et inventez de nouveaux motifs. Le catalogue est une palette de peintures — vous écrivez le tableau.
Soyez proactivement créatif. Étendez le vocabulaire du skill quand le projet l'exige. Si les références n'ont pas ce que la vision demande, construisez-le. Incluez au moins un moment visuel que l'utilisateur n'a pas demandé mais qu'il appréciera — une transition, un effet, un choix de couleur qui élève l'ensemble.
Esthétique cohérente plutôt que correction technique. Toutes les scènes d'une vidéo doivent se sentir connectées par un langage visuel unificateur — température de couleur partagée, palettes de caractères apparentées, vocabulaire de mouvement cohérent. Une vidéo techniquement correcte où chaque scène utilise un effet aléatoire différent est un échec esthétique.
Dense, en couches, réfléchi. Chaque image doit récompenser le visionnage. Jamais de fonds noirs plats. Toujours une composition multi-grille. Toujours une variation par scène. Toujours une couleur intentionnelle.
Modes
| Mode | Entrée | Sortie | Référence |
|---|---|---|---|
| Vidéo vers ASCII | Fichier vidéo | Recréation ASCII de la source | references/inputs.md § Échantillonnage vidéo |
| Audio-réactif | Fichier audio | Visuels génératifs pilotés par les caractéristiques audio | references/inputs.md § Analyse audio |
| Génératif | Aucune (ou paramètres de graine) | Animation ASCII procédurale | references/effects.md |
| Hybride | Vidéo + audio | Vidéo ASCII avec superpositions audio-réactives | Les deux refs d'entrée |
| Paroles/texte | Audio + texte/SRT | Texte synchronisé avec effets visuels | references/inputs.md § Texte/paroles |
| Narration TTS | Citations texte + API TTS | Vidéo de témoignage/citation narrée avec texte tapé | references/inputs.md § Intégration TTS |
Stack
Script Python autonome unique par projet. Aucun GPU requis.
| Couche | Outil | Objectif |
|---|---|---|
| Cœur | Python 3.10+, NumPy | Math, opérations sur tableaux, effets vectorisés |
| Signal | SciPy | FFT, détection de pics (modes audio) |
| Imagerie | Pillow (PIL) | Rastérisation de polices, décodage d'images, I/O d'image |
| I/O vidéo | ffmpeg (CLI) | Décodage entrée, encodage sortie, multiplexage audio |
| Parallélisme | concurrent.futures | N workers pour le rendu par lots/clips |
| TTS | API ElevenLabs (optionnel) | Génération de clips de narration |
| Optionnel | OpenCV | Échantillonnage d'images vidéo, détection de contours |
Architecture du pipeline
Chaque mode suit le même pipeline en 6 étapes :
INPUT → ANALYZE → SCENE_FN → TONEMAP → SHADE → ENCODE
- INPUT — Charger/décoder le matériau source (images vidéo, échantillons audio, images, ou rien)
- ANALYZE — Extraire les caractéristiques par image (bandes audio, luminance/contours vidéo, vecteurs de mouvement)
- SCENE_FN — La fonction de scène rend un canevas de pixels (
uint8 H,W,3). Compose multiples grilles via_render_vf()+ modes de fusion de pixels. Voirreferences/composition.md - TONEMAP — Normalisation adaptative de la luminosité basée sur les percentiles. Voir
references/composition.md§ Mappe de tons adaptative - SHADE — Post-traitement via
ShaderChain+FeedbackBuffer. Voirreferences/shaders.md - ENCODE — Envoyer les images brutes RVB à ffmpeg pour encodage H.264/GIF
Direction créative
Dimensions esthétiques
| Dimension | Options | Référence |
|---|---|---|
| Palette de caractères | Rampe de densité, éléments de blocs, symboles, écritures (katakana, grec, runes, braille), spécifique au projet | architecture.md § Palettes |
| Stratégie de couleur | HSV, OKLAB/OKLCH, palettes RVB discrètes, harmonie générée automatiquement, monochrome, température | architecture.md § Système de couleur |
| Texture de fond | Champs sinusoïdaux, bruit fBM, déformation de domaine, voronoi, réaction-diffusion, automates cellulaires, vidéo | effects.md |
| Effets principaux | Anneaux, spirales, tunnel, vortex, vagues, interférence, aurore, feu, SDFs, attracteurs étranges | effects.md |
| Particules | Étincelles, neige, pluie, bulles, runes, orbites, boids en essaim, suiveurs de champ de flux, traînées | effects.md § Particules |
| Ambiance du shader | CRT rétro, moderne épuré, art glitch, cinématographique, rêveur, industriel, psychédélique | shaders.md |
| Densité de grille | xs(8px) à xxl(40px), mixte par couche | architecture.md § Système de grille |
| Espace de coordonnées | Cartésien, polaire, tuilé, tourné, œil de poisson, Möbius, déformation de domaine | effects.md § Transformations |
| Rétroaction | Tunnel de zoom, traînées arc-en-ciel, écho fantomatique, mandala tournant, évolution de couleur | composition.md § Rétroaction |
| Masquage | Cercle, anneau, dégradé, pochoir de texte, iris/volet/fondu animé | composition.md § Masquage |
| Transitions | Fondu enchaîné, volet, fondu, coupure glitch, iris, révélation basée sur masque | shaders.md § Transitions |
Variation par section
N'utilisez jamais la même configuration pour toute la vidéo. Pour chaque section/scène :
- Effet de fond différent (ou composez-en 2-3)
- Palette de caractères différente (adaptée à l'ambiance)
- Stratégie de couleur différente (ou au minimum une teinte différente)
- Variez l'intensité du shader (plus de floraison pendant les pics, plus de grain pendant le calme)
- Types de particules différents si des particules sont actives
Invention spécifique au projet
Pour chaque projet, inventez au moins un des éléments suivants :
- Une palette de caractères personnalisée correspondant au thème
- Un effet de fond personnalisé (combinez/modifiez des blocs existants)
- Une palette de couleurs personnalisée (ensemble RVB discret adapté à la marque/l'ambiance)
- Un ensemble de caractères de particules personnalisé
- Une transition de scène ou un moment visuel inédit
Ne vous contentez pas de choisir dans le catalogue. Le catalogue est le vocabulaire — vous écrivez le poème.
Flux de travail
Étape 1 : Vision créative
Avant tout code, articulez le concept créatif :
- Ambiance/atmosphère : Que doit ressentir le spectateur ? Énergique, méditatif, chaotique, élégant, menaçant ?
- Histoire visuelle : Que se passe-t-il au fil de la durée ? Construction de tension ? Transformation ? Dissolution ?
- Monde coloré : Chaud/froid ? Monochrome ? Néons ? Tons terre ? Quelle est la teinte dominante ?
- Texture des caractères : Données denses ? Étoiles éparses ? Points organiques ? Blocs géométriques ?
- Qu'est-ce qui rend CE projet différent : Quelle est la chose unique qui rend ce projet spécial ?
- Arc émotionnel : Comment les scènes progressent-elles ? Ouverture énergique, construction vers l'apogée, résolution ?
Mappez le prompt de l'utilisateur sur des choix esthétiques. Un "visualiseur chill lo-fi" exige tout autre chose qu'un "flux de données glitch cyberpunk."
Étape 2 : Conception technique
- Mode — lequel des 6 modes ci-dessus
- Résolution — paysage 1920x1080 (par défaut), portrait 1080x1920, carré 1080x1080 @ 24 ips
- Détection matérielle — détection automatique des cœurs/RAM, définition du profil de qualité. Voir
references/optimization.md - Sections — mappage des horodatages aux fonctions de scène, chacune avec sa propre configuration d'effet/palette/couleur/shader
- Format de sortie — MP4 (par défaut), GIF (640x360 @ 15 ips), séquence PNG
Étape 3 : Construction du script
Fichier Python unique. Composants (avec références) :
- Détection matérielle + profil de qualité —
references/optimization.md - Chargeur d'entrée — dépendant du mode ;
references/inputs.md - Analyseur de caractéristiques — FFT audio, luminance vidéo, ou synthétique
- Grille + moteur de rendu — grilles multi-densité avec cache bitmap ;
references/architecture.md - Palettes de caractères — multiples par projet ;
references/architecture.md§ Palettes - Système de couleur — HSV + RVB discret + génération d'harmonie ;
references/architecture.md§ Couleur - Fonctions de scène — chacune retourne
canvas (uint8 H,W,3);references/scenes.md - Mappe de tons — normalisation adaptative de la luminosité ;
references/composition.md - Pipeline de shader —
ShaderChain+FeedbackBuffer;references/shaders.md - Tableau de scènes + répartiteur — temps → fonction de scène + configuration ;
references/scenes.md - Encodeur parallèle — rendu de clips avec N workers via pipes ffmpeg
- Main — orchestration du pipeline complet
Étape 4 : Vérification de la qualité
- Tester d'abord les images : rendu d'images uniques à des horodatages clés avant le rendu complet
- Vérification de la luminosité :
canvas.mean() > 8pour tout le contenu ASCII. Si sombre, réduire le gamma - Cohérence visuelle : toutes les scènes semblent-elles appartenir à la même vidéo ?
- Vérification de la vision créative : la sortie correspond-elle au concept de l'étape 1 ? Si elle a l'air générique, recommencez
Notes d'implémentation critiques
Luminosité — Utilisez tonemap(), pas les multiplicateurs linéaires
C'est le problème visuel n°1. L'ASCII sur fond noir est intrinsèquement sombre. N'utilisez jamais de multiplicateurs canvas * N — ils écrêtent les hautes lumières. Utilisez une mappe de tons adaptative :
def tonemap(canvas, gamma=0.75):
f = canvas.astype(np.float32)
lo, hi = np.percentile(f[::4, ::4], [1, 99.5])
if hi - lo < 10: hi = lo + 10
f = np.clip((f - lo) / (hi - lo), 0, 1) ** gamma
return (f * 255).astype(np.uint8)
Pipeline : scene_fn() → tonemap() → FeedbackBuffer → ShaderChain → ffmpeg
Gamma par scène : défaut 0.75, solariser 0.55, posteriser 0.50, scènes lumineuses 0.85. Utilisez le mode de fusion screen (pas overlay) pour les couches sombres.
Hauteur de cellule de police
macOS Pillow : textbbox() retourne une hauteur incorrecte. Utilisez font.getmetrics() : cell_height = ascent + descent. Voir references/troubleshooting.md.
Interblocage du pipe ffmpeg
N'utilisez jamais stderr=subprocess.PIPE avec ffmpeg longue durée — le tampon se remplit à 64 Ko et provoque un interblocage. Redirigez vers un fichier. Voir references/troubleshooting.md.
Compatibilité des polices
Tous les caractères Unicode ne s'affichent pas dans toutes les polices. Validez les palettes à l'initialisation — rendez chaque caractère, vérifiez la sortie vide. Voir references/troubleshooting.md.
Architecture par clip
Pour les vidéos segmentées (citations, scènes, chapitres), rendez chaque élément comme un fichier clip séparé pour le rendu parallèle et le re-rendu sélectif. Voir references/scenes.md.
Objectifs de performance
| Composant | Budget |
|---|---|
| Extraction de caractéristiques | 1-5 ms |
| Fonction d'effet | 2-15 ms |
| Rendu de caractères | 80-150 ms (goulot d'étranglement) |
| Pipeline de shader | 5-25 ms |
| Total | ~100-200 ms/image |
Références
| Fichier | Contenu |
|---|---|
references/architecture.md | Système de grille, préréglages de résolution, sélection de police, palettes de caractères (20+), système de couleur (HSV + OKLAB + RVB discret + génération d'harmonie), helper _render_vf(), classe GridLayer |
references/composition.md | Modes de fusion de pixels (20 modes), blend_canvas(), composition multi-grille, tonemap() adaptative, FeedbackBuffer, PixelBlendStack, système de masquage/pochoir |
references/effects.md | Blocs de construction d'effets : générateurs de champs de valeur, champs de teinte, bruit/fBM/déformation de domaine, voronoi, réaction-diffusion, automates cellulaires, SDFs, attracteurs étranges, systèmes de particules, transformations de coordonnées, cohérence temporelle |
references/shaders.md | ShaderChain, répartition _apply_shader_step(), catalogue de 38 shaders, mise à l'échelle audio-réactive, transitions, préréglages de teinte, encodage de format de sortie, rendu terminal |
references/scenes.md | Protocole de scène, classe Renderer, tableau SCENES, render_clip(), découpage synchronisé au rythme, rendu parallèle, motifs de conception (hiérarchie de couches, arcs directionnels, métaphores visuelles, techniques de composition), exemples complets de scènes à tous les niveaux de complexité, liste de contrôle de conception de scène |
references/inputs.md | Analyse audio (FFT, bandes, battements), échantillonnage vidéo, conversion d'image, texte/paroles, intégration TTS (ElevenLabs, attribution de voix, mixage audio) |
references/optimization.md | Détection matérielle, profils de qualité, motifs vectorisés, rendu parallèle, gestion de la mémoire, budgets de performance |
references/troubleshooting.md | Pièges de diffusion NumPy, erreurs de mode de fusion, multiprocessing/pickle, diagnostics de luminosité, problèmes ffmpeg, problèmes de polices, erreurs courantes |
Divergence créative (à utiliser uniquement lorsque l'utilisateur demande une sortie expérimentale/créative/unique)
Si l'utilisateur demande une sortie créative, expérimentale, surprenante ou non conventionnelle, sélectionnez la stratégie qui convient le mieux et raisonnez à travers ses étapes AVANT de générer du code.
- Connexions forcées — lorsque l'utilisateur souhaite une inspiration inter-domaines ("rendre ça organique", "esthétique industrielle")
- Mélange conceptuel — lorsque l'utilisateur nomme deux choses à combiner ("océan rencontre musique", "espace + calligraphie")
- Stratégies obliques — lorsque l'utilisateur est très ouvert ("surprenez-moi", "quelque chose que je n'ai jamais vu")
Connexions forcées
- Choisissez un domaine sans rapport avec l'objectif visuel (systèmes météorologiques, microbiologie, architecture, dynamique des fluides, tissage textile)
- Listez ses éléments visuels/structuraux principaux (érosion → révélation progressive ; mitose → duplication par division ; tissage → motifs entrelacés)
- Mappez ces éléments sur des caractères ASCII et des motifs d'animation
- Synthétisez — à quoi ressemblent "l'érosion" ou "la cristallisation" dans une grille de caractères ?
Mélange conceptuel
- Nommez deux domaines visuels distincts à fusionner (par exemple, "danse+dataviz", "jardinage+cyberpunk", "calligraphie+spectrogramme")
- Pour chaque domaine, listez ses formes, motifs et mouvements caractéristiques
- Trouvez un point d'intersection ou de correspondance où les qualités d'un domaine peuvent être cartographiées sur l'autre
- Construisez un effet de scène ou une palette visuelle qui incarne le mélange — pas juste l'un après l'autre, mais vraiment fusionné