Update wan_inference_long_pipeline.py

This commit is contained in:
smthemex
2025-08-18 21:32:33 +08:00
committed by GitHub
parent e6b9151021
commit 3bc2c77008
@@ -23,7 +23,7 @@ from einops import rearrange
from PIL import Image
from transformers import AutoTokenizer
from transformers import Wav2Vec2Model, Wav2Vec2Processor
from ...fm_solvers_unipc import FlowUniPCMultistepScheduler
from ..models.vocal_projector_fantasy import split_audio_sequence, split_tensor_with_padding
from ..models.wan_fantasy_transformer3d_1B import WanTransformer3DFantasyModel
from ..models.wan_image_encoder import CLIPModel
@@ -209,7 +209,7 @@ class WanI2VTalkingInferenceLongPipeline(DiffusionPipeline):
vae: AutoencoderKLWan,
transformer: WanTransformer3DFantasyModel,
#clip_image_encoder: CLIPModel,
scheduler: FlowMatchEulerDiscreteScheduler,
scheduler: Union[FlowMatchEulerDiscreteScheduler, FlowUniPCMultistepScheduler],
wav2vec_processor: Wav2Vec2Processor,
wav2vec: Wav2Vec2Model,
):
@@ -650,8 +650,17 @@ class WanI2VTalkingInferenceLongPipeline(DiffusionPipeline):
frames_per_batch = 21
if isinstance(self.scheduler, FlowMatchEulerDiscreteScheduler):
timesteps, num_inference_steps = retrieve_timesteps(self.scheduler, num_inference_steps, device, timesteps, mu=1)
elif isinstance(self.scheduler, FlowUniPCMultistepScheduler):
timesteps, num_inference_steps = retrieve_timesteps(
self.scheduler,
num_inference_steps,
device,
timesteps,
mu=1 if self.scheduler.config.use_dynamic_shifting else None
)
else:
timesteps, num_inference_steps = retrieve_timesteps(self.scheduler, num_inference_steps, device, timesteps)
self._num_timesteps = len(timesteps)
latent_channels = self.vae.config.latent_channels
@@ -720,8 +729,12 @@ class WanI2VTalkingInferenceLongPipeline(DiffusionPipeline):
y = torch.cat([mask_input.to(device), masked_video_latents_input.to(device)], dim=1).to(device, weight_dtype)
#print(y.shape) #torch.Size([3, 20, 31, 64, 64])
extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta)
with self.progress_bar(total=num_inference_steps) as progress_bar:
for i, t in enumerate(timesteps):
if isinstance(self.scheduler, FlowUniPCMultistepScheduler):
self.scheduler.set_timesteps(num_inference_steps, device=device)
if self.interrupt:
continue
@@ -731,15 +744,13 @@ class WanI2VTalkingInferenceLongPipeline(DiffusionPipeline):
overlap_window_length = overlap_window_length # 5 # [5, 7, 10] longer length --> higher quality
index_end = index_start + frames_per_batch # 0+21
index_previous_end = index_end # 0+21
while index_end <= infer_length: #31
self.scheduler._step_index = None
# idx_list = [ii % latents_all.shape[2] for ii in range(index_start, index_end)]
# if index_end == infer_length:
# idx_list_audio = [ii % max_audio_index for ii in range(index_start * 4 * audio_token_per_frame, max_audio_index)]
# else:
# idx_list_audio = [ii % max_audio_index for ii in range(index_start * 4 * audio_token_per_frame, index_start * 4 * audio_token_per_frame + clip_length * audio_token_per_frame)]
while index_end <= infer_length: #31
if hasattr(self.scheduler, '_step_index'):
self.scheduler._step_index = None
idx_list = [ii for ii in range(index_start, min(index_end, infer_length))]
#print(f"idx_list: {idx_list}")
# 修复:正确计算音频索引
@@ -755,6 +766,11 @@ class WanI2VTalkingInferenceLongPipeline(DiffusionPipeline):
## idx_list_audio = [ii % max_audio_index for ii in range(index_start * 4 * audio_token_per_frame, index_end * 4 * audio_token_per_frame)]
latents = latents_all[:, :, idx_list].clone()
if latents.shape[2] < frames_per_batch:
pad_shape = list(latents.shape)
pad_shape[2] = frames_per_batch - latents.shape[2]
pad = torch.zeros(pad_shape, dtype=latents.dtype, device=latents.device)
latents = torch.cat([latents, pad], dim=2)
sub_vocal_input_values = vocal_input_values[idx_list_audio]
sub_vocal_input_values = self.wav2vec_processor(sub_vocal_input_values, sampling_rate=sr, return_tensors="pt").input_values.to(device)
sub_vocal_embeddings = self.wav2vec(sub_vocal_input_values).last_hidden_state
@@ -770,9 +786,6 @@ class WanI2VTalkingInferenceLongPipeline(DiffusionPipeline):
with torch.amp.autocast('cuda', dtype=weight_dtype):
legal_compressed_frames_num = latents.size()[2]
#print(1,latents.shape) #torch.Size([1, 16, 17, 64, 64]) #torch.Size([1, 16, 21, 64, 64])
#print(2,y[:, :, :legal_compressed_frames_num].shape) # 2 torch.Size([3, 20, 17, 64, 64]) torch.Size([3, 20, 21, 64, 64])
#print(3,y.shape) #torch.Size([3, 20, 31, 64, 64])
noise_pred = self.transformer(
x=latent_model_input,
context=prompt_embeds,