#
# Berlisensi di bawah Apache License, Versi 2.0 ("Lisensi");
# Anda mungkin tidak dapat menggunakan file ini kecuali sesuai dengan Lisensi.
# Anda dapat memperoleh salinan Lisensi di
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Kecuali diwajibkan oleh hukum yang berlaku atau disepakati secara tertulis, perangkat lunak
# distribusikan di bawah Lisensi berdasarkan basis "SEBAGAIMANA ADANYA",
# TANPA JAMINAN ATAU SYARAT DALAM BENTUK APAPUN, baik yang dinyatakan maupun yang tersirat.
# Lihat Lisensi untuk bahasa tertentu yang mengatur izin dan
# batasan di bawah Lisensi. -->

# Wan-Animate-2

[Wan-Animate-2](https://github.com/Wan-Video/Wan2.2) dari Alibaba Wan Team menganimasikan gambar karakter referensi dengan gerakan dari video penggerak. Video penggerak diproses dalam segmen berpanjang tetap: setiap segmen menjalankan jalur ekstraksi referensi yang meng-cache K/V segmen penggerak di setiap lapisan transformer, melakukan denoising terhadap cache tersebut, dan didekode di dalam loop karena segmen berikutnya dikondisikan oleh frame ekor terdekode dari segmen sebelumnya.

Dua preset tersedia: checkpoint dasar melakukan sampling dengan classifier-free guidance, dan checkpoint distilled melakukan sampling dalam beberapa langkah tanpa guidance (guider-nya dikunci pada `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)
```

Untuk checkpoint yang telah di-distil, muat `Wan-AI/Wan2.2-Animate-2-14B-Distilled-Diffusers` dengan cara yang sama — tidak ada perubahan lain. Setiap preset membawa nilai default sampling-nya sendiri (40 langkah untuk checkpoint dasar, 10 untuk yang di-distil), dan tidak ada argumen `guidance_scale` di mana pun: guidance dimiliki oleh komponen guider dari pipeline (classifier-free guidance pada 3.0 untuk preset dasar, dinonaktifkan untuk yang di-distil).

`height` dan `width` (default 800 dan 640) mengatur *area* target dari video yang dihasilkan; ukuran frame aktual mempertahankan rasio aspek gambar referensi, dan frame penggerak di-letterbox ke ukuran tersebut. Input yang sudah berada pada ukuran letterbox target akan melewati pra-pemrosesan tanpa perubahan, sehingga pra-pemrosesan juga dapat dilakukan sepenuhnya di luar 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)
```

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

ModularPipeline untuk animasi karakter 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)
```

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

ModularPipeline untuk model Wan-Animate-2 yang telah di-distil, yang melakukan sampling dalam beberapa langkah tanpa classifier-free guidance.

## WanAnimate2Blocks[[diffusers.WanAnimate2Blocks]]

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

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

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

Blok pipeline modular untuk animasi karakter Wan-Animate-2: gambar karakter referensi dan video penggerak menghasilkan video karakter yang mengikuti gerakan penggerak.

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

Input: prompt (`str`): Prompt atau prompt-prompt untuk memandu pembuatan gambar. negative_prompt (`str`, *opsional*): Prompt atau prompt-prompt yang tidak digunakan untuk memandu pembuatan gambar. prompt_ref (`str`, *opsional*, defaultnya 人物动作的参考视频): Prompt referensi untuk konteks video penggerak max_sequence_length (`int`, *opsional*, defaultnya 512): Panjang urutan maksimum untuk enkoding prompt. image (`Image | list`): Gambar referensi yang berisi karakter yang akan dianimasikan. height (`int`, *opsional*, defaultnya 800): Bersama dengan `width`, *area* target dari video yang dihasilkan; rasio aspek berasal dari `image`. Ditimpa dengan tinggi frame yang telah diselesaikan. width (`int`, *opsional*, defaultnya 640): Lihat `height`. Ditimpa dengan lebar frame yang telah diselesaikan. driving_video (`list`): Video penggerak yang menyediakan gerakan, dalam format apa pun yang diterima oleh `VideoProcessor.preprocess_video`. driving_video_fps (`float`, *opsional*): Laju frame `driving_video` saat direkam — `load_video(..., return_fps=True)` melaporkannya. Jika diatur, frame penggerak akan disampel ulang darinya ke `fps`; jika `None`, frame digunakan apa adanya. fps (`int`, *opsional*, defaultnya 24): Laju frame yang dihasilkan oleh model segment_frame_length (`int`, *opsional*, defaultnya 81): Jumlah frame dalam setiap segmen inferensi prev_segment_conditioning_frames (`int`, *opsional*, defaultnya 1): Jumlah frame kondisioning yang dibawa dari segmen sebelumnya generator (`Generator`, *opsional*): `Generator` Torch untuk pembuatan deterministik. num_inference_steps (`int`, *opsional*, defaultnya 40): Jumlah langkah denoising. **denoiser_input_fields (`None`, *opsional*): input model kondisional untuk denoiser: mis. prompt_embeds, negative_prompt_embeds, dll. output_type (`str`, *opsional*, defaultnya np): Jenis output dari video yang didekodekan

Output: video (`list`): Video yang dihasilkan.

## WanAnimate2DistilledBlocks[[diffusers.WanAnimate2DistilledBlocks]]

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

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

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

Blok pipeline modular untuk animasi karakter Wan-Animate-2 yang telah di-distil, dengan sampling dalam beberapa langkah tanpa classifier-free guidance.

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

Input: prompt (`str`): Prompt atau prompt-prompt untuk memandu pembuatan gambar. negative_prompt (`str`, *opsional*): Prompt atau prompt-prompt yang tidak digunakan untuk memandu pembuatan gambar. prompt_ref (`str`, *opsional*, defaultnya 人物动作的参考视频): Prompt referensi untuk konteks video penggerak max_sequence_length (`int`, *opsional*, defaultnya 512): Panjang urutan maksimum untuk enkoding prompt. image (`Image | list`): Gambar referensi yang berisi karakter yang akan dianimasikan. height (`int`, *opsional*, defaultnya 800): Bersama dengan `width`, *area* target dari video yang dihasilkan; rasio aspek berasal dari `image`. Ditimpa dengan tinggi frame yang telah diselesaikan. width (`int`, *opsional*, defaultnya 640): Lihat `height`. Ditimpa dengan lebar frame yang telah diselesaikan. driving_video (`list`): Video penggerak yang menyediakan gerakan, dalam format apa pun yang diterima oleh `VideoProcessor.preprocess_video`. driving_video_fps (`float`, *opsional*): Laju frame `driving_video` saat direkam — `load_video(..., return_fps=True)` melaporkannya. Jika diatur, frame penggerak akan disampel ulang darinya ke `fps`; jika `None`, frame digunakan apa adanya. fps (`int`, *opsional*, defaultnya 24): Laju frame yang dihasilkan oleh model segment_frame_length (`int`, *opsional*, defaultnya 81): Jumlah frame dalam setiap segmen inferensi prev_segment_conditioning_frames (`int`, *opsional*, defaultnya 1): Jumlah frame kondisioning yang dibawa dari segmen sebelumnya generator (`Generator`, *opsional*): `Generator` Torch untuk pembuatan deterministik. num_inference_steps (`int`, *opsional*, defaultnya 10): Jumlah langkah denoising. **denoiser_input_fields (`None`, *opsional*): input model kondisional untuk denoiser: mis. prompt_embeds, negative_prompt_embeds, dll. output_type (`str`, *opsional*, defaultnya np): Jenis output dari video yang didekodekan

Output: video (`list`): Video yang dihasilkan.

