Buckets:

mishig's picture
|
download
raw
99.8 kB
# # 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 [Wan-2.1](https://huggingface.co/papers/2503.20314) oleh Tim Wan. *Laporan ini menyajikan Wan, sebuah kumpulan model dasar video yang komprehensif dan terbuka, yang dirancang untuk mendorong batas-batas generasi video. Dibangun di atas paradigma difusi transformer arus utama, Wan mencapai kemajuan signifikan dalam kemampuan generatif melalui serangkaian inovasi, termasuk VAE baru kami, strategi pra-pelatihan yang dapat diskalakan, kurasi data berskala besar, dan metrik evaluasi otomatis. Kontribusi-kontribusi ini secara kolektif meningkatkan kinerja dan versatilitas model. Secara spesifik, Wan dicirikan oleh empat fitur utama: Kinerja Unggulan: Model 14B dari Wan, yang dilatih pada dataset besar yang terdiri dari miliaran gambar dan video, mendemonstrasikan hukum penskalaan generasi video terkait baik ukuran data maupun model. Model ini secara konsisten melampaui model sumber terbuka yang ada serta solusi komersial terkini di berbagai benchmark internal dan eksternal, menunjukkan keunggulan kinerja yang jelas dan signifikan. Komprehensivitas: Wan menawarkan dua model yang mumpuni, yaitu 1,3B dan 14B parameter, masing-masing untuk efisiensi dan efektivitas. Model ini juga mencakup berbagai aplikasi turunan, termasuk gambar-ke-video, pengeditan video yang dipandu instruksi, dan generasi video pribadi, yang mencakup hingga delapan tugas. Efisiensi Tingkat Konsumen: Model 1,3B menunjukkan efisiensi sumber daya yang luar biasa, hanya membutuhkan 8,19 GB VRAM, sehingga kompatibel dengan berbagai GPU tingkat konsumen. Keterbukaan: Kami membuka sumber seluruh seri Wan, termasuk kode sumber dan semua model, dengan tujuan mendorong pertumbuhan komunitas generasi video. Keterbukaan ini bertujuan untuk secara signifikan memperluas kemungkinan kreatif produksi video di industri dan menyediakan model dasar video berkualitas tinggi bagi akademisi. Semua kode dan model tersedia di [https URL ini](https://github.com/Wan-Video/Wan2.1).* Anda dapat menemukan semua checkpoint asli Wan2.1 di bawah organisasi [Wan-AI](https://huggingface.co/Wan-AI). Model-model Wan berikut didukung di Diffusers: - [Wan 2.1 T2V 1.3B](https://huggingface.co/Wan-AI/Wan2.1-T2V-1.3B-Diffusers) - [Wan 2.1 T2V 14B](https://huggingface.co/Wan-AI/Wan2.1-T2V-14B-Diffusers) - [Wan 2.1 I2V 14B - 480P](https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-480P-Diffusers) - [Wan 2.1 I2V 14B - 720P](https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-720P-Diffusers) - [Wan 2.1 FLF2V 14B - 720P](https://huggingface.co/Wan-AI/Wan2.1-FLF2V-14B-720P-diffusers) - [Wan 2.1 VACE 1.3B](https://huggingface.co/Wan-AI/Wan2.1-VACE-1.3B-diffusers) - [Wan 2.1 VACE 14B](https://huggingface.co/Wan-AI/Wan2.1-VACE-14B-diffusers) - [Wan 2.2 T2V 14B](https://huggingface.co/Wan-AI/Wan2.2-T2V-A14B-Diffusers) - [Wan 2.2 I2V 14B](https://huggingface.co/Wan-AI/Wan2.2-I2V-A14B-Diffusers) - [Wan 2.2 TI2V 5B](https://huggingface.co/Wan-AI/Wan2.2-TI2V-5B-Diffusers) - [Wan 2.2 Animate 14B](https://huggingface.co/Wan-AI/Wan2.2-Animate-14B-Diffusers) > [!TIP] > Klik pada model Wan di bilah sisi kanan untuk melihat lebih banyak contoh generasi video. ### Generasi Teks-ke-Video Contoh di bawah ini menunjukkan cara menghasilkan video dari teks yang dioptimalkan untuk memori atau kecepatan inferensi. Lihat panduan [Reduce memory usage](../../optimization/memory) untuk detail lebih lanjut tentang berbagai teknik penghematan memori. Model teks-ke-video Wan2.1 di bawah ini membutuhkan sekitar 13GB VRAM. ```py # pip install ftfy import torch import numpy as np from diffusers import AutoModel, WanPipeline from diffusers.quantizers import PipelineQuantizationConfig from diffusers.hooks.group_offloading import apply_group_offloading from diffusers.utils import export_to_video, load_image from transformers import UMT5EncoderModel text_encoder = UMT5EncoderModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="text_encoder", dtype=torch.bfloat16) vae = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="vae", dtype=torch.float32) transformer = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="transformer", dtype=torch.bfloat16) # group-offloading onload_device = torch.device("cuda") offload_device = torch.device("cpu") apply_group_offloading(text_encoder, onload_device=onload_device, offload_device=offload_device, offload_type="block_level", num_blocks_per_group=4 ) transformer.enable_group_offload( onload_device=onload_device, offload_device=offload_device, offload_type="leaf_level", use_stream=True ) pipeline = WanPipeline.from_pretrained( "Wan-AI/Wan2.1-T2V-14B-Diffusers", vae=vae, transformer=transformer, text_encoder=text_encoder, dtype=torch.bfloat16 ) pipeline.to("cuda") # or "mps", "xpu", "cpu" prompt = """ The camera rushes from far to near in a low-angle shot, revealing a white ferret on a log. It plays, leaps into the water, and emerges, as the camera zooms in for a close-up. Water splashes berry bushes nearby, while moss, snow, and leaves blanket the ground. Birch trees and a light blue sky frame the scene, with ferns in the foreground. Side lighting casts dynamic shadows and warm highlights. Medium composition, front view, low angle, with depth of field. """ negative_prompt = """ Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards """ output = pipeline( prompt=prompt, negative_prompt=negative_prompt, num_frames=81, guidance_scale=5.0, ).frames[0] export_to_video(output, "output.mp4", fps=16) ``` [Compilation](../../optimization/fp16#torchcompile) lambat pada pemanggilan pertama, tetapi pemanggilan ke pipeline berikutnya lebih cepat. [Caching](../../optimization/cache) juga dapat mempercepat inferensi dengan menyimpan dan menggunakan kembali output antara. ```py # pip install ftfy import torch import numpy as np from diffusers import AutoModel, WanPipeline from diffusers.hooks.group_offloading import apply_group_offloading from diffusers.utils import export_to_video, load_image from transformers import UMT5EncoderModel text_encoder = UMT5EncoderModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="text_encoder", dtype=torch.bfloat16) vae = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="vae", dtype=torch.float32) transformer = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="transformer", dtype=torch.bfloat16) pipeline = WanPipeline.from_pretrained( "Wan-AI/Wan2.1-T2V-14B-Diffusers", vae=vae, transformer=transformer, text_encoder=text_encoder, dtype=torch.bfloat16 ) pipeline.to("cuda") # or "mps", "xpu", "cpu" # torch.compile pipeline.transformer.to(memory_format=torch.channels_last) pipeline.transformer = torch.compile( pipeline.transformer, mode="max-autotune", fullgraph=True ) prompt = """ The camera rushes from far to near in a low-angle shot, revealing a white ferret on a log. It plays, leaps into the water, and emerges, as the camera zooms in for a close-up. Water splashes berry bushes nearby, while moss, snow, and leaves blanket the ground. Birch trees and a light blue sky frame the scene, with ferns in the foreground. Side lighting casts dynamic shadows and warm highlights. Medium composition, front view, low angle, with depth of field. """ negative_prompt = """ Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards """ output = pipeline( prompt=prompt, negative_prompt=negative_prompt, num_frames=81, guidance_scale=5.0, ).frames[0] export_to_video(output, "output.mp4", fps=16) ``` ### Generasi Video dari Bingkai Pertama dan Terakhir Contoh di bawah ini menunjukkan cara menggunakan pipeline image-to-video untuk menghasilkan video menggunakan deskripsi teks, frame awal, dan frame akhir. ```python import numpy as np import torch import torchvision.transforms.functional as TF from diffusers import AutoencoderKLWan, WanImageToVideoPipeline from diffusers.utils import export_to_video, load_image from transformers import CLIPVisionModel model_id = "Wan-AI/Wan2.1-FLF2V-14B-720P-diffusers" image_encoder = CLIPVisionModel.from_pretrained(model_id, subfolder="image_encoder", dtype=torch.float32) vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32) pipe = WanImageToVideoPipeline.from_pretrained( model_id, vae=vae, image_encoder=image_encoder, dtype=torch.bfloat16 ) pipe.to("cuda") # or "mps", "xpu", "cpu" first_frame = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_first_frame.png") last_frame = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_last_frame.png") def aspect_ratio_resize(image, pipe, max_area=720 * 1280): aspect_ratio = image.height / image.width mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1] height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value image = image.resize((width, height)) return image, height, width def center_crop_resize(image, height, width): # Calculate resize ratio to match first frame dimensions resize_ratio = max(width / image.width, height / image.height) # Resize the image width = round(image.width * resize_ratio) height = round(image.height * resize_ratio) size = [width, height] image = TF.center_crop(image, size) return image, height, width first_frame, height, width = aspect_ratio_resize(first_frame, pipe) if last_frame.size != first_frame.size: last_frame, _, _ = center_crop_resize(last_frame, height, width) prompt = "CG animation style, a small blue bird takes off from the ground, flapping its wings. The bird's feathers are delicate, with a unique pattern on its chest. The background shows a blue sky with white clouds under bright sunshine. The camera follows the bird upward, capturing its flight and the vastness of the sky from a close-up, low-angle perspective." output = pipe( image=first_frame, last_image=last_frame, prompt=prompt, height=height, width=width, guidance_scale=5.5 ).frames[0] export_to_video(output, "output.mp4", fps=16) ``` ### Generasi Kontrollabel Any-to-Video Wan VACE mendukung berbagai teknik generasi yang mencapai pembuatan video yang dapat dikendalikan. Beberapa kemampuannya meliputi: - Kontrol ke Video (Kedalaman, Pose, Sketsa, Aliran, Skala Abu-abu, Coretan, Tata Letak, Kotak Batas, dll.). Perpustakaan yang direkomendasikan untuk prapemrosesan video guna memperoleh video kontrol: [huggingface/controlnet_aux]() - Gambar/Video ke Video (frame pertama, frame terakhir, klip awal, klip akhir, klip acak) - Inpainting dan Outpainting - Subjek ke Video (wajah, objek, karakter, dll.) - Komposisi ke Video (referensikan apa pun, animasikan apa pun, tukar apa pun, perluas apa pun, gerakkan apa pun, dll.) Snippet kode yang tersedia dalam [pull request ini](https://github.com/huggingface/diffusers/pull/11582) menunjukkan beberapa contoh cara video dapat dihasilkan dengan sinyal kontroabilitas. Aturan umum yang perlu diingat saat menyiapkan input untuk pipeline VACE adalah bahwa gambar input, atau frame video yang ingin Anda gunakan untuk kondisioning, harus memiliki mask yang sesuai dengan warna hitam. Mask hitam menandakan bahwa model tidak akan menghasilkan konten baru untuk area tersebut, dan hanya menggunakan bagian-bagian itu untuk mengondisikan proses generasi. Untuk bagian/frame yang harus dihasilkan oleh model, mask harus berwarna putih. ### Wan-Animate: Animasi dan Penggantian Karakter yang Terpadu dengan Replikasi Holistik [Wan-Animate](https://huggingface.co/papers/2509.14055) oleh Tim Wan. *Kami memperkenalkan Wan-Animate, sebuah kerangka kerja terpadu untuk animasi dan penggantian karakter. Diberikan sebuah gambar karakter dan video referensi, Wan-Animate dapat menganimasikan karakter dengan mereplikasi secara presisi ekspresi dan gerakan karakter dalam video tersebut untuk menghasilkan video karakter ber-fidelitas tinggi. Sebagai alternatif, model ini dapat mengintegrasikan karakter yang dianimasikan ke dalam video referensi untuk menggantikan karakter asli, dengan mereplikasi pencahayaan dan nada warna adegan guna mencapai integrasi lingkungan yang mulus. Wan-Animate dibangun di atas model Wan. Untuk menyesuaikannya dengan tugas animasi karakter, kami menerapkan paradigma input yang dimodifikasi untuk membedakan antara kondisi referensi dan wilayah untuk generasi. Desain ini menyatukan berbagai tugas ke dalam representasi simbolik yang umum. Kami menggunakan sinyal kerangka yang selaras secara spasial untuk mereplikasi gerakan tubuh dan fitur wajah implisit yang diekstrak dari gambar sumber untuk menghidupkan kembali ekspresi, sehingga memungkinkan generasi video karakter dengan keterkendalian dan ekspresivitas yang tinggi. Selain itu, untuk meningkatkan integrasi lingkungan selama penggantian karakter, kami mengembangkan Relighting LoRA bantu. Modul ini menjaga konsistensi penampilan karakter sambil menerapkan pencahayaan lingkungan dan nada warna yang sesuai. Hasil eksperimen menunjukkan bahwa Wan-Animate mencapai kinerja state-of-the-art. Kami berkomitmen untuk membuka sumber bobot model dan kode sumbernya.* Halaman proyek: https://humanaigc.github.io/wan-animate Model ini sebagian besar dikontribusikan oleh [M. Tolga Cangöz](https://github.com/tolgacangoz). #### Penggunaan Pipeline Wan-Animate mendukung dua mode operasi: 1. **Mode Animasi** (default): Menganimasikan gambar karakter berdasarkan gerakan dan ekspresi dari video referensi 2. **Mode Penggantian**: Mengganti karakter dalam video latar belakang dengan karakter baru sambil mempertahankan adegan ##### Prasyarat Sebelum menggunakan pipeline, Anda perlu memproses ulang video referensi Anda untuk mengekstrak: - **Video pose**: Mengandung titik-titik kunci kerangka yang mewakili gerakan tubuh - **Video wajah**: Mengandung representasi fitur wajah untuk kontrol ekspresi Untuk mode penggantian, Anda juga membutuhkan: - **Video latar belakang**: Video asli yang berisi adegan - **Mask video**: Mask yang menunjukkan di mana konten akan dihasilkan (putih) vs. dipertahankan aslinya (hitam) > [!NOTE] > Video mentah tidak boleh digunakan untuk input seperti `pose_video`, yang pipeline-nya mengharapkan input tersebut sudah dipreprocess untuk mengekstrak informasi yang tepat. Skrip preproses untuk menyiapkan input ini tersedia di [repo asli Wan-Animate](https://github.com/Wan-Video/Wan2.2?tab=readme-ov-file#1-preprocessing). Integrasi langkah-langkah preproses ini ke dalam Diffusers direncanakan untuk rilis mendatang. Contoh di bawah ini menunjukkan cara menggunakan pipeline Wan-Animate: ```python import numpy as np import torch from diffusers import AutoencoderKLWan, WanAnimatePipeline from diffusers.utils import export_to_video, load_image, load_video model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers" vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32) pipe = WanAnimatePipeline.from_pretrained(model_id, vae=vae, dtype=torch.bfloat16) pipe.to("cuda") # or "mps", "xpu", "cpu" # Load character image and preprocessed videos image = load_image("path/to/character.jpg") pose_video = load_video("path/to/pose_video.mp4") # Preprocessed skeletal keypoints face_video = load_video("path/to/face_video.mp4") # Preprocessed facial features # Resize image to match VAE constraints def aspect_ratio_resize(image, pipe, max_area=720 * 1280): aspect_ratio = image.height / image.width mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1] height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value image = image.resize((width, height)) return image, height, width image, height, width = aspect_ratio_resize(image, pipe) prompt = "A person dancing energetically in a studio with dynamic lighting and professional camera work" negative_prompt = "blurry, low quality, distorted, deformed, static, poorly drawn" # Generate animated video output = pipe( image=image, pose_video=pose_video, face_video=face_video, prompt=prompt, negative_prompt=negative_prompt, height=height, width=width, segment_frame_length=77, guidance_scale=1.0, mode="animate", # Animation mode (default) ).frames[0] export_to_video(output, "animated_character.mp4", fps=30) ``` ```python import numpy as np import torch from diffusers import AutoencoderKLWan, WanAnimatePipeline from diffusers.utils import export_to_video, load_image, load_video model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers" vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32) pipe = WanAnimatePipeline.from_pretrained(model_id, vae=vae, dtype=torch.bfloat16) pipe.to("cuda") # or "mps", "xpu", "cpu" # Load all required inputs for replacement mode image = load_image("path/to/new_character.jpg") pose_video = load_video("path/to/pose_video.mp4") # Preprocessed skeletal keypoints face_video = load_video("path/to/face_video.mp4") # Preprocessed facial features background_video = load_video("path/to/background_video.mp4") # Original scene mask_video = load_video("path/to/mask_video.mp4") # Black: preserve, White: generate # Resize image to match video dimensions def aspect_ratio_resize(image, pipe, max_area=720 * 1280): aspect_ratio = image.height / image.width mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1] height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value image = image.resize((width, height)) return image, height, width image, height, width = aspect_ratio_resize(image, pipe) prompt = "A person seamlessly integrated into the scene with consistent lighting and environment" negative_prompt = "blurry, low quality, inconsistent lighting, floating, disconnected from scene" # Replace character in background video output = pipe( image=image, pose_video=pose_video, face_video=face_video, background_video=background_video, mask_video=mask_video, prompt=prompt, negative_prompt=negative_prompt, height=height, width=width, segment_frame_lengths=77, guidance_scale=1.0, mode="replace", # Replacement mode ).frames[0] export_to_video(output, "character_replaced.mp4", fps=30) ``` ```python import numpy as np import torch from diffusers import AutoencoderKLWan, WanAnimatePipeline from diffusers.utils import export_to_video, load_image, load_video model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers" vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32) pipe = WanAnimatePipeline.from_pretrained(model_id, vae=vae, dtype=torch.bfloat16) pipe.to("cuda") # or "mps", "xpu", "cpu" image = load_image("path/to/character.jpg") pose_video = load_video("path/to/pose_video.mp4") face_video = load_video("path/to/face_video.mp4") def aspect_ratio_resize(image, pipe, max_area=720 * 1280): aspect_ratio = image.height / image.width mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1] height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value image = image.resize((width, height)) return image, height, width image, height, width = aspect_ratio_resize(image, pipe) prompt = "A person dancing energetically in a studio" negative_prompt = "blurry, low quality" # Advanced: Use temporal guidance and custom callback def callback_fn(pipe, step_index, timestep, callback_kwargs): # You can modify latents or other tensors here print(f"Step {step_index}, Timestep {timestep}") return callback_kwargs output = pipe( image=image, pose_video=pose_video, face_video=face_video, prompt=prompt, negative_prompt=negative_prompt, height=height, width=width, segment_frame_length=77, num_inference_steps=50, guidance_scale=5.0, prev_segment_conditioning_frames=5, # Use 5 frames for temporal guidance (1 or 5 recommended) callback_on_step_end=callback_fn, callback_on_step_end_tensor_inputs=["latents"], ).frames[0] export_to_video(output, "animated_advanced.mp4", fps=30) ``` #### Parameter Utama - **mode**: Pilih antara `"animate"` (default) atau `"replace"` - **prev_segment_conditioning_frames**: Jumlah frame untuk panduan temporal (disarankan 1 atau 5). Menggunakan 5 memberikan konsistensi temporal yang lebih baik tetapi membutuhkan lebih banyak memori - **guidance_scale**: Mengontrol seberapa ketat output mengikuti prompt teks. Nilai yang lebih tinggi (5-7) menghasilkan output yang lebih selaras dengan prompt. Untuk Wan-Animate, CFG dinonaktifkan secara default (`guidance_scale=1.0`) tetapi dapat diaktifkan untuk mendukung prompt negatif dan kontrol yang lebih halus terhadap ekspresi wajah. (Perhatikan bahwa CFG hanya akan menargetkan prompt teks dan kondisi wajah.) ## Catatan - Wan2.1 mendukung LoRA dengan [load_lora_weights()](/docs/diffusers/main/id/api/loaders/lora#diffusers.loaders.WanLoraLoaderMixin.load_lora_weights). Tampilkan kode contoh ```py # pip install ftfy import torch from diffusers import AutoModel, WanPipeline from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler from diffusers.utils import export_to_video vae = AutoModel.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", subfolder="vae", dtype=torch.float32 ) pipeline = WanPipeline.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", vae=vae, dtype=torch.bfloat16 ) pipeline.scheduler = UniPCMultistepScheduler.from_config( pipeline.scheduler.config, flow_shift=5.0 ) pipeline.to("cuda") # or "mps", "xpu", "cpu" pipeline.load_lora_weights("benjamin-paine/steamboat-willie-1.3b", adapter_name="steamboat-willie") pipeline.set_adapters("steamboat-willie") pipeline.enable_model_cpu_offload() # use "steamboat willie style" to trigger the LoRA prompt = """ steamboat willie style, golden era animation, The camera rushes from far to near in a low-angle shot, revealing a white ferret on a log. It plays, leaps into the water, and emerges, as the camera zooms in for a close-up. Water splashes berry bushes nearby, while moss, snow, and leaves blanket the ground. Birch trees and a light blue sky frame the scene, with ferns in the foreground. Side lighting casts dynamic shadows and warm highlights. Medium composition, front view, low angle, with depth of field. """ output = pipeline( prompt=prompt, num_frames=81, guidance_scale=5.0, ).frames[0] export_to_video(output, "output.mp4", fps=16) ``` - [WanTransformer3DModel](/docs/diffusers/main/id/api/models/wan_transformer_3d#diffusers.WanTransformer3DModel) dan [AutoencoderKLWan](/docs/diffusers/main/id/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan) mendukung pemuatan dari file tunggal dengan [from_single_file()](/docs/diffusers/main/id/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file). Tampilkan kode contoh ```py # pip install ftfy import torch from diffusers import WanPipeline, WanTransformer3DModel, AutoencoderKLWan vae = AutoencoderKLWan.from_single_file( "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/vae/wan_2.1_vae.safetensors" ) transformer = WanTransformer3DModel.from_single_file( "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/diffusion_models/wan2.1_t2v_1.3B_bf16.safetensors", dtype=torch.bfloat16 ) pipeline = WanPipeline.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", vae=vae, transformer=transformer, dtype=torch.bfloat16 ) ``` - Atur dtype [AutoencoderKLWan](/docs/diffusers/main/id/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan) menjadi `torch.float32` untuk kualitas decoding yang lebih baik. - Jumlah frame per detik (fps) atau `k` harus dihitung dengan `4 * k + 1`. - Coba gunakan nilai `shift` yang lebih rendah (`2.0` hingga `5.0`) untuk video dengan resolusi lebih rendah dan nilai `shift` yang lebih tinggi (`7.0` hingga `12.0`) untuk gambar dengan resolusi lebih tinggi. - Wan 2.1 dan 2.2 mendukung penggunaan [LightX2V LoRAs](https://huggingface.co/Kijai/WanVideo_comfy/tree/main/Lightx2v) untuk mempercepat inferensi. Penggunaannya pada Wan 2.2 sedikit lebih rumit. Lihat [snippet kode ini](https://github.com/huggingface/diffusers/pull/12040#issuecomment-3144185272) untuk mempelajari lebih lanjut. - Wan 2.2 memiliki dua denoiser. Secara default, LoRA hanya dimuat ke denoiser pertama. Anda dapat mengatur `load_into_transformer_2=True` untuk memuat LoRA ke denoiser kedua. Lihat contoh [ini](https://github.com/huggingface/diffusers/pull/12074#issue-3292620048) dan [ini](https://github.com/huggingface/diffusers/pull/12074#issuecomment-3155896144) untuk mempelajari lebih lanjut. ## WanPipeline[[diffusers.WanPipeline]] #### diffusers.WanPipeline[[diffusers.WanPipeline]] ```python diffusers.WanPipeline(tokenizer: AutoTokenizer, text_encoder: UMT5EncoderModel, vae: AutoencoderKLWan, scheduler: FlowMatchEulerDiscreteScheduler, transformer: diffusers.models.transformers.transformer_wan.WanTransformer3DModel | None = None, transformer_2: diffusers.models.transformers.transformer_wan.WanTransformer3DModel | None = None, boundary_ratio: float | None = None, expand_timesteps: bool = False) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan.py#L96) **Parameter:** tokenizer (`T5Tokenizer`) : Tokenizer dari [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5Tokenizer), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). text_encoder (`T5EncoderModel`) : [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5EncoderModel), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). transformer ([WanTransformer3DModel](/docs/diffusers/main/id/api/models/wan_transformer_3d#diffusers.WanTransformer3DModel)) : Transformer bersyarat untuk menghilangkan noise pada latens input. scheduler ([UniPCMultistepScheduler](/docs/diffusers/main/id/api/schedulers/unipc#diffusers.UniPCMultistepScheduler)) : Penjadwal yang digunakan bersama `transformer` untuk menghilangkan noise pada latens gambar yang telah dikodekan. vae ([AutoencoderKLWan](/docs/diffusers/main/id/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan)) : Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan video ke dan dari representasi laten. transformer_2 ([WanTransformer3DModel](/docs/diffusers/main/id/api/models/wan_transformer_3d#diffusers.WanTransformer3DModel), *opsional*) : Transformer bersyarat untuk mendenoise latens input selama tahap berisik rendah. Jika disediakan, memungkinkan denoising dua tahap di mana `transformer` menangani tahap berisik tinggi dan `transformer_2` menangani tahap berisik rendah. Jika tidak disediakan, hanya `transformer` yang digunakan. boundary_ratio (`float`, *opsional*, defaultnya `None`) : Rasio total timestep yang digunakan sebagai batas untuk beralih antar transformer dalam denoising dua tahap. Timestep batas aktual dihitung sebagai `boundary_ratio * num_train_timesteps`. Jika diberikan, `transformer` menangani timestep >= boundary_timestep dan `transformer_2` menangani timestep < boundary_timestep. Jika `None`, hanya `transformer` yang digunakan untuk seluruh proses denoising. Pipeline untuk generasi teks-ke-video menggunakan Wan. Model ini mewarisi dari [DiffusionPipeline](/docs/diffusers/main/id/api/pipelines/overview#diffusers.DiffusionPipeline). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.). #### __call__[[diffusers.WanPipeline.__call__]] ```python __call__(prompt: str | list[str] = None, negative_prompt: str | list[str] = None, height: int = 480, width: int = 832, num_frames: int = 81, num_inference_steps: int = 50, guidance_scale: float = 5.0, guidance_scale_2: float | None = None, num_videos_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, output_type: str | None = 'np', return_dict: bool = True, attention_kwargs: dict[str, typing.Any] | None = None, callback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], max_sequence_length: int = 512) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan.py#L382) **Parameter:** prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt untuk mengarahkan generasi gambar. Jika tidak didefinisikan, gunakan `prompt_embeds` sebagai gantinya. negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang harus dihindari selama pembuatan gambar. Jika tidak didefinisikan, gunakan `negative_prompt_embeds` sebagai gantinya. Diabaikan jika tidak menggunakan guidance (`guidance_scale` < `1`). height (`int`, defaultnya `480`) : Tinggi gambar yang dihasilkan dalam piksel. width (`int`, defaultnya `832`) : Lebar gambar yang dihasilkan dalam piksel. num_frames (`int`, defaultnya `81`) : Jumlah frame dalam video yang dihasilkan. num_inference_steps (`int`, defaultnya `50`) : Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. guidance_scale (`float`, defaultnya `5.0`) : Skala panduan seperti yang didefinisikan dalam [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` didefinisikan sebagai `w` dari persamaan 2. pada [Imagen Paper](https://huggingface.co/papers/2205.11487). Skala panduan diaktifkan dengan mengatur `guidance_scale > 1`. Skala panduan yang lebih tinggi mendorong generasi gambar yang sangat terkait dengan `prompt` teks, biasanya dengan mengorbankan kualitas gambar yang lebih rendah. guidance_scale_2 (`float`, *opsional*, default `None`) : Skala panduan untuk transformer tahap noise rendah (`transformer_2`). Jika `None` dan `boundary_ratio` pipeline bukan None, gunakan nilai yang sama dengan `guidance_scale`. Hanya digunakan ketika `transformer_2` dan `boundary_ratio` pipeline bukan None. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah gambar yang akan dihasilkan per prompt. generator (`torch.Generator` atau `list[torch.Generator]`, *opsional*) : Sebuah [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) untuk membuat proses generasi menjadi deterministik. latents (`torch.Tensor`, *opsional*) : Laten berisik yang telah dibuat sebelumnya, diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor laten akan dibuat dengan pengambilan sampel menggunakan `generator` acak yang diberikan. prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, `negative_prompt_embeds` akan dibuat dari argumen input `negative_prompt`. output_type (`str`, *opsional*, defaultnya `"np"`) : Format output dari gambar yang dihasilkan. Pilih antara `PIL.Image` atau `np.array`. return_dict (`bool`, *opsional*, defaultnya `True`) : Apakah akan mengembalikan `WanPipelineOutput` alih-alih tuple biasa. attention_kwargs (`dict`, *opsional*) : Kamus kwargs yang jika ditentukan akan diteruskan ke `AttentionProcessor` seperti yang didefinisikan di bawah `self.processor` dalam [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). callback_on_step_end (`Callable`, `PipelineCallback`, `MultiPipelineCallbacks`, *opsional*) : Fungsi atau subkelas dari `PipelineCallback` atau `MultiPipelineCallbacks` yang dipanggil di akhir setiap langkah denoising selama inferensi, dengan argumen berikut: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` akan berisi daftar semua tensor sesuai yang ditentukan oleh `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *opsional*) : Daftar input tensor untuk fungsi `callback_on_step_end`. Tensor yang ditentukan dalam daftar akan diteruskan sebagai argumen `callback_kwargs`. Anda hanya dapat menyertakan variabel yang tercantum dalam atribut `._callback_tensor_inputs` dari kelas pipeline Anda. max_sequence_length (`int`, defaultnya `512`) : Panjang maksimum urutan dari text encoder. Jika prompt lebih panjang dari ini, prompt akan dipotong. Jika prompt lebih pendek, prompt akan di-pad hingga panjang ini. **Mengembalikan:** `~WanPipelineOutput` atau `tuple` Jika `return_dict` adalah `True`, `WanPipelineOutput` dikembalikan, selain itu sebuah `tuple` dikembalikan di mana elemen pertama adalah daftar dengan gambar yang dihasilkan dan elemen kedua adalah daftar `bool` yang menunjukkan apakah gambar yang dihasilkan yang sesuai mengandung konten "not-safe-for-work" (nsfw). Fungsi panggilan untuk pipeline pada generasi. Contoh: ```python >>> import torch >>> from diffusers.utils import export_to_video >>> from diffusers import AutoencoderKLWan, WanPipeline >>> from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler >>> # Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers >>> model_id = "Wan-AI/Wan2.1-T2V-14B-Diffusers" >>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32) >>> pipe = WanPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16) >>> flow_shift = 5.0 # 5.0 for 720P, 3.0 for 480P >>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=flow_shift) >>> pipe.to("cuda") >>> prompt = "A cat and a dog baking a cake together in a kitchen. The cat is carefully measuring flour, while the dog is stirring the batter with a wooden spoon. The kitchen is cozy, with sunlight streaming through the window." >>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards" >>> output = pipe( ... prompt=prompt, ... negative_prompt=negative_prompt, ... height=720, ... width=1280, ... num_frames=81, ... guidance_scale=5.0, ... ).frames[0] >>> export_to_video(output, "output.mp4", fps=16) ``` #### encode_prompt[[diffusers.WanPipeline.encode_prompt]] ```python encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, num_videos_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, max_sequence_length: int = 226, device: typing.Optional[torch.device] = None, dtype: typing.Optional[torch.dtype] = None) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan.py#L200) **Parameter:** prompt (`str` atau `list[str]`, *opsional*) : prompt yang akan dienkod negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). do_classifier_free_guidance (`bool`, *opsional*, defaultnya `True`) : Apakah akan menggunakan classifier free guidance atau tidak. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah video yang harus dihasilkan per prompt. perangkat torch untuk menempatkan embedding yang dihasilkan prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input `negative_prompt`. device : (`torch.device`, *opsional*): perangkat torch dtype : (`torch.dtype`, *opsional*): torch dtype Mengkodekan prompt menjadi hidden states dari text encoder. ## WanImageToVideoPipeline[[diffusers.WanImageToVideoPipeline]] #### diffusers.WanImageToVideoPipeline[[diffusers.WanImageToVideoPipeline]] ```python diffusers.WanImageToVideoPipeline(tokenizer: AutoTokenizer, text_encoder: UMT5EncoderModel, vae: AutoencoderKLWan, scheduler: FlowMatchEulerDiscreteScheduler, image_processor: CLIPImageProcessorPil = None, image_encoder: CLIPVisionModel = None, transformer: WanTransformer3DModel = None, transformer_2: WanTransformer3DModel = None, boundary_ratio: float | None = None, expand_timesteps: bool = False) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_i2v.py#L127) **Parameter:** tokenizer (`T5Tokenizer`) : Tokenizer dari [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5Tokenizer), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). text_encoder (`T5EncoderModel`) : [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5EncoderModel), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). image_encoder (`CLIPVisionModel`) : [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPVisionModel), khususnya varian [clip-vit-huge-patch14](https://github.com/mlfoundations/open_clip/blob/main/docs/PRETRAINED.md#vit-h14-xlm-roberta-large). transformer ([WanTransformer3DModel](/docs/diffusers/main/id/api/models/wan_transformer_3d#diffusers.WanTransformer3DModel)) : Transformer bersyarat untuk menghilangkan noise pada latens input. scheduler ([UniPCMultistepScheduler](/docs/diffusers/main/id/api/schedulers/unipc#diffusers.UniPCMultistepScheduler)) : Penjadwal yang digunakan bersama `transformer` untuk menghilangkan noise pada latens gambar yang telah dikodekan. vae ([AutoencoderKLWan](/docs/diffusers/main/id/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan)) : Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan video ke dan dari representasi laten. transformer_2 ([WanTransformer3DModel](/docs/diffusers/main/id/api/models/wan_transformer_3d#diffusers.WanTransformer3DModel), *opsional*) : Transformer bersyarat untuk mendenoise latens input selama tahap berisik rendah. Pada denoising dua tahap, `transformer` menangani tahap berisik tinggi dan `transformer_2` menangani tahap berisik rendah. Jika tidak disediakan, hanya `transformer` yang digunakan. boundary_ratio (`float`, *opsional*, defaultnya `None`) : Rasio total timestep yang digunakan sebagai batas untuk beralih antar transformer dalam denoising dua tahap. Timestep batas aktual dihitung sebagai `boundary_ratio * num_train_timesteps`. Jika diberikan, `transformer` menangani timestep >= boundary_timestep dan `transformer_2` menangani timestep < boundary_timestep. Jika `None`, hanya `transformer` yang digunakan untuk seluruh proses denoising. Pipeline untuk generasi gambar-ke-video menggunakan Wan. Model ini mewarisi dari [DiffusionPipeline](/docs/diffusers/main/id/api/pipelines/overview#diffusers.DiffusionPipeline). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.). #### __call__[[diffusers.WanImageToVideoPipeline.__call__]] ```python __call__(image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]], prompt: str | list[str] = None, negative_prompt: str | list[str] = None, height: int = 480, width: int = 832, num_frames: int = 81, num_inference_steps: int = 50, guidance_scale: float = 5.0, guidance_scale_2: float | None = None, num_videos_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, image_embeds: typing.Optional[torch.Tensor] = None, last_image: typing.Optional[torch.Tensor] = None, output_type: str | None = 'np', return_dict: bool = True, attention_kwargs: dict[str, typing.Any] | None = None, callback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], max_sequence_length: int = 512) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_i2v.py#L510) **Parameter:** image (`PipelineImageInput`) : Gambar input untuk mengondisikan generasi. Harus berupa gambar, daftar gambar, atau `torch.Tensor`. last_image (`torch.Tensor`, *opsional*) : Frame terakhir opsional untuk mengondisikan video yang dihasilkan. Jika diberikan, model akan melakukan interpolasi antara `image` (frame pertama) dan `last_image` (frame terakhir). prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt untuk mengarahkan generasi gambar. Jika tidak didefinisikan, Anda harus melewatkan `prompt_embeds` sebagai gantinya. negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). height (`int`, defaultnya `480`) : Tinggi video yang dihasilkan. width (`int`, defaultnya `832`) : Lebar video yang dihasilkan. num_frames (`int`, defaultnya `81`) : Jumlah frame dalam video yang dihasilkan. num_inference_steps (`int`, defaultnya `50`) : Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. guidance_scale (`float`, defaultnya `5.0`) : Skala panduan seperti yang didefinisikan dalam [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` didefinisikan sebagai `w` dari persamaan 2. pada [Imagen Paper](https://huggingface.co/papers/2205.11487). Skala panduan diaktifkan dengan mengatur `guidance_scale > 1`. Skala panduan yang lebih tinggi mendorong generasi gambar yang sangat terkait dengan `prompt` teks, biasanya dengan mengorbankan kualitas gambar yang lebih rendah. guidance_scale_2 (`float`, *opsional*, default `None`) : Skala panduan untuk transformer tahap noise rendah (`transformer_2`). Jika `None` dan `boundary_ratio` pipeline bukan None, gunakan nilai yang sama dengan `guidance_scale`. Hanya digunakan ketika `transformer_2` dan `boundary_ratio` pipeline bukan None. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah gambar yang akan dihasilkan per prompt. generator (`torch.Generator` atau `list[torch.Generator]`, *opsional*) : Sebuah [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) untuk membuat proses generasi menjadi deterministik. latents (`torch.Tensor`, *opsional*) : Laten berisik yang telah dibuat sebelumnya, diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor laten akan dibuat dengan pengambilan sampel menggunakan `generator` acak yang diberikan. prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `negative_prompt`. image_embeds (`torch.Tensor`, *opsional*) : Embedding gambar yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input gambar (penimbangan). Jika tidak disediakan, embedding gambar akan dihasilkan dari argumen input `image`. output_type (`str`, *opsional*, defaultnya `"np"`) : Format output dari gambar yang dihasilkan. Pilih antara `PIL.Image` atau `np.array`. return_dict (`bool`, *opsional*, defaultnya `True`) : Apakah akan mengembalikan `WanPipelineOutput` alih-alih tuple biasa. attention_kwargs (`dict`, *opsional*) : Kamus kwargs yang jika ditentukan akan diteruskan ke `AttentionProcessor` seperti yang didefinisikan di bawah `self.processor` dalam [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). callback_on_step_end (`Callable`, `PipelineCallback`, `MultiPipelineCallbacks`, *opsional*) : Fungsi atau subkelas dari `PipelineCallback` atau `MultiPipelineCallbacks` yang dipanggil di akhir setiap langkah denoising selama inferensi, dengan argumen berikut: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` akan berisi daftar semua tensor sesuai yang ditentukan oleh `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *opsional*) : Daftar input tensor untuk fungsi `callback_on_step_end`. Tensor yang ditentukan dalam daftar akan diteruskan sebagai argumen `callback_kwargs`. Anda hanya dapat menyertakan variabel yang tercantum dalam atribut `._callback_tensor_inputs` dari kelas pipeline Anda. max_sequence_length (`int`, defaultnya `512`) : Panjang maksimum urutan dari text encoder. Jika prompt lebih panjang dari ini, prompt akan dipotong. Jika prompt lebih pendek, prompt akan di-pad hingga panjang ini. **Mengembalikan:** `~WanPipelineOutput` atau `tuple` Jika `return_dict` adalah `True`, `WanPipelineOutput` dikembalikan, selain itu sebuah `tuple` dikembalikan di mana elemen pertama adalah daftar dengan gambar yang dihasilkan dan elemen kedua adalah daftar `bool` yang menunjukkan apakah gambar yang dihasilkan yang sesuai mengandung konten "not-safe-for-work" (nsfw). Fungsi panggilan untuk pipeline pada generasi. Contoh: ```python >>> import torch >>> import numpy as np >>> from diffusers import AutoencoderKLWan, WanImageToVideoPipeline >>> from diffusers.utils import export_to_video, load_image >>> from transformers import CLIPVisionModel >>> # Available models: Wan-AI/Wan2.1-I2V-14B-480P-Diffusers, Wan-AI/Wan2.1-I2V-14B-720P-Diffusers >>> model_id = "Wan-AI/Wan2.1-I2V-14B-480P-Diffusers" >>> image_encoder = CLIPVisionModel.from_pretrained( ... model_id, subfolder="image_encoder", torch_dtype=torch.float32 ... ) >>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32) >>> pipe = WanImageToVideoPipeline.from_pretrained( ... model_id, vae=vae, image_encoder=image_encoder, torch_dtype=torch.bfloat16 ... ) >>> pipe.to("cuda") >>> image = load_image( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/astronaut.jpg" ... ) >>> max_area = 480 * 832 >>> aspect_ratio = image.height / image.width >>> mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1] >>> height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value >>> width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value >>> image = image.resize((width, height)) >>> prompt = ( ... "An astronaut hatching from an egg, on the surface of the moon, the darkness and depth of space realised in " ... "the background. High quality, ultrarealistic detail and breath-taking movie-like camera shot." ... ) >>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards" >>> output = pipe( ... image=image, ... prompt=prompt, ... negative_prompt=negative_prompt, ... height=height, ... width=width, ... num_frames=81, ... guidance_scale=5.0, ... ).frames[0] >>> export_to_video(output, "output.mp4", fps=16) ``` #### encode_prompt[[diffusers.WanImageToVideoPipeline.encode_prompt]] ```python encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, num_videos_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, max_sequence_length: int = 226, device: typing.Optional[torch.device] = None, dtype: typing.Optional[torch.dtype] = None) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_i2v.py#L254) **Parameter:** prompt (`str` atau `list[str]`, *opsional*) : prompt yang akan dienkod negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). do_classifier_free_guidance (`bool`, *opsional*, defaultnya `True`) : Apakah akan menggunakan classifier free guidance atau tidak. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah video yang harus dihasilkan per prompt. perangkat torch untuk menempatkan embedding yang dihasilkan prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input `negative_prompt`. device : (`torch.device`, *opsional*): perangkat torch dtype : (`torch.dtype`, *opsional*): torch dtype Mengkodekan prompt menjadi hidden states dari text encoder. ## WanVACEPipeline[[diffusers.WanVACEPipeline]] #### diffusers.WanVACEPipeline[[diffusers.WanVACEPipeline]] ```python diffusers.WanVACEPipeline(tokenizer: AutoTokenizer, text_encoder: UMT5EncoderModel, vae: AutoencoderKLWan, scheduler: FlowMatchEulerDiscreteScheduler, transformer: WanVACETransformer3DModel = None, transformer_2: WanVACETransformer3DModel = None, boundary_ratio: float | None = None) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_vace.py#L141) **Parameter:** tokenizer (`T5Tokenizer`) : Tokenizer dari [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5Tokenizer), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). text_encoder (`T5EncoderModel`) : [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5EncoderModel), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). vae ([AutoencoderKLWan](/docs/diffusers/main/id/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan)) : Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan video ke dan dari representasi laten. scheduler ([UniPCMultistepScheduler](/docs/diffusers/main/id/api/schedulers/unipc#diffusers.UniPCMultistepScheduler)) : Penjadwal yang digunakan bersama `transformer` untuk menghilangkan noise pada latens gambar yang telah dikodekan. transformer (`WanVACETransformer3DModel`, *opsional*) : Conditional Transformer untuk mendenoise latens input selama tahap berisik tinggi. Pada denoising dua tahap, `transformer` menangani tahap berisik tinggi dan `transformer_2` menangani tahap berisik rendah. Minimal salah satu dari `transformer` atau `transformer_2` harus disediakan. transformer_2 (`WanVACETransformer3DModel`, *opsional*) : Conditional Transformer untuk mendenoise latens input selama tahap berisik rendah. Pada denoising dua tahap, `transformer` menangani tahap berisik tinggi dan `transformer_2` menangani tahap berisik rendah. Minimal salah satu dari `transformer` atau `transformer_2` harus disediakan. boundary_ratio (`float`, *opsional*, defaultnya `None`) : Rasio total timestep yang digunakan sebagai batas untuk beralih antar transformer dalam denoising dua tahap. Timestep batas aktual dihitung sebagai `boundary_ratio * num_train_timesteps`. Jika diberikan, `transformer` menangani timestep >= boundary_timestep dan `transformer_2` menangani timestep < boundary_timestep. Jika `None`, hanya transformer yang tersedia yang digunakan untuk seluruh proses denoising. Pipeline untuk generasi yang dapat dikendalikan menggunakan Wan. Model ini mewarisi dari [DiffusionPipeline](/docs/diffusers/main/id/api/pipelines/overview#diffusers.DiffusionPipeline). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.). #### __call__[[diffusers.WanVACEPipeline.__call__]] ```python __call__(prompt: str | list[str] = None, negative_prompt: str | list[str] = None, video: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = None, mask: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = None, reference_images: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = None, conditioning_scale: typing.Union[float, list[float], torch.Tensor] = 1.0, height: int = 480, width: int = 832, num_frames: int = 81, num_inference_steps: int = 50, guidance_scale: float = 5.0, guidance_scale_2: float | None = None, num_videos_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, output_type: str | None = 'np', return_dict: bool = True, attention_kwargs: dict[str, typing.Any] | None = None, callback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], max_sequence_length: int = 512) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_vace.py#L690) **Parameter:** prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt untuk mengarahkan generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `prompt_embeds` sebagai gantinya. negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). video (`list[PIL.Image.Image]`, *opsional*) : Video input atau video-video yang akan digunakan sebagai titik awal untuk generasi. Video harus berupa daftar gambar PIL, array numpy, atau tensor torch. Saat ini, pipeline hanya mendukung penggenerasian satu video pada satu waktu. mask (`list[PIL.Image.Image]`, *opsional*) : Mask input mendefinisikan wilayah video mana yang akan dijadikan kondisi dan mana yang akan digenerate. Area hitam pada mask menunjukkan wilayah kondisi, sedangkan area putih menunjukkan wilayah untuk generasi. Mask harus berupa daftar gambar PIL, array numpy, atau tensor torch. Saat ini mendukung penggenerasian satu video pada satu waktu. reference_images (`list[PIL.Image.Image]`, *opsional*) : Daftar satu atau lebih gambar referensi sebagai kondisioning tambahan untuk generasi. Misalnya, jika Anda mencoba melakukan inpainting video untuk mengubah karakter, Anda dapat meneruskan gambar referensi karakter baru di sini. Lihat [contoh](https://github.com/huggingface/diffusers/pull/11582) Diffusers dan [panduan pengguna](https://github.com/ali-vilab/VACE/blob/0897c6d055d7d9ea9e191dce763006664d9780f8/UserGuide.md) asli untuk daftar lengkap tugas dan kasus penggunaan yang didukung. conditioning_scale (`float`, `list[float]`, `torch.Tensor`, defaultnya `1.0`) : Skala kondisioning yang diterapkan saat menambahkan stream laten kondisioning kontrol ke stream laten denoising pada setiap lapisan kontrol model. Jika float diberikan, skala tersebut akan diterapkan secara seragam ke semua lapisan. Jika list atau tensor diberikan, panjangnya harus sama dengan jumlah lapisan kontrol dalam model (`len(transformer.config.vace_layers)`). height (`int`, defaultnya `480`) : Tinggi gambar yang dihasilkan dalam piksel. width (`int`, defaultnya `832`) : Lebar gambar yang dihasilkan dalam piksel. num_frames (`int`, defaultnya `81`) : Jumlah frame dalam video yang dihasilkan. num_inference_steps (`int`, defaultnya `50`) : Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. guidance_scale (`float`, defaultnya `5.0`) : Skala panduan seperti yang didefinisikan dalam [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` didefinisikan sebagai `w` dari persamaan 2. pada [Imagen Paper](https://huggingface.co/papers/2205.11487). Skala panduan diaktifkan dengan mengatur `guidance_scale > 1`. Skala panduan yang lebih tinggi mendorong generasi gambar yang sangat terkait dengan `prompt` teks, biasanya dengan mengorbankan kualitas gambar yang lebih rendah. guidance_scale_2 (`float`, *opsional*, default `None`) : Skala panduan untuk transformer tahap noise rendah (`transformer_2`). Jika `None` dan `boundary_ratio` pipeline bukan None, gunakan nilai yang sama dengan `guidance_scale`. Hanya digunakan ketika `transformer_2` dan `boundary_ratio` pipeline bukan None. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah gambar yang akan dihasilkan per prompt. generator (`torch.Generator` atau `list[torch.Generator]`, *opsional*) : Sebuah [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) untuk membuat proses generasi menjadi deterministik. latents (`torch.Tensor`, *opsional*) : Laten berisik yang telah dibuat sebelumnya, diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor laten akan dibuat dengan pengambilan sampel menggunakan `generator` acak yang diberikan. prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, `negative_prompt_embeds` akan dibuat dari argumen input `negative_prompt`. output_type (`str`, *opsional*, defaultnya `"np"`) : Format output dari gambar yang dihasilkan. Pilih antara `PIL.Image` atau `np.array`. return_dict (`bool`, *opsional*, defaultnya `True`) : Apakah akan mengembalikan `WanPipelineOutput` alih-alih tuple biasa. attention_kwargs (`dict`, *opsional*) : Kamus kwargs yang jika ditentukan akan diteruskan ke `AttentionProcessor` seperti yang didefinisikan di bawah `self.processor` dalam [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). callback_on_step_end (`Callable`, `PipelineCallback`, `MultiPipelineCallbacks`, *opsional*) : Fungsi atau subkelas dari `PipelineCallback` atau `MultiPipelineCallbacks` yang dipanggil di akhir setiap langkah denoising selama inferensi, dengan argumen berikut: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` akan berisi daftar semua tensor sesuai yang ditentukan oleh `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *opsional*) : Daftar input tensor untuk fungsi `callback_on_step_end`. Tensor yang ditentukan dalam daftar akan diteruskan sebagai argumen `callback_kwargs`. Anda hanya dapat menyertakan variabel yang tercantum dalam atribut `._callback_tensor_inputs` dari kelas pipeline Anda. max_sequence_length (`int`, defaultnya `512`) : Panjang maksimum urutan dari text encoder. Jika prompt lebih panjang dari ini, prompt akan dipotong. Jika prompt lebih pendek, prompt akan di-pad hingga panjang ini. **Mengembalikan:** `~WanPipelineOutput` atau `tuple` Jika `return_dict` adalah `True`, `WanPipelineOutput` dikembalikan, selain itu sebuah `tuple` dikembalikan di mana elemen pertama adalah daftar dengan gambar yang dihasilkan dan elemen kedua adalah daftar `bool` yang menunjukkan apakah gambar yang dihasilkan yang sesuai mengandung konten "not-safe-for-work" (nsfw). Fungsi panggilan untuk pipeline pada generasi. Contoh: ```python >>> import torch >>> import PIL.Image >>> from diffusers import AutoencoderKLWan, WanVACEPipeline >>> from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler >>> from diffusers.utils import export_to_video, load_image def prepare_video_and_mask(first_img: PIL.Image.Image, last_img: PIL.Image.Image, height: int, width: int, num_frames: int): first_img = first_img.resize((width, height)) last_img = last_img.resize((width, height)) frames = [] frames.append(first_img) # Ideally, this should be 127.5 to match original code, but they perform computation on numpy arrays # whereas we are passing PIL images. If you choose to pass numpy arrays, you can set it to 127.5 to # match the original code. frames.extend([PIL.Image.new("RGB", (width, height), (128, 128, 128))] * (num_frames - 2)) frames.append(last_img) mask_black = PIL.Image.new("L", (width, height), 0) mask_white = PIL.Image.new("L", (width, height), 255) mask = [mask_black, *[mask_white] * (num_frames - 2), mask_black] return frames, mask >>> # Available checkpoints: Wan-AI/Wan2.1-VACE-1.3B-diffusers, Wan-AI/Wan2.1-VACE-14B-diffusers >>> model_id = "Wan-AI/Wan2.1-VACE-1.3B-diffusers" >>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32) >>> pipe = WanVACEPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16) >>> flow_shift = 3.0 # 5.0 for 720P, 3.0 for 480P >>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=flow_shift) >>> pipe.to("cuda") >>> prompt = "CG animation style, a small blue bird takes off from the ground, flapping its wings. The bird's feathers are delicate, with a unique pattern on its chest. The background shows a blue sky with white clouds under bright sunshine. The camera follows the bird upward, capturing its flight and the vastness of the sky from a close-up, low-angle perspective." >>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards" >>> first_frame = load_image( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_first_frame.png" ... ) >>> last_frame = load_image( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_last_frame.png>>> " ... ) >>> height = 512 >>> width = 512 >>> num_frames = 81 >>> video, mask = prepare_video_and_mask(first_frame, last_frame, height, width, num_frames) >>> output = pipe( ... video=video, ... mask=mask, ... prompt=prompt, ... negative_prompt=negative_prompt, ... height=height, ... width=width, ... num_frames=num_frames, ... num_inference_steps=30, ... guidance_scale=5.0, ... generator=torch.Generator().manual_seed(42), ... ).frames[0] >>> export_to_video(output, "output.mp4", fps=16) ``` #### encode_prompt[[diffusers.WanVACEPipeline.encode_prompt]] ```python encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, num_videos_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, max_sequence_length: int = 226, device: typing.Optional[torch.device] = None, dtype: typing.Optional[torch.dtype] = None) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_vace.py#L247) **Parameter:** prompt (`str` atau `list[str]`, *opsional*) : prompt yang akan dienkod negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). do_classifier_free_guidance (`bool`, *opsional*, defaultnya `True`) : Apakah akan menggunakan classifier free guidance atau tidak. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah video yang harus dihasilkan per prompt. perangkat torch untuk menempatkan embedding yang dihasilkan prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input `negative_prompt`. device : (`torch.device`, *opsional*): perangkat torch dtype : (`torch.dtype`, *opsional*): torch dtype Mengkodekan prompt menjadi hidden states dari text encoder. ## WanVideoToVideoPipeline[[diffusers.WanVideoToVideoPipeline]] #### diffusers.WanVideoToVideoPipeline[[diffusers.WanVideoToVideoPipeline]] ```python diffusers.WanVideoToVideoPipeline(tokenizer: AutoTokenizer, text_encoder: UMT5EncoderModel, transformer: WanTransformer3DModel, vae: AutoencoderKLWan, scheduler: FlowMatchEulerDiscreteScheduler) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_video2video.py#L174) **Parameter:** tokenizer (`T5Tokenizer`) : Tokenizer dari [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5Tokenizer), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). text_encoder (`T5EncoderModel`) : [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5EncoderModel), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). transformer ([WanTransformer3DModel](/docs/diffusers/main/id/api/models/wan_transformer_3d#diffusers.WanTransformer3DModel)) : Transformer bersyarat untuk menghilangkan noise pada latens input. scheduler ([UniPCMultistepScheduler](/docs/diffusers/main/id/api/schedulers/unipc#diffusers.UniPCMultistepScheduler)) : Penjadwal yang digunakan bersama `transformer` untuk menghilangkan noise pada latens gambar yang telah dikodekan. vae ([AutoencoderKLWan](/docs/diffusers/main/id/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan)) : Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan video ke dan dari representasi laten. Pipeline untuk generasi video-ke-video menggunakan Wan. Model ini mewarisi dari [DiffusionPipeline](/docs/diffusers/main/id/api/pipelines/overview#diffusers.DiffusionPipeline). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.). #### __call__[[diffusers.WanVideoToVideoPipeline.__call__]] ```python __call__(video: list[PIL.Image.Image] = None, prompt: str | list[str] = None, negative_prompt: str | list[str] = None, height: int = 480, width: int = 832, num_inference_steps: int = 50, timesteps: list[int] | None = None, guidance_scale: float = 5.0, strength: float = 0.8, num_videos_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, output_type: str | None = 'np', return_dict: bool = True, attention_kwargs: dict[str, typing.Any] | None = None, callback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], max_sequence_length: int = 512) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_video2video.py#L481) **Parameter:** video (`list[PIL.Image.Image]`) : Video input yang digunakan sebagai titik awal untuk generasi video-ke-video. Video harus disediakan sebagai daftar gambar PIL, array numpy, atau tensor torch. prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt untuk mengarahkan generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `prompt_embeds` sebagai gantinya. negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). height (`int`, defaultnya `480`) : Tinggi gambar yang dihasilkan dalam piksel. width (`int`, defaultnya `832`) : Lebar gambar yang dihasilkan dalam piksel. num_inference_steps (`int`, defaultnya `50`) : Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. timesteps (`list[int]`, *opsional*) : Timesteps kustom untuk digunakan dalam proses denoising dengan scheduler yang mendukung argumen `timesteps` di metode `set_timesteps` mereka. Jika tidak didefinisikan, perilaku default saat `num_inference_steps` diteruskan akan digunakan. Harus dalam urutan menurun. guidance_scale (`float`, defaultnya `5.0`) : Skala panduan seperti yang didefinisikan dalam [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` didefinisikan sebagai `w` dari persamaan 2. pada [Imagen Paper](https://huggingface.co/papers/2205.11487). Skala panduan diaktifkan dengan mengatur `guidance_scale > 1`. Skala panduan yang lebih tinggi mendorong generasi gambar yang sangat terkait dengan `prompt` teks, biasanya dengan mengorbankan kualitas gambar yang lebih rendah. strength (`float`, defaultnya `0.8`) : Kekuatan yang lebih tinggi menghasilkan lebih banyak perbedaan antara gambar asli dan video yang dihasilkan. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah gambar yang akan dihasilkan per prompt. generator (`torch.Generator` atau `list[torch.Generator]`, *opsional*) : Sebuah [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) untuk membuat proses generasi menjadi deterministik. latents (`torch.Tensor`, *opsional*) : Laten berisik yang telah dibuat sebelumnya, diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor laten akan dibuat dengan pengambilan sampel menggunakan `generator` acak yang diberikan. prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, `negative_prompt_embeds` akan dibuat dari argumen input `negative_prompt`. output_type (`str`, *opsional*, defaultnya `"np"`) : Format output dari gambar yang dihasilkan. Pilih antara `PIL.Image` atau `np.array`. return_dict (`bool`, *opsional*, defaultnya `True`) : Apakah akan mengembalikan `WanPipelineOutput` alih-alih tuple biasa. attention_kwargs (`dict`, *opsional*) : Kamus kwargs yang jika ditentukan akan diteruskan ke `AttentionProcessor` seperti yang didefinisikan di bawah `self.processor` dalam [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). callback_on_step_end (`Callable`, `PipelineCallback`, `MultiPipelineCallbacks`, *opsional*) : Fungsi atau subkelas dari `PipelineCallback` atau `MultiPipelineCallbacks` yang dipanggil di akhir setiap langkah denoising selama inferensi, dengan argumen berikut: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` akan berisi daftar semua tensor sesuai yang ditentukan oleh `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *opsional*) : Daftar input tensor untuk fungsi `callback_on_step_end`. Tensor yang ditentukan dalam daftar akan diteruskan sebagai argumen `callback_kwargs`. Anda hanya dapat menyertakan variabel yang tercantum dalam atribut `._callback_tensor_inputs` dari kelas pipeline Anda. max_sequence_length (`int`, defaultnya `512`) : Panjang maksimum urutan dari text encoder. Jika prompt lebih panjang dari ini, prompt akan dipotong. Jika prompt lebih pendek, prompt akan di-pad hingga panjang ini. **Mengembalikan:** `~WanPipelineOutput` atau `tuple` Jika `return_dict` adalah `True`, `WanPipelineOutput` dikembalikan, selain itu sebuah `tuple` dikembalikan di mana elemen pertama adalah daftar dengan gambar yang dihasilkan dan elemen kedua adalah daftar `bool` yang menunjukkan apakah gambar yang dihasilkan yang sesuai mengandung konten "not-safe-for-work" (nsfw). Fungsi panggilan untuk pipeline pada generasi. Contoh: ```python >>> import torch >>> from diffusers.utils import export_to_video, load_video >>> from diffusers import AutoencoderKLWan, WanVideoToVideoPipeline >>> from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler >>> # Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers >>> model_id = "Wan-AI/Wan2.1-T2V-1.3B-Diffusers" >>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32) >>> pipe = WanVideoToVideoPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16) >>> flow_shift = 3.0 # 5.0 for 720P, 3.0 for 480P >>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=flow_shift) >>> pipe.to("cuda") >>> prompt = "A robot standing on a mountain top. The sun is setting in the background" >>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards" >>> video = load_video( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/hiker.mp4" ... ) >>> output = pipe( ... video=video, ... prompt=prompt, ... negative_prompt=negative_prompt, ... height=480, ... width=720, ... guidance_scale=5.0, ... strength=0.7, ... ).frames[0] >>> export_to_video(output, "output.mp4", fps=16) ``` #### encode_prompt[[diffusers.WanVideoToVideoPipeline.encode_prompt]] ```python encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, num_videos_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, max_sequence_length: int = 226, device: typing.Optional[torch.device] = None, dtype: typing.Optional[torch.dtype] = None) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_video2video.py#L265) **Parameter:** prompt (`str` atau `list[str]`, *opsional*) : prompt yang akan dienkod negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). do_classifier_free_guidance (`bool`, *opsional*, defaultnya `True`) : Apakah akan menggunakan classifier free guidance atau tidak. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah video yang harus dihasilkan per prompt. perangkat torch untuk menempatkan embedding yang dihasilkan prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input `negative_prompt`. device : (`torch.device`, *opsional*): perangkat torch dtype : (`torch.dtype`, *opsional*): torch dtype Mengkodekan prompt menjadi hidden states dari text encoder. ## WanAnimatePipeline[[diffusers.WanAnimatePipeline]] #### diffusers.WanAnimatePipeline[[diffusers.WanAnimatePipeline]] ```python diffusers.WanAnimatePipeline(tokenizer: AutoTokenizer, text_encoder: UMT5EncoderModel, vae: AutoencoderKLWan, scheduler: UniPCMultistepScheduler, image_processor: CLIPImageProcessorPil, image_encoder: CLIPVisionModel, transformer: WanAnimateTransformer3DModel) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_animate.py#L150) **Parameter:** tokenizer (`T5Tokenizer`) : Tokenizer dari [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5Tokenizer), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). text_encoder (`T5EncoderModel`) : [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5EncoderModel), khususnya varian [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). image_encoder (`CLIPVisionModel`) : [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPVisionModel), khususnya varian [clip-vit-huge-patch14](https://github.com/mlfoundations/open_clip/blob/main/docs/PRETRAINED.md#vit-h14-xlm-roberta-large). transformer ([WanAnimateTransformer3DModel](/docs/diffusers/main/id/api/models/wan_animate_transformer_3d#diffusers.WanAnimateTransformer3DModel)) : Transformer bersyarat untuk mendenoise latens input. scheduler ([UniPCMultistepScheduler](/docs/diffusers/main/id/api/schedulers/unipc#diffusers.UniPCMultistepScheduler)) : Penjadwal yang digunakan bersama `transformer` untuk menghilangkan noise pada latens gambar yang telah dikodekan. vae ([AutoencoderKLWan](/docs/diffusers/main/id/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan)) : Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan video ke dan dari representasi laten. image_processor (`CLIPImageProcessor`) : Pemroses gambar untuk prapemrosesan gambar sebelum pengodean. Pipeline untuk animasi dan penggantian karakter terpadu menggunakan Wan-Animate. WanAnimatePipeline menerima gambar karakter, video pose, dan video wajah sebagai input, lalu menghasilkan video dalam dua mode: 1. **Mode animasi**: Model menghasilkan video dari gambar karakter yang meniru gerakan manusia dalam video pose dan wajah input. Karakter dianimasikan berdasarkan kontrol gerakan yang diberikan, sehingga menciptakan video animasi baru dari karakter tersebut. 2. **Mode penggantian**: Model mengganti karakter dalam video latar belakang dengan gambar karakter yang diberikan, menggunakan video pose dan wajah untuk kontrol gerakan. Mode ini memerlukan input tambahan `background_video` dan `mask_video`. Video mask harus memiliki area hitam di mana konten asli harus dipertahankan dan area putih di mana karakter baru harus dihasilkan. Model ini mewarisi dari [DiffusionPipeline](/docs/diffusers/main/id/api/pipelines/overview#diffusers.DiffusionPipeline). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.). Pipeline juga mewarisi metode pemuatan berikut: - [load_lora_weights()](/docs/diffusers/main/id/api/loaders/lora#diffusers.loaders.WanLoraLoaderMixin.load_lora_weights) untuk memuat bobot LoRA #### __call__[[diffusers.WanAnimatePipeline.__call__]] ```python __call__(image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]], pose_video: list[PIL.Image.Image], face_video: list[PIL.Image.Image], background_video: list[PIL.Image.Image] | None = None, mask_video: list[PIL.Image.Image] | None = None, prompt: str | list[str] = None, negative_prompt: str | list[str] = None, height: int = 720, width: int = 1280, segment_frame_length: int = 77, num_inference_steps: int = 20, mode: str = 'animate', prev_segment_conditioning_frames: int = 1, motion_encode_batch_size: int | None = None, guidance_scale: float = 1.0, num_videos_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, image_embeds: typing.Optional[torch.Tensor] = None, output_type: str | None = 'np', return_dict: bool = True, attention_kwargs: dict[str, typing.Any] | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int, NoneType], diffusers.callbacks.PipelineCallback | diffusers.callbacks.MultiPipelineCallbacks]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], max_sequence_length: int = 512) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_animate.py#L763) **Parameter:** image (`PipelineImageInput`) : Gambar karakter input untuk mengondisikan generasi. Harus berupa gambar, daftar gambar, atau `torch.Tensor`. pose_video (`list[PIL.Image.Image]`) : Video pose input untuk mengondisikan generasi. Harus berupa daftar gambar PIL. face_video (`list[PIL.Image.Image]`) : Video wajah input untuk mengondisikan generasi. Harus berupa daftar gambar PIL. background_video (`list[PIL.Image.Image]`, *opsional*) : Ketika mode adalah `"replace"`, video latar belakang input untuk mengondisikan generasi. Harus berupa daftar gambar PIL. mask_video (`list[PIL.Image.Image]`, *opsional*) : Ketika mode adalah `"replace"`, video mask input untuk mengondisikan generasi. Harus berupa daftar gambar PIL. prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt untuk mengarahkan generasi gambar. Jika tidak didefinisikan, Anda harus melewatkan `prompt_embeds` sebagai gantinya. negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). mode (`str`, defaultnya `"animation"`) : Mode dari generasi. Pilih antara `"animate"` dan `"replace"`. prev_segment_conditioning_frames (`int`, defaultnya `1`) : Jumlah frame dari segmen video sebelumnya yang akan digunakan untuk panduan temporal. Disarankan agar nilainya 1 atau 5. Secara umum, nilainya harus 4N + 1, di mana N adalah bilangan bulat non-negatif. motion_encode_batch_size (`int`, *opsional*) : Ukuran batch untuk pengkodean batch video wajah melalui motion encoder. Hal ini memungkinkan pertukaran antara kecepatan inferensi dan penggunaan memori yang lebih rendah dengan mengatur ukuran batch yang lebih kecil. Akan menggunakan `self.transformer.config.motion_encoder_batch_size` secara default jika tidak diatur. height (`int`, defaultnya `720`) : Tinggi video yang dihasilkan. width (`int`, defaultnya `1280`) : Lebar video yang dihasilkan. segment_frame_length (`int`, defaultnya `77`) : Jumlah frame dalam setiap segmen video yang dihasilkan. Total frame video yang dihasilkan akan sama dengan jumlah frame dalam `pose_video`; kami akan menghasilkan video dalam segmen hingga mencapai panjang ini. Secara umum, seharusnya 4N + 1, di mana N adalah bilangan bulat non-negatif. num_inference_steps (`int`, defaultnya `20`) : Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. guidance_scale (`float`, defaultnya `1.0`) : Skala panduan seperti yang didefinisikan dalam [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` didefinisikan sebagai `w` dari persamaan 2. pada [Imagen Paper](https://huggingface.co/papers/2205.11487). Skala panduan diaktifkan dengan mengatur `guidance_scale > 1`. Skala panduan yang lebih tinggi mendorong generasi gambar yang lebih erat terkait dengan `prompt` teks, biasanya dengan mengorbankan kualitas gambar yang lebih rendah. Secara default, CFG tidak digunakan dalam inferensi Wan Animate. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah gambar yang akan dihasilkan per prompt. generator (`torch.Generator` atau `list[torch.Generator]`, *opsional*) : Sebuah [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) untuk membuat proses generasi menjadi deterministik. latents (`torch.Tensor`, *opsional*) : Laten berisik yang telah dibuat sebelumnya, diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor laten akan dibuat dengan pengambilan sampel menggunakan `generator` acak yang diberikan. prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (pemberian bobot pada prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `negative_prompt`. image_embeds (`torch.Tensor`, *opsional*) : Embedding gambar yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input gambar (penimbangan). Jika tidak disediakan, embedding gambar akan dihasilkan dari argumen input `image`. output_type (`str`, *opsional*, defaultnya `"np"`) : Format output dari gambar yang dihasilkan. Pilih antara `PIL.Image` atau `np.array`. return_dict (`bool`, *opsional*, defaultnya `True`) : Apakah akan mengembalikan `WanPipelineOutput` alih-alih tuple biasa. attention_kwargs (`dict`, *opsional*) : Kamus kwargs yang jika ditentukan akan diteruskan ke `AttentionProcessor` seperti yang didefinisikan di bawah `self.processor` dalam [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). callback_on_step_end (`Callable`, `PipelineCallback`, `MultiPipelineCallbacks`, *opsional*) : Fungsi atau subkelas dari `PipelineCallback` atau `MultiPipelineCallbacks` yang dipanggil di akhir setiap langkah denoising selama inferensi, dengan argumen berikut: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` akan berisi daftar semua tensor sesuai yang ditentukan oleh `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`List`, *opsional*) : Daftar input tensor untuk fungsi `callback_on_step_end`. Tensor yang ditentukan dalam daftar akan diteruskan sebagai argumen `callback_kwargs`. Anda hanya dapat menyertakan variabel yang tercantum dalam atribut `._callback_tensor_inputs` dari kelas pipeline Anda. max_sequence_length (`int`, defaultnya `512`) : Panjang maksimum urutan dari text encoder. Jika prompt lebih panjang dari ini, prompt akan dipotong. Jika prompt lebih pendek, prompt akan di-pad hingga panjang ini. **Mengembalikan:** `~WanPipelineOutput` atau `tuple` Jika `return_dict` adalah `True`, `WanPipelineOutput` dikembalikan, selain itu sebuah `tuple` dikembalikan di mana elemen pertama adalah daftar dengan gambar yang dihasilkan dan elemen kedua adalah daftar `bool` yang menunjukkan apakah gambar yang dihasilkan yang sesuai mengandung konten "not-safe-for-work" (nsfw). Fungsi panggilan untuk pipeline pada generasi. Contoh: ```python >>> import torch >>> import numpy as np >>> from diffusers import WanAnimatePipeline >>> from diffusers.utils import export_to_video, load_image, load_video >>> model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers" >>> pipe = WanAnimatePipeline.from_pretrained(model_id, torch_dtype=torch.bfloat16) >>> # Optionally upcast the Wan VAE to FP32 >>> pipe.vae.to(torch.float32) >>> pipe.to("cuda") >>> # Load the reference character image >>> image = load_image( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/astronaut.jpg" ... ) >>> # Load pose and face videos (preprocessed from reference video) >>> # Note: Videos should be preprocessed to extract pose keypoints and face features >>> # Refer to the Wan-Animate preprocessing documentation for details >>> pose_video = load_video("path/to/pose_video.mp4") >>> face_video = load_video("path/to/face_video.mp4") >>> # CFG is generally not used for Wan Animate >>> prompt = ( ... "An astronaut hatching from an egg, on the surface of the moon, the darkness and depth of space realised in " ... "the background. High quality, ultrarealistic detail and breath-taking movie-like camera shot." ... ) >>> # Animation mode: Animate the character with the motion from pose/face videos >>> output = pipe( ... image=image, ... pose_video=pose_video, ... face_video=face_video, ... prompt=prompt, ... height=height, ... width=width, ... segment_frame_length=77, # Frame length of each inference segment ... guidance_scale=1.0, ... num_inference_steps=20, ... mode="animate", ... ).frames[0] >>> export_to_video(output, "output_animation.mp4", fps=30) >>> # Replacement mode: Replace a character in the background video >>> # Requires additional background_video and mask_video inputs >>> background_video = load_video("path/to/background_video.mp4") >>> mask_video = load_video("path/to/mask_video.mp4") # Black areas preserved, white areas generated >>> output = pipe( ... image=image, ... pose_video=pose_video, ... face_video=face_video, ... background_video=background_video, ... mask_video=mask_video, ... prompt=prompt, ... height=height, ... width=width, ... segment_frame_length=77, # Frame length of each inference segment ... guidance_scale=1.0, ... num_inference_steps=20, ... mode="replace", ... ).frames[0] >>> export_to_video(output, "output_replacement.mp4", fps=30) ``` #### encode_prompt[[diffusers.WanAnimatePipeline.encode_prompt]] ```python encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, num_videos_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, max_sequence_length: int = 226, device: typing.Optional[torch.device] = None, dtype: typing.Optional[torch.dtype] = None) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_animate.py#L291) **Parameter:** prompt (`str` atau `list[str]`, *opsional*) : prompt yang akan dienkod negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` kurang dari `1`). do_classifier_free_guidance (`bool`, *opsional*, defaultnya `True`) : Apakah akan menggunakan classifier free guidance atau tidak. num_videos_per_prompt (`int`, *opsional*, default 1) : Jumlah video yang harus dihasilkan per prompt. perangkat torch untuk menempatkan embedding yang dihasilkan prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`. negative_prompt_embeds (`torch.Tensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input `negative_prompt`. device : (`torch.device`, *opsional*): perangkat torch dtype : (`torch.dtype`, *opsional*): torch dtype Mengkodekan prompt menjadi hidden states dari text encoder. #### pad_video_frames[[diffusers.WanAnimatePipeline.pad_video_frames]] ```python pad_video_frames(frames: list[typing.Any], num_target_frames: int) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_wan_animate.py#L718) Menambahkan padding pada video yang menyerupai array `frames` hingga `num_target_frames` menggunakan strategi serupa "reflect". Dimensi frame diasumsikan sebagai dimensi pertama. Pada kasus 1D, strategi ini dapat divisualisasikan sebagai berikut: pad_video_frames([1, 2, 3, 4, 5], 10) -> [1, 2, 3, 4, 5, 4, 3, 2, 1, 2] ## WanPipelineOutput[[diffusers.pipelines.wan.pipeline_output.WanPipelineOutput]] #### diffusers.pipelines.wan.pipeline_output.WanPipelineOutput[[diffusers.pipelines.wan.pipeline_output.WanPipelineOutput]] ```python diffusers.pipelines.wan.pipeline_output.WanPipelineOutput(frames: Tensor) ``` [Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/wan/pipeline_output.py#L9) **Parameter:** frames (`torch.Tensor`, `np.ndarray`, atau list[list[PIL.Image.Image]]) : daftar output video - Dapat berupa daftar bersarang dengan panjang `batch_size,` di mana setiap sub-daftar berisi urutan gambar PIL yang telah didenoise dengan panjang `num_frames.` Dapat juga berupa array NumPy atau tensor Torch dengan bentuk `(batch_size, num_frames, channels, height, width)`. Kelas output untuk pipeline Wan.
#
# 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
[Wan-2.1](https://huggingface.co/papers/2503.20314) oleh Tim Wan.
*Laporan ini menyajikan Wan, sebuah kumpulan model dasar video yang komprehensif dan terbuka, yang dirancang untuk mendorong batas-batas generasi video. Dibangun di atas paradigma difusi transformer arus utama, Wan mencapai kemajuan signifikan dalam kemampuan generatif melalui serangkaian inovasi, termasuk VAE baru kami, strategi pra-pelatihan yang dapat diskalakan, kurasi data berskala besar, dan metrik evaluasi otomatis. Kontribusi-kontribusi ini secara kolektif meningkatkan kinerja dan versatilitas model. Secara spesifik, Wan dicirikan oleh empat fitur utama: Kinerja Unggulan: Model 14B dari Wan, yang dilatih pada dataset besar yang terdiri dari miliaran gambar dan video, mendemonstrasikan hukum penskalaan generasi video terkait baik ukuran data maupun model. Model ini secara konsisten melampaui model sumber terbuka yang ada serta solusi komersial terkini di berbagai benchmark internal dan eksternal, menunjukkan keunggulan kinerja yang jelas dan signifikan. Komprehensivitas: Wan menawarkan dua model yang mumpuni, yaitu 1,3B dan 14B parameter, masing-masing untuk efisiensi dan efektivitas. Model ini juga mencakup berbagai aplikasi turunan, termasuk gambar-ke-video, pengeditan video yang dipandu instruksi, dan generasi video pribadi, yang mencakup hingga delapan tugas. Efisiensi Tingkat Konsumen: Model 1,3B menunjukkan efisiensi sumber daya yang luar biasa, hanya membutuhkan 8,19 GB VRAM, sehingga kompatibel dengan berbagai GPU tingkat konsumen. Keterbukaan: Kami membuka sumber seluruh seri Wan, termasuk kode sumber dan semua model, dengan tujuan mendorong pertumbuhan komunitas generasi video. Keterbukaan ini bertujuan untuk secara signifikan memperluas kemungkinan kreatif produksi video di industri dan menyediakan model dasar video berkualitas tinggi bagi akademisi. Semua kode dan model tersedia di [https URL ini](https://github.com/Wan-Video/Wan2.1).*
Anda dapat menemukan semua checkpoint asli Wan2.1 di bawah organisasi [Wan-AI](https://huggingface.co/Wan-AI).
Model-model Wan berikut didukung di Diffusers:
- [Wan 2.1 T2V 1.3B](https://huggingface.co/Wan-AI/Wan2.1-T2V-1.3B-Diffusers)
- [Wan 2.1 T2V 14B](https://huggingface.co/Wan-AI/Wan2.1-T2V-14B-Diffusers)
- [Wan 2.1 I2V 14B - 480P](https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-480P-Diffusers)
- [Wan 2.1 I2V 14B - 720P](https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-720P-Diffusers)
- [Wan 2.1 FLF2V 14B - 720P](https://huggingface.co/Wan-AI/Wan2.1-FLF2V-14B-720P-diffusers)
- [Wan 2.1 VACE 1.3B](https://huggingface.co/Wan-AI/Wan2.1-VACE-1.3B-diffusers)
- [Wan 2.1 VACE 14B](https://huggingface.co/Wan-AI/Wan2.1-VACE-14B-diffusers)
- [Wan 2.2 T2V 14B](https://huggingface.co/Wan-AI/Wan2.2-T2V-A14B-Diffusers)
- [Wan 2.2 I2V 14B](https://huggingface.co/Wan-AI/Wan2.2-I2V-A14B-Diffusers)
- [Wan 2.2 TI2V 5B](https://huggingface.co/Wan-AI/Wan2.2-TI2V-5B-Diffusers)
- [Wan 2.2 Animate 14B](https://huggingface.co/Wan-AI/Wan2.2-Animate-14B-Diffusers)
> [!TIP]
> Klik pada model Wan di bilah sisi kanan untuk melihat lebih banyak contoh generasi video.
### Generasi Teks-ke-Video
Contoh di bawah ini menunjukkan cara menghasilkan video dari teks yang dioptimalkan untuk memori atau kecepatan inferensi.
Lihat panduan [Reduce memory usage](../../optimization/memory) untuk detail lebih lanjut tentang berbagai teknik penghematan memori.
Model teks-ke-video Wan2.1 di bawah ini membutuhkan sekitar 13GB VRAM.
```py
# pip install ftfy
import torch
import numpy as np
from diffusers import AutoModel, WanPipeline
from diffusers.quantizers import PipelineQuantizationConfig
from diffusers.hooks.group_offloading import apply_group_offloading
from diffusers.utils import export_to_video, load_image
from transformers import UMT5EncoderModel
text_encoder = UMT5EncoderModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="text_encoder", dtype=torch.bfloat16)
vae = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="vae", dtype=torch.float32)
transformer = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="transformer", dtype=torch.bfloat16)
# group-offloading
onload_device = torch.device("cuda")
offload_device = torch.device("cpu")
apply_group_offloading(text_encoder,
onload_device=onload_device,
offload_device=offload_device,
offload_type="block_level",
num_blocks_per_group=4
)
transformer.enable_group_offload(
onload_device=onload_device,
offload_device=offload_device,
offload_type="leaf_level",
use_stream=True
)
pipeline = WanPipeline.from_pretrained(
"Wan-AI/Wan2.1-T2V-14B-Diffusers",
vae=vae,
transformer=transformer,
text_encoder=text_encoder,
dtype=torch.bfloat16
)
pipeline.to("cuda") # or "mps", "xpu", "cpu"
prompt = """
The camera rushes from far to near in a low-angle shot,
revealing a white ferret on a log. It plays, leaps into the water, and emerges, as the camera zooms in
for a close-up. Water splashes berry bushes nearby, while moss, snow, and leaves blanket the ground.
Birch trees and a light blue sky frame the scene, with ferns in the foreground. Side lighting casts dynamic
shadows and warm highlights. Medium composition, front view, low angle, with depth of field.
"""
negative_prompt = """
Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality,

Xet Storage Details

Size:
99.8 kB
·
Xet hash:
c5eed2822b006cca7f2a4e7efe2b2a926f8c9c75371250db791d289c36b01638

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.