Taste Application
La seconde moitié du pipeline. taste-distillation mesure les références dans un pack de style ; celui-ci génère à partir de ce pack et monte le résultat.
Contrat d'exécution et de livraison
L'implémentation originale est livrée ici dans scripts/ ; aucun checkout ito-video séparé n'est nécessaire. Installez scripts/requirements.txt pour le traitement local. Installez scripts/requirements-live.txt uniquement pour l'exécution via un fournisseur. Les téléversements, soumissions et téléchargements en direct nécessitent l'option TASTE_FORGE_ALLOW_LIVE=1 en plus des identifiants ; ne l'activez que pour l'exécution autorisée par l'utilisateur. --dry-run reste sans identifiant et produit des placeholders étiquetés. Un délai d'attente ambigu du fournisseur n'est pas relancé comme un nouveau travail payant. Inspectez la demande du fournisseur avant de décider d'une nouvelle soumission.
Utilisez les prises déjà terminées sans aucun appel fournisseur :
python scripts/pipeline.py --genre example --root stylepacks \
--takes media/take-a.mp4 media/take-b.mp4 --duration 12 --fps 30 \
--out out/review-v1.mp4
--duration est une cible de cadence au mieux, pas une durée exacte. Les plans complets peuvent produire un montage plus court ou plus long ; l'assembleur ne duplique pas les clips ni n'ajoute de remplissage pour atteindre la cible. Le manifeste de sortie conserve la duration réelle et ajoute duration_contract avec les durées demandée et réelle, le manque, le dépassement et la politique cadence_target. Les écarts d'au moins une image de sortie sont signalés explicitement. Aucun mode de durée exacte n'est fourni ; lorsqu'une durée exacte est requise, inspectez le reçu et révisez ou rejetez la coupe avant la livraison.
Le pipeline conserve les fichiers de plan gradés de chaque exécution car le FCPXML et l'EDL modifiables y font référence. Il refuse les collisions de sortie et signale les échecs d'exportation de la timeline. Un rendu terminé n'est pas un projet éditeur sauvegardé ni une approbation créative. Conservez les actifs sources et les points de contrôle du projet versionnés avant et après les modifications en direct ; enregistrez le chemin sauvegardé et le digest séparément du reçu de la timeline en mémoire.
Les graphes Fal prêts à cloner et leur compilateur d'entrée hors ligne sont documentés dans workflows/README.md. Compilez le brief et la direction stylistique avant la soumission ; ne supposez pas qu'un champ de schéma déconnecté affecte l'invite du modèle. Validez les champs actuels de l'endpoint auprès du fournisseur réel avant une exécution payante.
Pour Blender, utilisez le GLB texturé complet ; la retopologie est un dérivé nommé séparément et ne remplace jamais cette source. blender_prop.py prend en charge --width 1920 --height 1080 --fps 30 --receipt receipt.json explicites et préserve l'éclairage par bord du pack et les textures de matériau. Sauvegarder une scène est différent de la rendre ; inspectez l'état du reçu et les images packagées.
Pour les incrustations Resolve, utilisez taste.resolve.apply_placements avec des objets injectés depuis une cible versionnée explicitement sélectionnée. Définissez source_end_mode sur la convention vérifiée sur cet hôte. Ne supposez pas une fin de source inclusive entre les versions de Resolve. L'adaptateur alloue les effets de chevauchement au-dessus des pistes préservées et vérifie chaque placement immédiatement puis à nouveau après tous les ajouts. Les entiers composites doivent correspondre à l'API installée ; pour l'hôte vérifié Studio 21, Screen est 5, pas le 22 incorrect du constructeur historique. Le reçu prouve un placement en mémoire uniquement. Sauvegardez le projet, vérifiez son point de contrôle, puis inspectez la sortie rendue exacte avant de signaler la livraison.
Quand activer
- "faire une vidéo dans ce style" / "appliquer le pack" / "compléter ce métrage"
- Assembler des clips générés en quelque chose avec un vrai rythme de montage
- Créer des accessoires 3D à partir d'un look et les réintégrer dans la vidéo
- Vérifier qu'un produit fini correspond réellement à sa référence
Division du travail
Le modèle fournit le contenu, le mouvement, le cadrage et la structure lumineuse. Le pack fournit la couleur et le rythme. C'est mesuré, pas une préférence stylistique — voir taste-distillation pour les chiffres. Conséquences pratiques :
- L'invite de génération ne contient aucun langage de couleur. Ajoutez "Couleur : aucune. Rendu neutre. L'étalonnage est appliqué après."
- Conservez deux drapeaux séparés :
--brief(ce qui SE PASSE : sujet, action, lieu) et--style-steer(à quoi cela RESSEMBLE). Les fusionner fait fuir les mots de style dans la scène ("teal" devient un objet teal) et les mots de sujet dans l'étalonnage. - Le modèle répond bien mieux à des règles locales et vérifiables qu'à des règles globales. "Fonds noirs purs et non éclairés ; sujets tendant vers le blanc" fonctionne ; "contraste extrême" non.
Générer des PRISES, pas des plans
La lecture évidente de "correspondre à la cadence" est une génération par plan. C'est économiquement absurde. Une référence moyenne de 0,78 s/plan contre un endpoint avec un plancher de 4 secondes transforme une pièce de 10 s en 12 appels, 48 secondes générées pour 10 utilisées (efficacité de 21 %), et douze clips sans rapport cousus ensemble dans ce qui devrait être continu.
Les monteurs tournent une prise plus longue et coupent à l'intérieur. Grouper les plans en prises d'environ 5 s : 3 appels, 13 secondes générées, efficacité de 77 %, et des plans consécutifs qui s'appartiennent réellement parce qu'ils proviennent de la même génération.
Dites au modèle quelle forme vous voulez, sinon il rend une poussée lente et verrouillée et six coupes à l'intérieur se lisent comme un bégaiement :
"Filmé comme UNE seule prise continue sans coupe dure à l'intérieur. Elle sera coupée en 6 morceaux d'environ 0,8 s au montage, donc le cadrage, le sujet et la lumière doivent constamment changer tout au long — toute fenêtre de 0,8 s doit pouvoir tenir seule comme son propre plan."
Règles de coupe
- Ré-encodez, jamais copie de flux. La copie de flux ne coupe que sur les images clés, ce qui, à 0,78 s, signifie que la longueur du plan arrondit chaque limite au GOP le plus proche — détruisant exactement ce que le pipeline existe pour préserver.
- Lorsque vous complétez un métrage existant, utilisez ses propres limites de plan. Découper une vidéo de base en morceaux contigus et les jouer dans l'ordre ne fait que réassembler l'original : chaque "coupe" tombe au milieu d'un plan et est invisible. Mesuré, un assemblage de 20 plans n'a enregistré que 12 coupes détectées. Détectez les vraies limites et prenez un plan sur N afin que les choix consécutifs soient garantis discontinus. Cela a fait passer la mesure de coupe de 1,29 s à 0,83 s pour une cible de 0,78 s.
- Échantillonnez les longueurs de plan à partir de la distribution de la référence, pas de sa moyenne, afin que la coupe hérite de la variance rythmique au lieu d'aplatir en clips égaux.
Règles d'étalonnage
- La mesure directe surpasse une LUT cuite quand on a le clip : mesurez-le, faites correspondre sa CDF L
t, appliquez la chroma zonale.
grade_clip_directa atteint MAE 1,58 et contraste 34,0 contre 34,7. - Ancrez, ne faites pas correspondre la CDF, quand l'histogramme du clip ne ressemble pas à celui de la référence. Forcer un clip généré à 68 % de noir sur un histogramme de référence chargé a soulevé tout l'arrière-plan du noir : la préservation de l'arrière-plan est tombée à 26,0 % (CDF) contre 69,0 % (ancrage), alors que MAE et contraste étaient tous deux excellents. Par défaut, utilisez le ton ancré.
- La taille du lot compte. Étalonner 48 images à la fois a tué le processus par manque de mémoire ; 6 est sûr.
Comportement récupéré de la plateforme fal
Ces observations et exemples d'endpoints proviennent du workflow récupéré. Re-vérifiez les métadonnées actuelles de l'endpoint ; elles ne sont pas des garanties pour chaque future version du fournisseur. Les modèles de graphes fournis enregistrent les entrées de workflow vérifiées séparément, y compris le contrôle explicite de l'audio généré.
Ils coûtent du temps réel à découvrir. Vérifiez-les avant de concevoir un graphe.
| Limite | Détail |
|---|---|
| Aucun rendu 3D du tout | fal a image-to-3d, text-to-3d, 3d-to-3d et rien d'autre. Chaque endpoint 3d-to-3d émet un autre maillage. Il n'y a pas de catégorie 3d-to-image/3d-to-video, donc un GLB créé ne peut pas rentrer dans un graphe vidéo fal. Rendez localement, puis utilisez fal-ai/ffmpeg-api/images-to-video. |
| compose ne peut pas incruster | fal-ai/ffmpeg-api/compose rejette une deuxième piste avec "Multiple video tracks are not supported" — et il compte une piste image comme une piste vidéo. Il séquence une seule piste vidéo. Composez localement avec ffmpeg. |
| Les images clés de compose sont en millisecondes | Rien dans la réponse ne le dit. Une soumission en secondes est acceptée et renvoie une vidéo 1000x trop courte. |
| extract-frame offre uniquement première/milieu/dernière | Pas d'horodatage arbitraire. Utilisez les trois comme trois images de conditionnement distinctes. |
| Pas de boucles, pas de concaténation de chaînes dans le DAG | Le déploiement par plan doit être créé nœud par nœud, ou rester local. |
| Kling 3.0 n'a pas de référence-vers-vidéo | La ligne v3 est uniquement texte/image/contrôle de mouvement ; la référence-vers-vidéo se trouve sur la ligne o3 : fal-ai/kling-video/o3/pro/reference-to-video. |
| Les préfixes ne sont pas uniformes | bytedance/*, tripo3d/*, meshy/*, minimax/*, openai/* n'ont pas de préfixe fal-ai/. kling-video, veo3.1, flux-*, hunyuan-3d, ffmpeg-api en ont. |
Choix d'endpoints
| Emplacement | Meilleur | Alternative économique |
|---|---|---|
| référence→vidéo | bytedance/seedance-2.5/reference-to-video (~0,473$/s @720p) | fal-ai/kling-video/o3/pro/reference-to-video (~0,112$/s) |
| image→3D | fal-ai/hunyuan-3d/v3.1/pro/image-to-3d (0,375$, jusqu'à 8 vues) | tripo3d/h3.1/image-to-3d (0,20$) |
| texte→3D | fal-ai/hunyuan-3d/v3.1/pro/text-to-3d | tripo3d/h3.1/text-to-3d |
| retopologie | fal-ai/hunyuan-3d/v3.1/smart-topology (0,75$) | tripo3d/tripo/remesh (~75x moins cher) |
| division de pièces | fal-ai/hunyuan-3d/v3.1/part (FBX uniquement) | tripo3d/tripo/segment |
| texte→image | fal-ai/nano-banana-pro (0,15$ fixe) | fal-ai/flux-2-pro (0,03$/MP) |
Seedance coûte environ 4x le prix de Kling o3 pour les mêmes 5 secondes. Il le mérite pour la fidélité multi-référence (jusqu'à 50 références mixtes image/vidéo/audio) et ne le mérite pas lorsqu'il se conditionne sur une seule image fixe.
Les ID de modèles et les prix changent. Vérifiez sur fal.ai/models avant de promettre l'un d'eux.
La branche 3D
python mint3d.py --genre <nom> --from-stills 4 --retopo --render
python mint3d.py --genre <nom> --prompt "un casque chrome fissuré" --render
- Générez d'abord une plaque propre ; ne la tirez pas des images de référence. L'entrée déclarée de l'endpoint est un arrière-plan simple, un seul objet, objet >50 % du cadre. Les rouleaux de référence sont le contraire — collages, plans larges, plusieurs sujets, graphiques incrustés — et ils produisent du bruit sculpté. Texte → plaque à objet unique → maillage coûte ~0,15$ de plus et fait la différence entre un maillage utilisable et un maillage jeté.
- La multi-vue est nommée par champ par angle, pas une liste.
input_image_url(avant, obligatoire), puisback_image_url,left_image_url,right_image_url,left_front_image_url,right_front_image_url,top_image_url,bottom_image_url. Il n'y a pas deinput_image_urlsni de drapeaumulti_view— les inventer dégrade chaque création en simple vue tout en semblant fonctionner. Une étiquette d'angle erronée est pire que d'omettre la vue, car le modèle lui fait confiance. - Adressez le GLB par clé, pas par position. La réponse contient un PNG
thumbnailet un blocmodel_urlsà côté demodel_glb; prendre la première URL fonctionne jusqu'à ce que les clés se réorganisent, et un PNG d'aperçu se télécharge bien — rien n'échoue jusqu'à ce que Blender refuse de l'ouvrir. - Demandez les cartes PBR. Sans elles, le maillage s'éclaire comme du carton peint.
- Retopologisez si quelqu'un doit l'éditer ou le rigger. Les maillages générés sont denses et chaotiques.
- Rendez localement pour boucler la boucle. Une fois qu'un tourne-disque est des images, c'est du métrage, et chaque étape en aval gère déjà le métrage — étalonnez-le, coupez-le, utilisez-le comme élément ou téléversez-le comme référence de conditionnement. Utilisez Blender quand un binaire est sur le PATH ; gardez un rasteriseur logiciel léger en dépendances comme valeur par défaut, car un contexte GL sans tête est la chose la plus courante qui manque dans un conteneur et un rendu qui ne fonctionne que sur un poste de travail ne fait pas partie d'un pipeline.
Vérifiez, puis croyez
Chaque autre étape prétend un résultat. Vérifiez-le, et vérifiez la forme de la distribution, pas seulement les moments :
background— part du cadre sous L*t 10 par rapport à la valeur du pack. Comparez à la référence, pas au clip source : une source générée à 68 % de noir est plus noire que toute référence dans une bande de 24 à 55 %, donc "préserver les noirs de la source" demande la mauvaise chose et excuse tout aussi bien un étalonnage relevé.chroma_mae— erreur a*/b* par zone, utilisant la médiane (correspondant à la façon dont les cibles du pack ont été mesurées ; une moyenne compare ici une statistique sensible à l'asymétrie à une statistique robuste et signale une divergence de définition comme une erreur).contrast/black_point/white_pointbanding— bins d'histogramme L*t vides entre les bins occupés. Compter le nombre total de bins vides ne fonctionne pas : un clip légitimement sombre a des bins de hautes lumières vides.cadence— longueur moyenne de plan détectée par rapport à celle de la référence.
Attention au piège des unités : OpenCV change la convention Lab avec le dtype. En float32, Lt est 0–100 et a/b* sont signés ; en uint8, Lt est 0–255 et a/b* sont biaisés +128. Les mélanger signale des erreurs chroma dans les centaines.
Chaîne complète
python pipeline.py --genre <nom> --refs a.mov b.mov \
--brief "ce qui se passe" --duration 12 \
--base-video existing.mp4 --out out/FINAL.mp4
mint → distill → (mint3d) → apply → forge → verify. Les étapes 1 à 3 sont mises en cache, donc itérer sur les briefs ne remesure jamais rien. --dry-run simule chaque appel réseau : le plan, les invites, la disposition des pistes et le manifeste sont toujours testés.
Anti-patrons
| À ne pas faire | Pourquoi |
|---|---|
| Une génération par plan | 21 % d'efficacité, 12 clips sans rapport |
| Mettre la couleur dans l'invite | Mesuré comme ne fonctionnant pas ; éloigne de la base neutre que veut la LUT |
| Copie de flux des coupes | Les limites uniquement sur les images clés détruisent le rythme sub-secondes |
| Couper une vidéo de base de manière contiguë | Réassemble l'original ; chaque coupe invisible |
| Faire confiance à compose pour incruster | Il ne peut pas ; il rejette la deuxième piste |
| Envoyer des secondes à compose | Silencieusement 1000x trop court |
| Livrer sur le seul MAE | Ajoutez la vérification de la part d'arrière-plan |
Un métrage emprunté transporte l'interface utilisateur de l'application de capture
Le pire défaut unique trouvé dans une coupe livrée : la vidéo finale contenait le bouton "j'aime", le compteur de vues et la bulle de commentaires de quelqu'un d'autre, parce que la base
…
[Le texte original était tronqué ; la traduction se termine ici.]