Was macht Geschmack-Anwendung?
Die zweite Hälfte der Pipeline. taste-distillation misst Referenzen zu einem Stilpaket; diese erzeugt gegen dieses Paket und schneidet das Ergebnis.
Ausführungs- und Liefervertrag
Die ursprüngliche Implementierung befindet sich hier in scripts/; kein separates ito-video-Checkout erforderlich. Installieren Sie scripts/requirements.txt für lokale Verarbeitung. Installieren Sie scripts/requirements-live.txt nur für die Provider-Ausführung. Live-Uploads, -Abgaben und -Downloads erfordern explizit TASTE_FORGE_ALLOW_LIVE=1 zusätzlich zu den Anmeldeinformationen; setzen Sie es nur für den autorisierten Lauf des Benutzers. --dry-run bleibt ohne Anmeldeinformationen und erzeugt gekennzeichnete Platzhalter. Ein mehrdeutiges Provider-Timeout wird nicht als neuer bezahlter Auftrag wiederholt. Überprüfen Sie die Provider-Anforderung, bevor Sie entscheiden, ob eine weitere Abgabe gerechtfertigt ist.
Verwenden Sie vorhandene abgeschlossene Takes ohne Provider-Aufrufe:
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 ist ein Best-Effort-Kadenzziel, keine genaue Laufzeit. Vollständige Aufnahmen können eine kürzere oder längere Bearbeitung erzeugen; der Assembler dupliziert keine Clips oder fügt keine Auffüllung hinzu, um das Ziel zu erreichen. Das Ausgabemanifest behält die tatsächliche duration bei und fügt duration_contract mit angeforderter und tatsächlicher Dauer, Fehlbetrag, Überschreitung und dem cadence_target-Policy hinzu. Unterschiede von mindestens einem Ausgabeframe werden explizit gewarnt. Es wird kein Modus für exakte Dauer bereitgestellt; wenn eine genaue Laufzeit erforderlich ist, überprüfen Sie die Quittung und überarbeiten oder lehnen Sie den Schnitt vor der Lieferung ab.
Die Pipeline behält die bewerteten Shots-Dateien jedes Laufs, da die bearbeitbaren FCPXML und EDL darauf verweisen. Sie verweigert Ausgabekollisionen und meldet Timeline-Exportfehler. Ein abgeschlossener Render ist kein gespeichertes Editor-Projekt oder kreative Freigabe. Bewahren Sie Quellmaterialien und versionierte Projekt-Checkpoints vor und nach Live-Bearbeitungen auf; zeichnen Sie den gespeicherten Pfad und den Hash getrennt von der In-Memory-Timeline-Quittung auf.
Klonbereite Fal-Graphen und ihr Offline-Eingabe-Compiler sind in workflows/README.md dokumentiert. Kompilieren Sie Brief und Stilrichtung vor der Abgabe; gehen Sie nicht davon aus, dass ein getrenntes Schemafeld einen Modell-Prompt beeinflusst. Validieren Sie die aktuellen Endpunktfelder gegen den tatsächlichen Provider vor einem bezahlten Lauf.
Für Blender verwenden Sie das vollständig texturierte GLB-Quellmaterial; Retopologie ist ein separat benanntes Derivat und ersetzt niemals dieses Quellmaterial. blender_prop.py unterstützt explizite --width 1920 --height 1080 --fps 30 --receipt receipt.json und bewahrt vom Paket abgeleitete Rim-Beleuchtung und Materialtexturen. Das Speichern einer Szene unterscheidet sich vom Rendern; überprüfen Sie den Zustand der Quittung und die gepackten Bilder.
Für Resolve-Overlays verwenden Sie taste.resolve.apply_placements mit eingefügten Objekten aus einem explizit ausgewählten, versionierten Ziel. Setzen Sie source_end_mode auf die Konvention, die auf diesem Host verifiziert wurde. Gehen Sie nicht von einem inklusiven Quellenende über Resolve-Versionen hinweg aus. Der Adapter ordnet überlappende Effekte über erhaltenen Spuren an und überprüft jede Platzierung sofort und erneut nach allen Anhängen. Composite-Integers müssen mit der installierten API übereinstimmen; für den verifizierten Studio 21 Host ist Screen 5, nicht der falsche 22 des historischen Builders. Die Quittung beweist nur die In-Memory-Platzierung. Speichern Sie das Projekt, überprüfen Sie seinen Checkpoint, dann inspizieren Sie die genaue gerenderte Ausgabe, bevor Sie die Lieferung melden.
Wann zu aktivieren
- "ein Video in diesem Stil machen" / "das Paket anwenden" / "dieses Filmmaterial ergänzen"
- Zusammensetzen generierter Clips zu etwas mit echtem Bearbeitungsrhythmus
- 3D-Props aus einem Look prägen und zurück ins Video bekommen
- Überprüfen, ob ein fertiges Stück tatsächlich seiner Referenz entspricht
Arbeitsteilung
Das Modell liefert Inhalt, Bewegung, Bildausschnitt und Beleuchtungsstruktur. Das Paket liefert Farbe und Rhythmus. Dies ist gemessen, keine stilistische Präferenz – siehe taste-distillation für die Zahlen. Praktische Konsequenzen:
- Der Generierungs-Prompt enthält null Farbeinhalte. Fügen Sie "Farbe: keine. Neutral rendern. Grading wird nachträglich angewendet." hinzu.
- Halten Sie zwei separate Flags:
--brief(was PASSIERT: Subjekt, Aktion, Ort) und--style-steer(wie es AUSSIEHT). Das Zusammenführen lässt Stilwörter in die Szene sickern ("Teal" wird zu einem tealfarbenen Objekt) und Subjektwörter in das Grading. - Das Modell reagiert auf lokale, überprüfbare Regeln weitaus besser als auf globale. "Hintergründe rein schwarz und unbeleuchtet; Subjekte zu Weiß hin aufhellen" funktioniert; "extremer Kontrast" nicht.
Generieren Sie TAKES, nicht Shots
Die naheliegende Lesart von "den Rhythmus treffen" ist eine Generierung pro Shot. Sie ist wirtschaftlich absurd. Eine Referenz mit durchschnittlich 0,78s/Shot gegen einen Endpunkt mit einer 4-Sekunden-Untergrenze verwandelt ein 10s-Stück in 12 Aufrufe, 48 generierte Sekunden für 10 genutzte (21% Effizienz), und zwölf nicht zusammenhängende Clips, die zu etwas zusammengenäht werden, das wie eine durchgehende Sequenz wirken sollte.
Cut-Filmemacher rollen einen längeren Take und schneiden darin. Gruppieren von Shots in ~5s-Takes: 3 Aufrufe, 13 generierte Sekunden, 77% Effizienz, und aufeinanderfolgende Shots, die tatsächlich zueinander gehören, weil sie aus derselben Generierung stammen.
Geben Sie dem Modell vor, welche Form es haben soll, oder es rendert eine langsame, fixierte Kamerafahrt und sechs Schnitte darin wirken wie ein Stolpern:
"Gefilmt als EIN kontinuierlicher Take ohne harte Schnitte darin. Es wird im Schnitt in 6 Teile von etwa 0,8 s geschnitten, also müssen Bildausschnitt, Subjekt und Licht sich ständig ändern – jedes 0,8-s-Fenster muss als eigener Shot allein bestehen können."
Schnittregeln
- Neu kodieren, nie Stream-Copy. Stream-Copy schneidet nur auf Keyframes, was bei 0,78 s Shotlänge jede Grenze auf den nächsten GOP rundet – und damit genau das zerstört, was die Pipeline bewahren soll.
- Wenn vorhandenes Filmmaterial ergänzt wird, verwenden Sie dessen eigene Shot-Grenzen. Das Zerschneiden eines Basisvideos in zusammenhängende Stücke und deren Wiedergabe in der Reihenfolge setzt nur das Original wieder zusammen: Jeder "Schnitt" landet mitten im Shot und ist unsichtbar. Gemessen: Eine 20-Shot-Montage registrierte nur 12 erkannte Schnitte. Erkennen Sie echte Grenzen und nehmen Sie jeden N-ten Schnitt, damit aufeinanderfolgende Schnitte garantiert diskontinuierlich sind. Das verbesserte eine Schnittmessung von 1,29 s auf 0,83 s gegenüber einem Ziel von 0,78 s.
- Mustern Sie Shotlängen aus der Verteilung der Referenz, nicht aus ihrem Mittelwert, damit der Schnitt die Rhythmusvarianz erbt, anstatt auf gleichmäßige Clips zu glätten.
Grading-Regeln
- Direkte Messung schlägt eine eingebackene LUT, wenn Sie den Clip haben: Messen Sie ihn, passen Sie seine L*-CDF an, wenden Sie Zonen-Chroma an.
grade_clip_directerreichte MAE 1,58 und Kontrast 34,0 gegenüber 34,7. - Ankern, nicht CDF-angepasst, wenn das Histogramm des Clips nicht dem der Referenz ähnelt. Das Erzwingen eines 68%-schwarz generierten Clips auf ein bewegtes Referenzhistogramm hob den gesamten Hintergrund aus dem Schwarz: Die Hintergrunderhaltung fiel auf 26,0% (CDF) gegenüber 69,0% (Anker), während MAE und Kontrast beide immer noch ausgezeichnet aussahen. Standardmäßig auf angekernten Ton gehen.
- Batch-Größe ist wichtig. 48 Frames auf einmal zu gradieren brachte den Prozess zum OOM-Abbruch; 6 sind sicher.
Wiederhergestelltes fal-Plattformverhalten
Diese Beobachtungen und Endpunktbeispiele stammen aus dem wiederhergestellten Workflow. Überprüfen Sie die aktuellen Endpunkt-Metadaten erneut; sie sind keine Garantien für jede zukünftige Provider-Version. Die gebündelten Graph-Vorlagen zeichnen die separat verifizierten Workflow-Eingaben auf, einschließlich expliziter Steuerung des generierten Audios.
Diese kosten reale Zeit, um sie zu entdecken. Überprüfen Sie sie, bevor Sie einen Graphen entwerfen.
| Limit | Detail |
|---|---|
| Kein 3D-Renderer vorhanden | fal hat image-to-3d, text-to-3d, 3d-to-3d und sonst nichts. Jeder 3d-to-3d-Endpunkt gibt ein weiteres Mesh aus. Es gibt keine 3d-to-image/3d-to-video-Kategorie, daher kann ein gemünztes GLB nicht wieder in einen fal-Videographen eingehen. Lokal rendern, dann fal-ai/ffmpeg-api/images-to-video verwenden. |
| compose kann kein Overlay | fal-ai/ffmpeg-api/compose lehnt einen zweiten Track mit "Multiple video tracks are not supported" ab – und es zählt einen image-Track als Video-Track. Es sequenziert nur einen Videotrack. Lokal mit ffmpeg compositen. |
| compose-Keyframes sind Millisekunden | Nichts in der Antwort sagt das. Ein in Sekunden eingereichter Lauf wird akzeptiert und gibt ein 1000x zu kurzes Video zurück. |
| extract-frame bietet nur erste/Mitte/letzte | Kein beliebiger Zeitstempel. Verwenden Sie die drei als drei verschiedene Konditionierungsbilder. |
| Keine Schleifen, keine String-Konkatenation im DAG | Per-Shot-Fan-Out muss Knoten für Knoten verfasst oder lokal gehalten werden. |
| Kling 3.0 hat kein Reference-to-Video | Die v3-Reihe ist nur Text/Bild/Bewegungssteuerung; Reference-to-Video lebt in der o3-Reihe: fal-ai/kling-video/o3/pro/reference-to-video. |
| Prefixe sind nicht einheitlich | bytedance/*, tripo3d/*, meshy/*, minimax/*, openai/* tragen kein fal-ai/-Präfix. kling-video, veo3.1, flux-*, hunyuan-3d, ffmpeg-api schon. |
Endpunkt-Auswahl
| Slot | Best | Wertalternative |
|---|---|---|
| Referenz→Video | bytedance/seedance-2.5/reference-to-video (~$0.473/s @720p) | fal-ai/kling-video/o3/pro/reference-to-video (~$0.112/s) |
| Bild→3D | fal-ai/hunyuan-3d/v3.1/pro/image-to-3d ($0,375, bis zu 8 Ansichten) | tripo3d/h3.1/image-to-3d ($0.20) |
| Text→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 günstiger) |
| Teil-Split | fal-ai/hunyuan-3d/v3.1/part (nur FBX) | tripo3d/tripo/segment |
| Text→Bild | fal-ai/nano-banana-pro ($0,15 Pauschal) | fal-ai/flux-2-pro ($0.03/MP) |
Seedance ist ~4x Kling o3's Preis für die gleichen 5 Sekunden. Es verdient diesen Preis für Multi-Referenz-Treue (bis zu 50 gemischte Bild/Video/Audio-Referenzen) und verdient ihn nicht, wenn es auf einem einzelnen Standbild konditioniert.
Modell-IDs und Preise ändern sich. Überprüfen Sie auf fal.ai/models, bevor Sie eine davon versprechen.
Der 3D-Zweig
python mint3d.py --genre <name> --from-stills 4 --retopo --render
python mint3d.py --genre <name> --prompt "cracked chrome visor" --render
- Generieren Sie zuerst eine saubere Platte; heben Sie nicht aus Referenz-Standbildern ab. Die angegebene Eingabeanforderung des Endpunkts ist einfacher Hintergrund, einzelnes Objekt, Objekt >50% des Bildes. Referenzaufnahmen sind das Gegenteil – Collagen, Weitwinkelaufnahmen, mehrere Subjekte, eingebrannte Grafiken – und sie erzeugen skulpturiertes Rauschen. Text → Einzelobjektplatte → Mesh kostet ~$0,15 extra und ist der Unterschied zwischen einem verwendbaren Mesh und einem weggeworfenen.
- Multi-View ist nach Winkel benannte Felder, keine Liste.
input_image_url(vorne, erforderlich), dannback_image_url,left_image_url,right_image_url,left_front_image_url,right_front_image_url,top_image_url,bottom_image_url. Es gibt keininput_image_urlsund keinmulti_view-Flag – deren Erfindung degradiert jede Münzprägung auf Single-View, während es den Anschein erweckt, zu funktionieren. Ein falsches Winkel-Label ist schlimmer als das Weglassen der Ansicht, weil das Modell ihm vertraut. - Adressieren Sie das GLB per Key, nicht per Position. Die Antwort trägt ein
thumbnailPNG und einenmodel_urls-Block nebenmodel_glb; die erste URL zu nehmen funktioniert nur, bis die Keys sich neu ordnen, und ein Vorschau-PNG lädt gut herunter – nichts schlägt fehl, bis Blender sich weigert, es zu öffnen. - Fordern Sie PBR-Maps an. Ohne sie leuchtet das Mesh wie bemalte Pappe.
- Retopologisieren, wenn jemand es bearbeiten oder riggen wird. Generierte Meshes sind dicht und chaotisch.
- Rendern Sie lokal, um den Kreislauf zu schließen. Sobald ein Drehteller Frames ist, ist es Filmmaterial, und jede nachgelagerte Stufe verarbeitet bereits Filmmaterial – gradieren, schneiden, als Element einblenden oder als Konditionierungsreferenz hochladen. Verwenden Sie Blender, wenn ein Binary im PATH ist; behalten Sie einen leichtgewichtigen Software-Rasterizer als Standard, da ein Headless-GL-Kontext das mit Abstand häufigste ist, das in einem Container fehlt, und ein Renderer, der nur auf einer Workstation funktioniert, ist kein Teil einer Pipeline.
Verifizieren, dann glauben
Jede andere Stufe behauptet ein Ergebnis. Überprüfen Sie es, und überprüfen Sie Verteilungsform, nicht nur Momente:
background– Anteil des Frames unter L*10 gegenüber dem Paket-Wert. Vergleichen Sie mit der Referenz, nicht mit dem Quellclip: Eine generierte Quelle mit 68% Schwarz ist schwärzer als jede Referenz in einem 24–55% Band, daher fordert "die Schwarztöne der Quelle erhalten" das Falsche und entschuldigt gleichermaßen ein angehobenes Grading.chroma_mae– Pro-Zone a*/b*-Fehler, unter Verwendung des Medians (entsprechend der Messung der Paketziele; ein Mittelwert vergleicht hier eine schiefe-sensitive Statistik mit einer robusten und meldet eine Definitionsdiskrepanz als Fehler).contrast/black_point/white_pointbanding– leere L*-Histogramm-Bins zwischen besetzten Bins. Das Zählen aller leeren Bins funktioniert nicht: Ein legitimerweise dunkler Clip hat leere Highlight-Bins.cadence– erkannte mittlere Shot-Länge gegenüber der Referenz.
Achten Sie auf die Einheitenfalle: OpenCV ändert die Lab-Konvention mit dtype. Auf float32 ist L* 0–100 und a*/b* sind vorzeichenbehaftet; auf uint8 ist L* 0–255 und a*/b* sind +128 versetzt. Das Mischen meldet Chroma-Fehler in den Hunderten.
Vollständige Kette
python pipeline.py --genre <name> --refs a.mov b.mov \
--brief "was passiert" --duration 12 \
--base-video existing.mp4 --out out/FINAL.mp4
mint → distill → (mint3d) → apply → forge → verify. Stufen 1–3 werden gecached, sodass das Iterieren über Briefe nie etwas neu misst. --dry-run simuliert jeden Netzwerkaufruf: Der Plan, die Prompts, das Track-Layout und das Manifest werden dennoch alle getestet.
Anti-Patterns
| Nicht machen | Warum |
|---|---|
| Eine Generierung pro Shot | 21% Effizienz, 12 nicht zusammenhängende Clips |
| Farbe in den Prompt setzen | Gemessenermaßen nicht funktional; drückt weg von der neutralen Basis, die die LUT will |
| Stream-Copy der Schnitte | Keyframe-only-Grenzen zerstören den Sub-Sekunden-Rhythmus |
| Basisvideo kontinuierlich schneiden | Setzt das Original wieder zusammen; jeder Schnitt unsichtbar |
| Vertrauen, dass compose überlagert | Es kann nicht; es lehnt den zweiten Track ab |
| Sekunden an compose senden | Still 1000x zu kurz |
| Nur nach MAE liefern | Hintergrundanteil-Prüfung hinzufügen |
Entlehntes Filmmaterial enthält die UI der Aufnahme-App
Der einzige schwerwiegendste Fehler, der in einem gelieferten Schnitt gefunden wurde: Das fertige Video enthielt den Like-Button, den View-Zähler und den Kommentar-Ballon von jemand anderem, weil die Basis …