Taste Application
La seconde moitié du pipeline. taste-distillation mesure les références pour produire un pack de style ; celle-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 séparé de ito-video n’est nécessaire. Installez scripts/requirements.txt pour le traitement local. Installez scripts/requirements-live.txt uniquement pour l’exécution chez le fournisseur. Les téléversements, soumissions et téléchargements en direct nécessitent TASTE_FORGE_ALLOW_LIVE=1 en plus des identifiants ; ne le définissez que pour l’exécution autorisée de l’utilisateur. --dry-run reste sans identifiant et produit des placeholders étiquetés. Un délai d’attente ambigu du fournisseur n’est pas réessayé comme un nouveau travail payant. Inspectez la requête du fournisseur avant de décider si une nouvelle soumission est justifiée.
Utilisez les prises terminées existantes sans aucun appel au 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 secondes demandées et réelles, le sous-dépassement, le dépassement et la politique cadence_target. Les différences d’au moins une image de sortie sont signalées 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 le montage avant la livraison.
Le pipeline conserve les fichiers de plans notés de chaque exécution car les FCPXML et EDL modifiables les référencent. Il refuse les collisions de sortie et signale les échecs d’exportation de la timeline. Un rendu terminé n’est pas un projet d’édition sauvegardé ni une approbation créative. Conservez les actifs sources et les points de contrôle versionnés du projet avant et après les modifications en direct ; enregistrez le chemin sauvegardé et l’empreinte 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 présumez pas qu’un champ de schéma déconnecté affecte une invite de modèle. Validez les champs actuels du point de terminaison par rapport au fournisseur réel avant une exécution payante.
Pour Blender, utilisez le GLB source 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 explicite et préserve l’éclairage de bord et les textures de matière dérivés du pack. Sauvegarder une scène est différent de la rendre ; inspectez l’état du reçu et les images packagées.
Pour les superpositions Resolve, utilisez taste.resolve.apply_placements avec des objets injectés provenant d’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 et à nouveau après tous les ajouts. Les entiers de composition 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 uniquement le placement en mémoire. 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 ces images »
- 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 effectivement à sa référence
Division du travail
Le modèle fournit le contenu, le mouvement, le cadrage et la structure d’éclairage. Le pack fournit la couleur et le rythme. Ceci 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. »
- Gardez deux indicateurs séparés :
--brief(ce qui se PASSE : sujet, action, lieu) et--style-steer(à quoi cela RESSEMBLE). Les fusionner fait fuir des mots de style dans la scène (« teal » devient un objet teal) et des mots de sujet dans l’étalonnage. - Le modèle répond beaucoup mieux à des règles locales et vérifiables qu’à des règles globales. « Arrière-plans noirs purs et sans lumière ; sujets tendant vers le blanc » fonctionne ; « contraste extrême » non.
Générer des PRISES, pas des plans
La lecture évidente de « faire 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 point de terminaison avec un plancher de 4 s transforme un morceau de 10 s en 12 appels, 48 secondes générées pour 10 utilisées (efficacité de 21 %), et douze clips sans lien cousus ensemble pour ce qui devrait se lire comme continu.
Les monteurs tournent une prise plus longue et coupent à l’intérieur. Regrouper 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 appartiennent réellement les uns aux autres 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 verrouillée lente 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 dans le montage, donc le cadrage, le sujet et la lumière doivent changer constamment tout au long – toute fenêtre de 0,8 s doit pouvoir tenir seule comme son propre plan. »
Règles de coupe
- Ré-encodez, ne faites jamais de stream-copy. Le stream-copy ne coupe que sur les images clés, ce qui, à 0,78 s, signifie que la durée du plan arrondit chaque limite au GOP le plus proche – détruisant la chose même que le pipeline existe pour préserver.
- Lorsque vous complétez des images existantes, utilisez leurs propres limites de plan. Couper une vidéo de base en morceaux contigus et les lire dans l’ordre ne fait que réassembler l’original : chaque « coupe » atterrit 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 véritables limites et prenez chaque Nième pour que les sélections consécutives soient garanties discontinues. Cela a fait passer une mesure de coupe de 1,29 s à 0,83 s contre une cible de 0,78 s.
- Échantillonnez les longueurs de plans à partir de la distribution de la référence, pas de sa moyenne, afin que la coupe hérite de la variance du rythme au lieu d’aplatir en clips égaux.
Règles d’étalonnage
- La mesure directe bat une LUT cuite lorsque vous avez le clip : mesurez-le, faites correspondre sa CDF L*, appliquez la chroma par zone.
grade_clip_directa atteint une MAE de 1,58 et un contraste de 34,0 contre 34,7. - Ancrez, ne faites pas de correspondance CDF, lorsque l’histogramme du clip est différent de 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), tandis que la MAE et le contraste étaient tous deux excellents. Par défaut, utilisez un ton ancré.
- La taille du lot compte. Noter 48 images à la fois a tué le processus par OOM ; 6 est sûr.
Comportement récupéré de la plateforme fal
Ces observations et exemples de points de terminaison proviennent du workflow récupéré. Re-vérifiez les métadonnées actuelles du point de terminaison ; ce ne sont pas des garanties concernant chaque future version du fournisseur. Les modèles de graphiques 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é.
Ceux-ci coûtent du temps réel à découvrir. Vérifiez-les avant de concevoir un graphique.
| Limite | Détail |
|---|---|
| Aucun moteur de rendu 3D du tout | fal a image-to-3d, text-to-3d, 3d-to-3d et rien d’autre. Chaque point de terminaison 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 graphique vidéo fal. Rendez localement, puis utilisez fal-ai/ffmpeg-api/images-to-video. |
| compose ne peut pas superposer | 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 exécution soumise en secondes est acceptée et renvoie une vidéo 1000x trop courte. |
| extract-frame offre seulement premier/milieu/dernier | 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 écrit nœud par nœud, ou conservé localement. |
| 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/* ne portent pas le préfixe fal-ai/. kling-video, veo3.1, flux-*, hunyuan-3d, ffmpeg-api le font. |
Choix de points de terminaison
| 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èce | 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 sur la fidélité multi-référence (jusqu’à 50 références mixtes image/vidéo/audio) et ne le mérite pas lors du conditionnement sur une seule image fixe.
Les identifiants de modèles et les prix dérivent. Vérifiez sur fal.ai/models avant de promettre l’un d’eux.
La branche 3D
python mint3d.py --genre <name> --from-stills 4 --retopo --render
python mint3d.py --genre <name> --prompt "a cracked chrome visor" --render
- Générez d’abord une plaque propre ; ne la déduisez pas des images de référence. L’exigence d’entrée déclarée du point de terminaison est un arrière-plan simple, un objet unique, l’objet occupant >50 % du cadre. Les bobines de référence sont l’opposé de cela – collages, plans larges, plusieurs sujets, graphiques incrustés – et produisent un 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 d’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 mono-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 seulement jusqu’à ce que les clés se réorganisent, et un PNG d’aperçu se télécharge correctement – rien n’échoue jusqu’à ce que Blender refuse de l’ouvrir. - Demandez des cartes PBR. Sans elles, le maillage s’éclaire comme du carton peint.
- Retopologisez si quelqu’un doit l’éditer ou l’armer. Les maillages générés sont denses et chaotiques.
- Rendez localement pour boucler la boucle. Une fois qu’un plateau tournant est des images, c’est une séquence, et chaque étape aval gère déjà les séquences – étalonnez-la, coupez-la, utilisez-la comme élément ou téléversez-la comme référence de conditionnement. Utilisez Blender lorsqu’un binaire est dans le PATH ; conservez un rasteriseur logiciel léger en dépendances comme valeur par défaut, car un contexte GL sans tête est la chose unique 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 en dessous de L*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 n’importe quelle référence dans une bande de 24–55 %, donc « préserver les noirs de la source » demande la mauvaise chose et excuse tout autant un étalonnage levé.chroma_mae– erreur a*/b* par zone, en 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 incompatibilité de définition comme une erreur).contrast/black_point/white_pointbanding– bacs d’histogramme L* vides entre les bacs occupés. Compter le total de bacs vides ne fonctionne pas : un clip légitimement sombre a des bacs de hautes lumières vides.cadence– durée 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. Sur float32, L* est 0–100 et a*/b* sont signés ; sur uint8, L* est 0–255 et a*/b* sont biaisés +128. Les mélanger signale des erreurs de chroma dans les centaines.
Chaîne complète
python pipeline.py --genre <name> --refs a.mov b.mov \
--brief "what happens" --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 tous toujours exécutés.
Anti-patrons
| À ne pas faire | Pourquoi |
|---|---|
| Une génération par plan | Efficacité de 21 %, 12 clips sans lien |
| Mettre la couleur dans l’invite | Mesuré comme ne fonctionnant pas ; s’écarte de la base neutre que veut la LUT |
| Stream-copy des coupes | Les limites uniquement sur les images clés détruisent le rythme sous-secondes |
| Couper une vidéo de base de manière contiguë | Réassemble l’original ; chaque coupe invisible |
| Faire confiance à compose pour superposer | Il ne le peut pas ; il rejette la deuxième piste |
| Envoyer des secondes à compose | Silencieusement 1000x trop court |
| Livrer sur la seule MAE | Ajoutez la vérification de la part d’arrière-plan |
Les images empruntées portent l’interface utilisateur de l’application de capture
Le pire défaut unique trouvé dans une coupe livrée : la vidéo finie transportait le bouton j’aime, le compteur de vues et la bulle de commentaires de quelqu’un d’autre, parce que la base
…
[tronqué pour la traduction]