Qwen Image 2.1 + MiniMax H3: flujo local de vídeo con primer y último fotograma
Aprende cuándo elegir 768p totalmente local, cuándo compensa el 2K híbrido y cómo crear fotogramas con Qwen, ejecutar H3-Base en local, comparar H3 alojado con las mismas entradas y diagnosticar fallos.
Índice

Puede que ya consigas buenos fotogramas inicial y final con Qwen. El problema real es si H3 puede unirlos en un único plano continuo, sin cambiar al protagonista, introducir un corte no pedido ni llamar “local” a una ruta 2K que depende de API. Esta guía propone una ruta clara: valida primero la cadena 768p totalmente local, pasa a 2K híbrido solo cuando la entrega lo exija y compara H3 local y alojado con entradas idénticas.
Empieza aquí: usa 768p local salvo que necesites 2K de verdad
Si quieres validar la entrega entre modelos, mantener los archivos en tu equipo o localizar cortes inesperados, empieza con 768p totalmente local. Elige 2K híbrido solo cuando la entrega final exija 2K y aceptes las llamadas remotas a H3-Context-IR y H3-Regenerate-2K.
| Tu objetivo | Empieza con | Por qué | Cuándo cambia la recomendación |
|---|---|---|---|
| Demostrar que funciona toda la cadena | 768p totalmente local | Hay menos variables y es más fácil separar los fallos de Qwen y H3 | Avanza cuando 768p sea estable y la entrega requiera realmente 2K |
| Mantener los archivos en tu máquina | 768p totalmente local | Los fotogramas de Qwen y H3-Base pueden permanecer en local | Si 2K es obligatorio pero no puedes usar API remotas, la ruta completa documentada no cumple el requisito; necesitarás otra solución 2K local |
| Entregar el vídeo final en 2K | 2K híbrido | La ruta oficial completa aún depende de dos módulos alojados | Vuelve a 768p o cambia de solución si no puedes enviar los archivos fuera |
| Decidir si conviene más H3 local o alojado | Valida primero 768p local y después haz una prueba emparejada | De lo contrario, mezclarás errores de despliegue con calidad del modelo | Fija una opción a largo plazo tras repetir la prueba con varios tipos de plano |
No prometas compatibilidad por el nombre de la GPU. El ejemplo SGLang de MiniMax usa cuatro GPU y la ejecución pública se hizo en un DGX Spark; ninguno aporta VRAM mínima ni demuestra funcionamiento en una GPU de consumo corriente.
Qué puede quedarse realmente en tu equipo
La generación de fotogramas con Qwen y H3-Base a 768p pueden ser locales; la ruta oficial completa a 2K no.
| Etapa | ¿Puede ejecutarse en local? | Límite documentado |
|---|---|---|
| Generar y editar el primer y último fotograma con Qwen Image 2.1 | Sí | El repositorio oficial ofrece QwenImage21Pipeline, ejemplos locales con Diffusers, tamaños 2K nativos y hasta 10 imágenes de referencia |
| Convertir los fotogramas inicial y final en audio-vídeo con MiniMax H3-Base | Sí | El checkpoint abierto FL2VA admite cero, una o dos imágenes; dos imágenes activan el modo de primer y último fotograma, con validación local a 768p |
| H3-Context-IR | No como implementación oficial completa en local | MiniMax lo describe como un sistema alojado de preprocesamiento y orquestación, no incluido en la versión abierta; se usa por API o se sustituye por un preprocesador propio basado en la guía de prompts |
| H3-Regenerate-2K | No con los componentes abiertos actuales | El módulo no está publicado; el flujo oficial completo a 2K lo invoca por API |
| Comparación con H3 alojado | No | Una ejecución web/API es remota por definición y sirve como control emparejado |
MiniMax también documenta salidas de 4–15 segundos, 24 FPS, audio estéreo a 32 kHz y un lado corto predeterminado de 768 píxeles; el 2K se produce con H3-Regenerate-2K. Son límites del modelo, no una promesa de que cualquier configuración quepa en tu hardware.
Una prueba pública demuestra viabilidad, no un ganador universal
Usa el caso como diseño de prueba, no como veredicto de que H3 local siempre es mejor.
El cineasta Sam Wasserman publicó una ejecución local de idea a imagen y vídeo en un DGX Spark con Qwen Image 2.1 y MiniMax H3. El resultado adjunto dura aproximadamente ocho segundos. Después afirmó haber reutilizado el mismo prompt, las mismas especificaciones y los mismos fotogramas inicial y final en el H3 web de pago. Según su evaluación, el resultado web añadió un corte no deseado, mientras que el local mantuvo la secuencia prevista.
Es una prueba útil de viabilidad y un buen diseño de comparación. No demuestra que H3 local sea mejor en general. Las publicaciones no revelan comandos de instalación, memoria máxima, tiempo de generación, tratamiento del audio, semillas ni intentos fallidos. Además, el seguimiento es la valoración del mismo autor sobre una sola entrada, no una réplica independiente.
Paso 1: reduce la idea a un único plano continuo
Pide una localización, una cadena de acciones y un estado final. Escríbelos como contrato del plano: una especificación corta que permita comprobar tanto la instrucción como el resultado.
| Campo | Qué definir |
|---|---|
| Sujeto y escenario | Personas, objetos, vestuario, fondo y rasgos de identidad que deben permanecer estables |
| Estado inicial | Posición, pose, mirada, distancia de cámara, composición e iluminación del primer fotograma |
| Estado final | Solo el cambio permitido al final; evita cambiar a la vez sujeto, lugar y posición de cámara |
| Trayectoria | Cómo se mueve el sujeto, si se mueve la cámara y en qué orden ocurren las acciones |
| Restricciones de continuidad | Instrucciones explícitas como “un único plano continuo”, “sin cortes” y “sin teletransporte” |
| Especificación de salida | Duración, relación de aspecto y necesidad de diálogo, ambiente o música |
| Restricciones negativas | Personajes, subtítulos, cambios de escena, sustitución de fondo o acciones que no se desean |
Si la prueba pretende detectar cortes imprevistos, no pidas varias localizaciones, periodos temporales o un montaje en el mismo prompt. De lo contrario, el corte puede ser una interpretación razonable de la instrucción y no un fallo.
Por ejemplo, «camina desde la puerta hasta la mesa, toma la taza, sin cortes» sirve para una prueba de primer y último fotograma. «Pasa de la calle a una oficina y después muestra un recuerdo de infancia» necesita varias escenas y no permite medir limpiamente los cortes inesperados.
Paso 2: genera el primer fotograma y edítalo para crear el último
Crea el último fotograma editando el primero, en vez de generar dos imágenes sin relación. Así es más fácil conservar identidad, ropa, composición y fondo antes de que H3 empiece.
El ID oficial es Qwen/Qwen-Image-2.1. Qwen documenta un componente visual de 7B parámetros, ejecución local con Diffusers, generación y edición, 2K nativo y hasta 10 imágenes de referencia.
pip install "torch>=2.4.0" "transformers>=5.17" accelerate pillow
pip install git+https://github.com/huggingface/diffusers
from pathlib import Path
import torch
from diffusers import QwenImage21Pipeline
first_prompt = Path("first_prompt.txt").read_text(encoding="utf-8").strip()
last_edit_prompt = Path("last_edit_prompt.txt").read_text(encoding="utf-8").strip()
pipe = QwenImage21Pipeline.from_pretrained(
"Qwen/Qwen-Image-2.1",
torch_dtype=torch.bfloat16,
).to("cuda")
first = pipe(
prompt=first_prompt,
width=2752,
height=1536,
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
first.convert("RGB").save("first.png")
last = pipe(
prompt=last_edit_prompt,
image=first,
width=2752,
height=1536,
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(43),
).images[0]
last.convert("RGB").save("last.png")
El código combina las interfaces oficiales de generación y edición de una imagen; tú aportas first_prompt y last_edit_prompt. Usa el tamaño 16:9 documentado 2752 × 1536, 40 pasos y PNG RGB opacos. La documentación pública de H3 no especifica el tratamiento del canal alfa en esta entrega, por lo que los fotogramas opacos eliminan una variable salvo que hayas validado RGBA por separado.
Registra, como mínimo:
- ID del modelo, versión del framework, prompt inicial y prompt de edición final;
- ambas semillas, ancho, alto, pasos y lista de referencias;
- SHA-256, dimensiones y modo de color de los dos archivos;
- estabilidad de identidad, vestuario, composición, iluminación y fondo;
- si el último fotograma muestra solo el estado final y no toda la secuencia de movimiento.
Qwen también documenta enable_model_cpu_offload() para memoria limitada. Eso demuestra que existe una vía de descarga a CPU; no establece VRAM mínima ni garantiza velocidad para este flujo combinado.
Paso 3: haz que H3 local y alojado lean las mismas entradas
No vuelvas a introducir los parámetros de memoria en dos interfaces. Guarda imágenes, prompt y ajustes de salida en un único manifiesto; una semilla, duración o reescritura distinta puede invalidar toda la comparación.
experiment_id: "qwen-h3-001"
qwen_model: "Qwen/Qwen-Image-2.1"
h3_model: "MiniMaxAI/MiniMax-H3"
h3_variant: "fl2va"
prompt_file: "prompt.txt"
first_frame: "first.png"
last_frame: "last.png"
prompt_sha256: "<sha256>"
first_frame_sha256: "<sha256>"
last_frame_sha256: "<sha256>"
duration_seconds: "<same value>"
aspect_ratio: "<same value>"
local_seed: "<record if exposed>"
hosted_seed: "<record or not_exposed>"
Las ejecuciones local y alojada deben leer este registro. Si la interfaz alojada oculta la semilla, reescribe el prompt o limita la duración, anota not_exposed o conserva el prompt reescrito. No finjas igualdad cuando no puede verificarse: las diferencias solo se interpretan después de controlar las entradas visibles.
Paso 4: haz funcionar primero H3-Base local a 768p
Acepta primero el resultado a 768p y deja el 2K para después. Que los fotogramas de Qwen sean 2K no convierte el vídeo local de H3-Base en 2K.
MiniMax publica dos checkpoints especializados. Aquí se usa MiniMax-H3 Base FL2VA, compatible con generación de audio-vídeo desde texto, primer fotograma, último fotograma o ambos en BF16. Los comandos oficiales de descarga y servicio SGLang son:
hf download MiniMaxAI/MiniMax-H3 \
--include "FL2VA/*" \
--local-dir MiniMax-H3
sglang serve \
--model-path MiniMaxAI/MiniMax-H3 \
--num-gpus 4 \
--ulysses-degree 4 \
--performance-mode speed \
--host 0.0.0.0 \
--port 30010 \
--model-variant fl2va
El segundo comando es el ejemplo de cuatro GPU de MiniMax. No es la configuración publicada del DGX Spark de Wasserman ni un requisito mínimo. Ajústalo únicamente con la documentación del framework y registra cada cambio; no lo presentes como garantía para todas las máquinas.
Haz que SGLang pueda ver ambos fotogramas
FL2VA admite una o dos condiciones de imagen con role: "keyframe". La guía oficial de H3 para SGLang define frame_index: 0 como primer fotograma, frame_index: -1 como último y [0, -1] como el conjunto de ambos extremos. El script reproducible de MiniMax muestra el caso de un solo primer fotograma; la petición siguiente usa los mismos campos con las dos imágenes.
La URI file:// la resuelve el proceso servidor de SGLang, no el terminal que ejecuta curl. Si ambos están en el mismo host, sirven las rutas absolutas obtenidas con realpath. Si SGLang corre en un contenedor o en otra máquina, monta o copia allí los dos archivos y cambia FIRST_URI y LAST_URI por rutas que el servidor pueda leer.
Guarda el contrato del plano en prompt.txt. Para 768p totalmente local puede contener tu propio prompt estructurado. En la ruta 2K híbrida, coloca el resultado de H3-Context-IR en el mismo campo prompt y después envía la salida de H3-Base a H3-Regenerate-2K.
Envía FL2VA, espera la finalización y guarda el MP4
El script sigue el ciclo asíncrono documentado: crea la tarea con POST /v1/videos y lee .id, consulta GET /v1/videos/{id} y solo llama a GET /v1/videos/{id}/content cuando status pasa a completed. El cookbook oficial trata failed como fallo terminal; cualquier otro estado no vacío permanece en el bucle de espera.
set -euo pipefail
BASE_URL="${BASE_URL:-http://127.0.0.1:30010}"
FIRST_URI="${FIRST_URI:-file://$(realpath first.png)}"
LAST_URI="${LAST_URI:-file://$(realpath last.png)}"
PROMPT_FILE="${PROMPT_FILE:-prompt.txt}"
OUTPUT_FILE="${OUTPUT_FILE:-fl2va.mp4}"
payload=$(
jq -n \
--rawfile prompt "$PROMPT_FILE" \
--arg first "$FIRST_URI" \
--arg last "$LAST_URI" \
'{
model: "MiniMaxAI/MiniMax-H3",
task: "fl2va",
prompt: $prompt,
seconds: 8,
conditions: [
{
type: "image",
uri: $first,
role: "keyframe",
frame_index: 0
},
{
type: "image",
uri: $last,
role: "keyframe",
frame_index: -1
}
],
target: {
short_edge: 768,
aspect_ratio: "auto",
duration_seconds: 8
},
seed: 0
}'
)
response=$(
curl --fail-with-body --silent --show-error \
--request POST \
--url "$BASE_URL/v1/videos" \
--header 'Content-Type: application/json' \
--data-binary "$payload"
)
video_id=$(printf '%s\n' "$response" | jq -er '.id')
printf 'video_id=%s\n' "$video_id"
while true; do
task_json=$(
curl --fail-with-body --silent --show-error \
--request GET \
--url "$BASE_URL/v1/videos/$video_id"
)
status=$(printf '%s\n' "$task_json" | jq -er '.status')
printf 'status=%s\n' "$status"
case "$status" in
completed)
break
;;
failed)
printf '%s\n' "$task_json" | jq .
exit 1
;;
*)
sleep 1
;;
esac
done
curl --fail-with-body --silent --show-error --location \
--request GET \
--url "$BASE_URL/v1/videos/$video_id/content" \
--output "$OUTPUT_FILE"
test -s "$OUTPUT_FILE"
if command -v ffprobe >/dev/null 2>&1; then
ffprobe -v error \
-show_entries stream=codec_type,codec_name,r_frame_rate,sample_rate,channels \
-of default=noprint_wrappers=1 \
"$OUTPUT_FILE"
fi
printf 'saved=%s\n' "$OUTPUT_FILE"
curl --fail-with-body se detiene ante una respuesta que no sea 2xx y jq -e falla si faltan .id o .status. Con failed, el script imprime el JSON completo de la tarea y sale con código distinto de cero; para considerar éxito también exige que la descarga funcione y que el MP4 no esté vacío.
Si está instalado ffprobe, el script muestra los flujos multimedia. El contrato documentado de SGLang es un MP4 con vídeo H.264 a 24 FPS y una pista AAC estéreo a 32 kHz. Si la tarea marca completed pero el archivo está vacío, no se decodifica o tiene propiedades inesperadas, no pases a la comparación alojada: revisa primero el log de SGLang, las URI visibles desde el servidor y el JSON enviado.
Los campos y endpoints proceden del script FL2VA reproducible oficial de MiniMax, del cookbook MiniMax-H3 de SGLang y de la guía de la API de vídeo de SGLang. La ruta totalmente local termina aquí con un MP4 H3-Base a 768p; el 2K completo sigue siendo la ruta híbrida descrita antes.
Paso 5: compara con H3 alojado solo cuando la cadena local sea estable
No compares calidad mientras la cadena local siga fallando. De lo contrario, no podrás separar errores de despliegue, diferencias de entrada y comportamiento del modelo. Cambia únicamente el lugar de ejecución:
- Sube los mismos bytes de ambos fotogramas y comprueba sus hashes.
- Reutiliza prompt, duración, relación, idioma e intención de audio.
- Registra si web/API reescribe el prompt, muestra una semilla o usa H3-Context-IR.
- Conserva los originales; no edites, recodifiques ni añadas música antes de comparar.
- Oculta las etiquetas de origen y revisa a ciegas para reducir el sesgo de “local debe ser mejor” o “de pago debe ser mejor”.
Para comparar costes, registra tu factura de API, el tiempo de ocupación de la máquina y el consumo eléctrico. Las etiquetas «local» y «web de pago» no indican por sí solas qué ruta es más barata para tu carga.
Paso 6: elige la mejor ruta para tus planos con una sola tabla
Comprueba primero si el vídeo cumple el encargo creativo y compara después tiempo y hardware. Un resultado de mayor resolución que introduce cortes repetidos puede ser la peor opción de producción.
| Criterio | Cómo revisarlo | Qué registrar |
|---|---|---|
| Fidelidad al primer fotograma | ¿El inicio conserva sujeto, composición y objetos, o los sustituye enseguida? | Desviación y código de tiempo |
| Llegada al último fotograma | ¿Alcanza de forma natural el estado final o salta a la imagen final? | Estado final y calidad de transición |
| Continuidad de plano único | ¿Aparecen cortes, teletransportes, sustituciones de escena o saltos temporales no pedidos? | Tiempo del corte y capturas antes/después |
| Estabilidad de identidad y fondo | ¿Permanecen rostro, ropa, manos, utilería y geometría del fondo? | Elemento afectado y duración |
| Trayectoria | ¿Sujeto y cámara siguen el orden y dirección acordados? | Dirección errónea, cambio de velocidad o bloqueo |
| Audio | Si se pidió, ¿hay pista, está sincronizada y libre de chasquidos o contenido ajeno? | Propiedades, desfase y segmento anómalo |
| Especificación | ¿Duración, relación, FPS y resolución coinciden con la configuración? | Metadatos reales |
| Recursos | Tiempo de pared, pico de memoria del acelerador, RAM y reintentos | Registros brutos de cada ejecución, no estimaciones |
| Repetibilidad | ¿El mismo problema reaparece al repetir la entrada controlada? | Resultados repetidos y parámetros aleatorios visibles |
MiniMax indica que H3 genera estéreo a 32 kHz. Las publicaciones de Wasserman no explican si el audio se activó, conservó o posprocesó. Puedes inspeccionar tu resultado, pero no citar ese caso como validación de calidad sonora.
Corrige la capa anterior en lugar de repetirlo todo
Un primer fotograma incorrecto se corrige en Qwen, un problema de continuidad en H3 y una discrepancia de resolución empieza por comprobar si elegiste 768p local o 2K híbrido. Diagnosticar por capas ahorra tiempo frente a cambiar todos los parámetros a la vez.
| Síntoma | Revisar primero | Acción |
|---|---|---|
| El primer fotograma ya es incorrecto | Etapa Qwen | Corrige prompt, referencias y semilla; no intentes reparar una mala composición dentro de H3 |
| Cambian identidad o fondo al final | Activo de entrega Qwen | Edita desde el primer fotograma, reduce cambios y reutiliza referencias estables |
| Aparece un corte inesperado | Prompt H3 y restricciones | Exige un plano continuo, elimina lenguaje de montaje/varias escenas y repite con los mismos hashes |
| No se alcanza el final | Duración o plan de movimiento | Acorta la cadena de acciones y define inicio–proceso–final |
| Audio ausente o discordante | Variante H3, cliente y contenedor | Confirma checkpoint y ruta de audio-vídeo; marca como no comparables las ejecuciones sin audio equivalente |
| Qwen agota memoria | Despliegue de imagen | Prueba el CPU offload documentado y mide la penalización; no deduzcas una VRAM mínima universal |
| H3 no arranca en el hardware | Despliegue H3 | Sigue la guía del framework; el ejemplo oficial usa cuatro GPU, sin garantía para hardware de consumo |
| Local se queda en 768p y 2K pide API | Límite del flujo | Es la arquitectura documentada, no un fallo; acepta 768p o adopta el 2K híbrido |
| Local y alojado divergen mucho | Entradas y preprocesamiento | Comprueba reescritura del prompt, Context-IR, semilla, duración, relación y recodificación antes de atribuirlo al modelo |
Cómo elegir H3 local o alojado para uso continuo
Decide con tu conjunto de planos, no con la mejor muestra aislada. Incluye cámara estática, acción humana, transformación de objetos, diálogo y ambiente, y conserva éxitos y fallos; separa estas medidas:
- duración del clip, como los aproximadamente ocho segundos del caso público;
- tiempo de generación, desde el envío hasta el archivo terminado, no revelado en ese caso;
- especificaciones del modelo, procedentes del proveedor;
- uso real de hardware, medido en tu sistema y no inferido por el nombre del equipo;
- una valoración visual, válida para esa ejecución pero no convertible directamente en una tasa global de victoria.
Si los archivos no pueden salir de tu equipo, mantén 768p local como opción predeterminada. Si la entrega final debe ser 2K y aceptas API remotas, usa 2K híbrido. Si lo principal es la continuidad, revisa a ciegas H3 local y alojado sobre el mismo conjunto de planos y prioriza la ruta que supere tu tabla con mayor regularidad. El caso público demuestra que la ruta local funciona y evitó un corte en una prueba con la misma entrada; no sustituye tus repeticiones.
Comprueba estos ocho puntos antes de ejecutar
- La ejecución se etiqueta como “768p totalmente local” o “2K híbrido”, sin mezclar términos.
- Modelo Qwen, prompts, semillas, dimensiones y referencias están registrados para ambos fotogramas.
- Imágenes y prompt tienen hash, y ambas ejecuciones H3 consumen las mismas entradas.
- La ejecución local usa
fl2vay se acepta primero como resultado H3-Base 768p. - Reescrituras y parámetros ocultos del servicio alojado se documentan con honestidad.
- Los vídeos originales permanecen sin editar y comparten la misma rúbrica de continuidad, cortes, audio y especificación.
- Tiempo, memoria máxima, reintentos y fallos proceden de registros.
- Las conclusiones se limitan a muestras, hardware y fecha verificados.
Conclusión
La recomendación inicial es clara: crea localmente el primer y último fotograma con Qwen Image 2.1 y valida 768p local con MiniMax H3-Base fl2va. Cambia a H3-Context-IR → H3-Base local → H3-Regenerate-2K solo cuando el 2K sea obligatorio y puedas usar API remotas.
En cualquier ruta, fija fotogramas, prompt, duración y relación de aspecto, y compara continuidad, cortes inesperados, audio, tiempo y uso de hardware con las mismas entradas. Así una demostración vistosa se convierte en un flujo que puedes auditar, comparar y adoptar con criterio.
Referencias
- Repositorio oficial de Qwen Image 2.1
- Anuncio oficial de código abierto de MiniMax H3
- Petición FL2VA reproducible oficial de MiniMax H3
- Cookbook oficial de MiniMax-H3 en SGLang
- Guía de la API de vídeo de SGLang Diffusion
- Ejecución local completa de Sam Wasserman
- Comparación del mismo autor con Web H3 y las mismas entradas
Hechos verificados: 26 de septiembre de 2026.