Aplicación de Estilo (taste-application)
La segunda mitad del pipeline. taste-distillation mide las referencias para crear un paquete de estilo; esto genera contenido a partir de ese paquete y lo edita.
Contrato de Ejecución y Entrega
La implementación original se encuentra en scripts/; no se necesita un checkout separado de ito-video. Instale scripts/requirements.txt para procesamiento local. Instale scripts/requirements-live.txt solo para ejecución en el proveedor. Las cargas, envíos y descargas en vivo requieren la variable TASTE_FORGE_ALLOW_LIVE=1 además de las credenciales; actívela solo para la ejecución autorizada del usuario. --dry-run permanece libre de credenciales y genera marcadores etiquetados. Un tiempo de espera ambiguo del proveedor no se reintenta como un nuevo trabajo pago. Inspeccione la solicitud al proveedor antes de decidir si otro envío está justificado.
Utilice tomas completadas existentes sin llamadas al proveedor:
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 es un objetivo de cadencia de mejor esfuerzo, no un tiempo de ejecución exacto. Las tomas completas pueden producir una edición más corta o más larga; el ensamblador no duplica clips ni añade relleno para alcanzar el objetivo. El manifiesto de salida conserva la duration real y añade duration_contract con los segundos solicitados y reales, el déficit, el exceso y la política cadence_target. Las diferencias de al menos un fotograma de salida se advierten explícitamente. No se proporciona un modo de duración exacta; cuando se requiera un tiempo de ejecución exacto, inspeccione el recibo y revise o rechace el corte antes de la entrega.
El pipeline conserva los archivos de toma clasificados de cada ejecución porque el FCPXML y EDL editables los referencian. Rechaza colisiones de salida e informa fallos de exportación de la línea de tiempo. Una renderización completada no es un proyecto de editor guardado ni una aprobación creativa. Conserve los activos fuente y los puntos de control del proyecto versionados antes y después de las ediciones en vivo; registre la ruta guardada y el resumen por separado del recibo de la línea de tiempo en memoria.
Los gráficos de Fal listos para clonar y su compilador de entrada sin conexión están documentados en workflows/README.md. Compile el resumen y la dirección de estilo antes del envío; no asuma que un campo de esquema desconectado afecta a una instrucción del modelo. Valide los campos del endpoint actual contra el proveedor real antes de una ejecución paga.
Para Blender, utilice el GLB texturizado completo; la retopología es un derivado con nombre separado y nunca reemplaza esa fuente. blender_prop.py soporta --width 1920 --height 1080 --fps 30 --receipt receipt.json explícitos y conserva la iluminación de borde y las texturas de material derivadas del paquete. Guardar una escena es distinto a renderizarla; inspeccione el estado del recibo y las imágenes empaquetadas.
Para las superposiciones de Resolve, use taste.resolve.apply_placements con objetos inyectados desde un destino versionado explícitamente seleccionado. Establezca source_end_mode según la convención verificada en ese host. No asuma un final de fuente inclusivo entre versiones de Resolve. El adaptador asigna efectos superpuestos sobre pistas conservadas y verifica cada colocación inmediatamente y de nuevo después de todas las adiciones. Los enteros compuestos deben coincidir con la API instalada; para el host Studio 21 verificado, Screen es 5, no el 22 incorrecto del constructor histórico. El recibo prueba solo la colocación en memoria. Guarde el proyecto, verifique su punto de control, luego inspeccione la salida renderizada exacta antes de informar la entrega.
Cuándo Activar
- "haz un video con este estilo" / "aplica el paquete" / "complementa este metraje"
- Ensamblar clips generados en algo con un ritmo de edición real
- Acuñar props 3D a partir de un aspecto y devolverlos al video
- Verificar que una pieza terminada realmente coincide con su referencia
División del Trabajo
El modelo proporciona contenido, movimiento, encuadre y estructura de iluminación. El paquete proporciona color y ritmo. Esto se mide, no es una preferencia estilística; consulte taste-distillation para los números. Consecuencias prácticas:
- La instrucción de generación contiene lenguaje de color cero. Añada "Color: ninguno. Renderizar neutro. El etalonaje se aplica después."
- Mantenga dos banderas separadas:
--brief(qué SUCEDE: sujeto, acción, lugar) y--style-steer(cómo SE VE). Fusionarlas filtra palabras de estilo en la escena ("verde azulado" se convierte en un objeto verde azulado) y palabras de sujeto en la gradación. - El modelo responde mucho mejor a reglas locales y comprobables que a las globales. "Fondos completamente negros y sin iluminación; sujetos que se inclinan hacia el blanco" funciona; "contraste extremo" no.
Generar TOMAS, No Planos
La lectura obvia de "coincidir con la cadencia" es una generación por plano. Es económicamente absurdo. Una referencia de 0.78s/plano contra un endpoint con un mínimo de 4 segundos convierte una pieza de 10s en 12 llamadas, 48 segundos generados para 10 usados (21% de eficiencia), y doce clips no relacionados cosidos en lo que debería leerse como continuo.
Los editores ruedan una toma más larga y cortan dentro de ella. Agrupar planos en tomas de ~5s: 3 llamadas, 13 segundos generados, 77% de eficiencia, y planos consecutivos que realmente pertenecen entre sí porque provinieron de la misma generación.
Dígale al modelo qué forma quiere, o renderiza un push lento y bloqueado y seis cortes dentro de él se leen como un tartamudeo:
"Filmado como UNA sola toma continua sin cortes duros dentro de ella. Se cortará en 6 piezas de aproximadamente 0.8s en la edición, por lo que el encuadre, el sujeto y la luz deben seguir cambiando en todo momento; cualquier ventana de 0.8s tiene que sostenerse por sí misma como su propio plano."
Reglas de Corte
- Re-codifique, nunca copie en streaming. La copia en streaming solo corta en keyframes, que a 0.78s significa que la duración del plano redondea cada límite al GOP más cercano, destruyendo lo mismo que el pipeline existe para preservar.
- Al complementar metraje existente, use sus propios límites de plano. Dividir un video base en piezas contiguas y reproducirlas en orden solo reensambla el original: cada "corte" cae en medio de un plano y es invisible. Medido, un ensamblaje de 20 planos registró solo 12 cortes detectados. Detecte límites reales y tome cada N-ésimo para que las selecciones consecutivas estén garantizadas como no continuas. Eso movió una medición de corte de 1.29s a 0.83s contra un objetivo de 0.78s.
- Muestree las duraciones de los planos de la distribución de la referencia, no de su media, para que el corte herede la varianza del ritmo en lugar de aplanarse a clips uniformes.
Reglas de Etalonaje
- La medición directa supera a una LUT horneada cuando tienes el clip: mídela, empareja su función de distribución acumulada (CDF) L*, aplica croma por zona.
grade_clip_directalcanzó MAE 1.58 y contraste 34.0 frente a 34.7. - Ancle, no empareje CDF, cuando el histograma del clip no se parece al de la referencia. Forzar un clip generado con 68% de negro sobre un histograma de referencia ocupado elevó todo el fondo fuera del negro: la preservación del fondo cayó al 26.0% (CDF) frente al 69.0% (anclaje), mientras que MAE y contraste aún se veían excelentes. Por defecto, use anclaje de tono.
- El tamaño del lote importa. Etalonar 48 fotogramas a la vez mató el proceso por falta de memoria; 6 es seguro.
Comportamiento Recuperado de la Plataforma fal
Estas observaciones y ejemplos de endpoints provienen del flujo de trabajo recuperado. Vuelva a verificar los metadatos actuales del endpoint; no son garantías sobre cada versión futura del proveedor. Las plantillas de gráfico incluidas registran las entradas del flujo de trabajo verificadas por separado, incluido el control explícito de audio generado.
Estos cuestan tiempo real de descubrir. Verifíquelos antes de diseñar un gráfico.
| Límite | Detalle |
|---|---|
| Sin renderizador 3D | fal tiene image-to-3d, text-to-3d, 3d-to-3d y nada más. Cada endpoint 3d-to-3d emite otra malla. No hay categoría 3d-to-image/3d-to-video, por lo que un GLB acuñado no puede reingresar a un gráfico de video de fal. Renderice localmente, luego use fal-ai/ffmpeg-api/images-to-video. |
| compose no puede superponer | fal-ai/ffmpeg-api/compose rechaza una segunda pista con "Multiple video tracks are not supported" — y cuenta una pista de image como pista de video. Solo secuencia una pista de video. Componga localmente con ffmpeg. |
| compose keyframes están en milisegundos | Nada en la respuesta lo dice. Una ejecución enviada en segundos es aceptada y devuelve un video 1000x más corto. |
| extract-frame ofrece solo primero/medio/último | Sin marca de tiempo arbitraria. Use los tres como tres imágenes de condicionamiento distintas. |
| Sin bucles, sin concatenación de cadenas en el DAG | La expansión por plano debe crearse nodo por nodo, o mantenerse local. |
| Kling 3.0 no tiene referencia-a-video | La línea v3 es solo texto/imagen/control de movimiento; referencia-a-video vive en la línea o3: fal-ai/kling-video/o3/pro/reference-to-video. |
| Los prefijos no son uniformes | bytedance/*, tripo3d/*, meshy/*, minimax/*, openai/* no llevan ningún prefijo fal-ai/. kling-video, veo3.1, flux-*, hunyuan-3d, ffmpeg-api sí lo llevan. |
Selecciones de endpoints
| Ranura | Mejor | Alternativa de valor |
|---|---|---|
| referencia→video | bytedance/seedance-2.5/reference-to-video (~$0.473/s @720p) | fal-ai/kling-video/o3/pro/reference-to-video (~$0.112/s) |
| imagen→3D | fal-ai/hunyuan-3d/v3.1/pro/image-to-3d ($0.375, hasta 8 vistas) | tripo3d/h3.1/image-to-3d ($0.20) |
| texto→3D | fal-ai/hunyuan-3d/v3.1/pro/text-to-3d | tripo3d/h3.1/text-to-3d |
| retopología | fal-ai/hunyuan-3d/v3.1/smart-topology ($0.75) | tripo3d/tripo/remesh (~75x más barato) |
| división de partes | fal-ai/hunyuan-3d/v3.1/part (solo FBX) | tripo3d/tripo/segment |
| texto→imagen | fal-ai/nano-banana-pro ($0.15 fijo) | fal-ai/flux-2-pro ($0.03/MP) |
Seedance es ~4x el precio de Kling o3 por los mismos 5 segundos. Lo gana en fidelidad de múltiples referencias (hasta 50 referencias mixtas de imagen/video/audio) y no lo gana cuando se condiciona en una sola imagen fija.
Los IDs de modelo y los precios varían. Verifique contra fal.ai/models antes de prometer alguno.
La Rama 3D
python mint3d.py --genre <nombre> --from-stills 4 --retopo --render
python mint3d.py --genre <nombre> --prompt "a cracked chrome visor" --render
- Genere una placa limpia primero; no levante de las imágenes fijas de referencia. El requisito de entrada declarado del endpoint es fondo simple, objeto único, objeto >50% del fotograma. Los carretes de referencia son lo opuesto a eso — collages, planos generales, varios sujetos, gráficos sobreimpresos — y producen ruido esculpido. Texto → placa de un solo objeto → malla cuesta ~$0.15 extra y es la diferencia entre una malla utilizable y una descartada.
- La múltiple vista se nombra por campos por ángulo, no una lista.
input_image_url(frontal, requerido), luegoback_image_url,left_image_url,right_image_url,left_front_image_url,right_front_image_url,top_image_url,bottom_image_url. No hayinput_image_urlsni banderamulti_view— inventarlas degrada cada acuñación a una sola vista mientras parece funcionar. Una etiqueta de ángulo incorrecta es peor que omitir la vista, porque el modelo confía en ella. - Diríjase al GLB por clave, no por posición. La respuesta lleva un PNG
thumbnaily un bloquemodel_urlsjunto amodel_glb; tomar la primera URL funciona solo hasta que las claves se reordenan, y un PNG de vista previa se descarga bien — nada falla hasta que Blender se niega a abrirlo. - Solicite mapas PBR. Sin ellos, la malla se ilumina como cartón pintado.
- Retopologice si alguien va a editarlo o riggearlo. Las mallas generadas son densas y caóticas.
- Renderice localmente para cerrar el ciclo. Una vez que un plato giratorio son fotogramas, es metraje, y todas las etapas posteriores ya manejan metraje — etalónelo, córtelo, examínelo como elemento, o súbalo como referencia de condicionamiento. Use Blender cuando un binario esté en PATH; mantenga un rasterizador de software ligero como predeterminado, porque un contexto GL sin cabeza es lo más común que falta en un contenedor y un renderizador que solo funciona en una estación de trabajo no es parte de un pipeline.
Verifique, Luego Confíe
Cada otra etapa afirma un resultado. Compruébelo, y compruebe la forma de la distribución, no solo los momentos:
background— proporción del fotograma por debajo de L*10 frente a la cifra del paquete. Compare con la referencia, no con el clip fuente: una fuente generada con 68% de negro es más negra que cualquier referencia en una banda de 24–55%, por lo que "preservar los negros de la fuente" exige lo incorrecto e igualmente excusa una gradación levantada.chroma_mae— error a*/b* por zona, usando la mediana (coincidiendo con cómo se midieron los objetivos del paquete; una media aquí compara una estadística sensible a la asimetría con una robusta e informa un desajuste de definición como un error).contrast/black_point/white_pointbanding— contenedores de histograma L* vacíos entre los ocupados. Contar los contenedores vacíos totales no funciona: un clip legítimamente oscuro tiene contenedores de resaltados vacíos.cadence— duración media de plano detectada frente a la de la referencia.
Cuidado con la trampa de las unidades: OpenCV cambia la convención Lab con el dtype. En float32, L* es 0–100 y a*/b* están firmados; en uint8, L* es 0–255 y a*/b* están sesgados +128. Mezclarlos informa errores de croma en los cientos.
Cadena Completa
python pipeline.py --genre <nombre> --refs a.mov b.mov \
--brief "what happens" --duration 12 \
--base-video existing.mp4 --out out/FINAL.mp4
acuñar → destilar → (mint3d) → aplicar → forjar → verificar. Las etapas 1–3 están en caché, por lo que iterar sobre resúmenes nunca vuelve a medir nada. --dry-run simula cada llamada de red: el plan, las instrucciones, la disposición de pistas y el manifiesto aún se ejecutan.
Anti-Patrones
| No hacer | Por qué |
|---|---|
| Una generación por plano | 21% de eficiencia, 12 clips no relacionados |
| Poner color en la instrucción | Medido que no funciona; se aleja de la base neutra que la LUT quiere |
| Copia en streaming de los cortes | Los límites solo en keyframes destruyen el ritmo de sub-segundo |
| Cortar un video base de forma contigua | Reensambla el original; cada corte invisible |
| Confiar en compose para superponer | No puede; rechaza la segunda pista |
| Enviar segundos a compose | Silenciosamente 1000x más corto |
| Entregar solo con MAE | Añada la verificación de proporción de fondo |
El Metraje Prestado Lleva la UI de la App de Captura
El peor defecto encontrado en un corte entregado: el video finalizado enviaba el botón de "me gusta", el contador de vistas y la burbuja de comentarios de otra persona, porque la base
...[truncado para traducción]