#
# Bajo licencia Apache License, versión 2.0 (la "Licencia");
# no puede usar este archivo excepto en cumplimiento de la Licencia.
# Puede obtener una copia de la Licencia en
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# A menos que la ley aplicable lo exija o se haya acordado por escrito, el software
# distribuido bajo la Licencia se distribuye en una base "TAL CUAL",
# SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sea expresa o implícita.
# Consulte la Licencia para el lenguaje específico que rige los permisos y
# limitaciones de la Licencia. -->

# Wan-Animate-2

[Wan-Animate-2](https://github.com/Wan-Video/Wan2.2) del equipo Alibaba Wan anima una imagen de referencia de un personaje con el movimiento de un video de conducción. El video de conducción se procesa en segmentos de longitud fija: cada segmento ejecuta una pasada de extracción de referencia que almacena en caché los K/V del segmento de conducción en cada capa del transformer, realiza el desruido contra esa caché y se decodifica dentro del bucle porque el siguiente segmento se condiciona a los fotogramas finales decodificados del segmento anterior.

Hay dos presets disponibles: el checkpoint base muestrea con classifier-free guidance, y el checkpoint destilado muestrea en pocos pasos sin él (su guider está fijado en `guidance_scale=1.0`).

```python
import torch
from diffusers import ModularPipeline
from diffusers.utils import export_to_video, load_image, load_video

pipe = ModularPipeline.from_pretrained("Wan-AI/Wan2.2-Animate-2-14B-Diffusers")
pipe.load_components(dtype=torch.bfloat16)

# The transformer weights and the per-segment reference KV cache do not co-reside on one 80 GB
# card at the default resolution, so stream the transformer's blocks. Compiling the blocks is
# required as the in-context attention runs on the flex backend
pipe.transformer.enable_group_offload(
    onload_device=torch.device("cuda"),
    offload_device=torch.device("cpu"),
    offload_type="block_level",
    use_stream=True,
)
pipe.text_encoder.to("cuda")  # or "mps", "xpu", "cpu"
pipe.image_encoder.to("cuda")
pipe.vae.to("cuda")
pipe.transformer.compile_repeated_blocks(fullgraph=False)

# The first demo from the official repository: https://github.com/Wan-Video/Wan-Animate-2
demo = "https://raw.githubusercontent.com/Wan-Video/Wan-Animate-2/main/examples/demo1"
image = load_image(f"{demo}/reference.png")
driving_video, driving_video_fps = load_video(f"{demo}/template.mp4", return_fps=True)
prompt = "人物外观描述：一只银灰色虎斑纹的小猫，拥有圆润的脸庞、竖立的耳朵和巨大的圆形眼睛。它身穿一套深蓝色的制服套装，包括一件带有金色纽扣的西装外套和一条百褶裙。外套里面搭配着白色衬衫，领口处系着一个红色的蝴蝶结，袖口露出白色的衬衫边缘。背景描述：背景为纯白色，光线均匀明亮，无其他杂物或装饰。"

videos = pipe(
    image=image,
    driving_video=driving_video,
    driving_video_fps=driving_video_fps,
    prompt=prompt,
    output="videos",
)
export_to_video(videos[0], "output.mp4", fps=24)
```

Para el checkpoint destilado, carga `Wan-AI/Wan2.2-Animate-2-14B-Distilled-Diffusers` de la misma manera; no cambia nada más. Cada preset incluye sus propios valores predeterminados de muestreo (40 pasos para el checkpoint base y 10 para el destilado), y no existe ningún argumento `guidance_scale` en ninguna parte: la guía la gestiona el componente guider de la pipeline (guía libre de clasificador en 3.0 para el preset base y desactivada para el destilado).

`height` y `width` (valores por defecto 800 y 640) definen el *área* objetivo del video generado; el tamaño real del cuadro mantiene la relación de aspecto de la imagen de referencia, y los cuadros de conducción se ajustan con barras negras (letterbox) a ese tamaño. Las entradas que ya están en el tamaño de letterbox objetivo pasan por la preprocesación sin modificaciones, por lo que la preprocesación también puede realizarse por completo fuera de la pipeline.

## WanAnimate2ModularPipeline[[diffusers.WanAnimate2ModularPipeline]]

#### diffusers.WanAnimate2ModularPipeline[[diffusers.WanAnimate2ModularPipeline]]

```python
diffusers.WanAnimate2ModularPipeline(blocks: diffusers.modular_pipelines.modular_pipeline.ModularPipelineBlocks | None = None, pretrained_model_name_or_path: str | os.PathLike | None = None, components_manager: diffusers.modular_pipelines.components_manager.ComponentsManager | None = None, collection: str | None = None, workflow: str | None = None, modular_config_dict: dict[str, typing.Any] | None = None, config_dict: dict[str, typing.Any] | None = None, **kwargs)
```

[Fuente](https://github.com/huggingface/diffusers/blob/main/src/diffusers/modular_pipelines/wan_animate_2/modular_pipeline.py#L23)

Un ModularPipeline para la animación de personajes de Wan-Animate-2.

## WanAnimate2DistilledModularPipeline[[diffusers.WanAnimate2DistilledModularPipeline]]

#### diffusers.WanAnimate2DistilledModularPipeline[[diffusers.WanAnimate2DistilledModularPipeline]]

```python
diffusers.WanAnimate2DistilledModularPipeline(blocks: diffusers.modular_pipelines.modular_pipeline.ModularPipelineBlocks | None = None, pretrained_model_name_or_path: str | os.PathLike | None = None, components_manager: diffusers.modular_pipelines.components_manager.ComponentsManager | None = None, collection: str | None = None, workflow: str | None = None, modular_config_dict: dict[str, typing.Any] | None = None, config_dict: dict[str, typing.Any] | None = None, **kwargs)
```

[Fuente](https://github.com/huggingface/diffusers/blob/main/src/diffusers/modular_pipelines/wan_animate_2/modular_pipeline.py#L62)

Un ModularPipeline para el modelo Wan-Animate-2 destilado, que muestrea en pocos pasos sin guía libre de clasificador.

## WanAnimate2Blocks[[diffusers.WanAnimate2Blocks]]

#### diffusers.WanAnimate2Blocks[[diffusers.WanAnimate2Blocks]]

```python
diffusers.WanAnimate2Blocks()
```

[Fuente](https://github.com/huggingface/diffusers/blob/main/src/diffusers/modular_pipelines/wan_animate_2/modular_blocks_wan_animate_2.py#L252)

Bloques de pipeline modulares para la animación de personajes de Wan-Animate-2: una imagen de referencia del personaje y un video de conducción producen un video del personaje siguiendo el movimiento de conducción.

Componentes: text_encoder (`UMT5EncoderModel`) tokenizer (`AutoTokenizer`) image_processor (`WanAnimate2VideoProcessor`) image_encoder (`CLIPVisionModel`) video_processor (`WanAnimate2VideoProcessor`) vae (`AutoencoderKLWan`) transformer (`WanAnimate2Transformer3DModel`) scheduler (`SchedulerMixin`) guider (`ClassifierFreeGuidance`)

Entradas: prompt (`str`): El prompt o prompts para guiar la generación de imágenes. negative_prompt (`str`, *opcional*): El prompt o prompts que no deben guiar la generación de imágenes. prompt_ref (`str`, *opcional*, predeterminado a 人物动作的参考视频): El prompt de referencia para el contexto del video de conducción max_sequence_length (`int`, *opcional*, predeterminado a 512): Longitud máxima de secuencia para la codificación del prompt. image (`Image | list`): La imagen de referencia que contiene el personaje a animar. height (`int`, *opcional*, predeterminado a 800): Junto con `width`, el *área* objetivo del video generado; la relación de aspecto proviene de `image`. Se sobrescribe con la altura de cuadro resuelta. width (`int`, *opcional*, predeterminado a 640): Ver `height`. Se sobrescribe con el ancho de cuadro resuelto. driving_video (`list`): El video de conducción que proporciona el movimiento, en cualquier formato aceptado por `VideoProcessor.preprocess_video`. driving_video_fps (`float`, *opcional*): La tasa de cuadros a la que se capturó `driving_video` — `load_video(..., return_fps=True)` la informa. Cuando se establece, los cuadros de conducción se remuestrean desde ella hasta `fps`; cuando es `None`, se usan tal cual. fps (`int`, *opcional*, predeterminado a 24): La tasa de cuadros a la que el modelo genera segment_frame_length (`int`, *opcional*, predeterminado a 81): El número de cuadros en cada segmento de inferencia prev_segment_conditioning_frames (`int`, *opcional*, predeterminado a 1): El número de cuadros de condicionamiento que se llevan del segmento anterior generator (`Generator`, *opcional*): Generador de Torch para generación determinista. num_inference_steps (`int`, *opcional*, predeterminado a 40): El número de pasos de desruido. **denoiser_input_fields (`None`, *opcional*): entradas condicionales del modelo para el desruidor: p. ej. prompt_embeds, negative_prompt_embeds, etc. output_type (`str`, *opcional*, predeterminado a np): El tipo de salida de los videos decodificados

Salidas: videos (`list`): Los videos generados.

## WanAnimate2DistilledBlocks[[diffusers.WanAnimate2DistilledBlocks]]

#### diffusers.WanAnimate2DistilledBlocks[[diffusers.WanAnimate2DistilledBlocks]]

```python
diffusers.WanAnimate2DistilledBlocks()
```

[Fuente](https://github.com/huggingface/diffusers/blob/main/src/diffusers/modular_pipelines/wan_animate_2/modular_blocks_wan_animate_2_distilled.py#L254)

Bloques de pipeline modulares para la animación de personajes de Wan-Animate-2 destilado, con muestreo en pocos pasos y sin guía libre de clasificador.

Componentes: text_encoder (`UMT5EncoderModel`) tokenizer (`AutoTokenizer`) image_processor (`WanAnimate2VideoProcessor`) image_encoder (`CLIPVisionModel`) video_processor (`WanAnimate2VideoProcessor`) vae (`AutoencoderKLWan`) transformer (`WanAnimate2Transformer3DModel`) scheduler (`SchedulerMixin`) guider (`ClassifierFreeGuidance`)

Entradas: prompt (`str`): El prompt o prompts para guiar la generación de imágenes. negative_prompt (`str`, *opcional*): El prompt o prompts que no deben guiar la generación de imágenes. prompt_ref (`str`, *opcional*, predeterminado a 人物动作的参考视频): El prompt de referencia para el contexto del video de conducción max_sequence_length (`int`, *opcional*, predeterminado a 512): Longitud máxima de secuencia para la codificación del prompt. image (`Image | list`): La imagen de referencia que contiene el personaje a animar. height (`int`, *opcional*, predeterminado a 800): Junto con `width`, el *área* objetivo del video generado; la relación de aspecto proviene de `image`. Se sobrescribe con la altura de cuadro resuelta. width (`int`, *opcional*, predeterminado a 640): Ver `height`. Se sobrescribe con el ancho de cuadro resuelto. driving_video (`list`): El video de conducción que proporciona el movimiento, en cualquier formato aceptado por `VideoProcessor.preprocess_video`. driving_video_fps (`float`, *opcional*): La tasa de cuadros a la que se capturó `driving_video` — `load_video(..., return_fps=True)` la informa. Cuando se establece, los cuadros de conducción se remuestrean desde ella hasta `fps`; cuando es `None`, se usan tal cual. fps (`int`, *opcional*, predeterminado a 24): La tasa de cuadros a la que el modelo genera segment_frame_length (`int`, *opcional*, predeterminado a 81): El número de cuadros en cada segmento de inferencia prev_segment_conditioning_frames (`int`, *opcional*, predeterminado a 1): El número de cuadros de condicionamiento que se llevan del segmento anterior generator (`Generator`, *opcional*): Generador de Torch para generación determinista. num_inference_steps (`int`, *opcional*, predeterminado a 10): El número de pasos de desruido. **denoiser_input_fields (`None`, *opcional*): entradas condicionales del modelo para el desruidor: p. ej. prompt_embeds, negative_prompt_embeds, etc. output_type (`str`, *opcional*, predeterminado a np): El tipo de salida de los videos decodificados

Salidas: videos (`list`): Los videos generados.

