From 0cd06caeb331e67193f578f8805b7f2b3355e189 Mon Sep 17 00:00:00 2001 From: smthemex <138738845+smthemex@users.noreply.github.com> Date: Tue, 11 Feb 2025 10:18:01 +0800 Subject: [PATCH] Update sonic.py --- sonic.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/sonic.py b/sonic.py index 7e81344..a1dca34 100644 --- a/sonic.py +++ b/sonic.py @@ -86,6 +86,38 @@ def crop_face_image(face_image,crop_bbox): return crop_image +def decode_latents_(latents, num_frames,vae, decode_chunk_size=14): + # [batch, frames, channels, height, width] -> [batch*frames, channels, height, width] + latents = latents.flatten(0, 1) + + latents = 1 / 0.18215 * latents + + # forward_vae_fn = self.vae._orig_mod.forward if is_compiled_module(self.vae) else self.vae.forward + # accepts_num_frames = "num_frames" in set(inspect.signature(forward_vae_fn).parameters.keys()) + + # decode decode_chunk_size frames at a time to avoid OOM + frames = [] + for i in range(0, latents.shape[0], decode_chunk_size): + #num_frames_in = latents[i : i + decode_chunk_size].shape[0] + #decode_kwargs = {} + # if accepts_num_frames: + # # we only pass num_frames_in if it's expected + # decode_kwargs["num_frames"] = num_frames_in + + frame = vae.decode(latents[i : i + decode_chunk_size]) + frames.append(frame.cpu()) + frames = torch.cat(frames, dim=0) # [50, 512, 512, 3] + + # [batch*frames, channels, height, width] -> [batch, channels, frames, height, width] + #frames = frames.reshape(-1, num_frames, *frames.shape[1:]).permute(0, 2, 1, 3, 4) + frames=frames.unsqueeze(0).permute(0, 4, 1, 2, 3) + + # we always cast to float32 as this does not cause significant overhead and is compatible with bfloat16 + frames = frames.float() + return frames + + + def test( pipe, config, @@ -97,6 +129,8 @@ def test( batch, image_embeds, fps, + img_latent, + vae, ): ref_img = batch['ref_img'] @@ -119,28 +153,35 @@ def test( max_guidance_scale1=config.max_appearance_guidance_scale, min_guidance_scale2=config.audio_guidance_scale, # 1.0, max_guidance_scale2=config.audio_guidance_scale, + output_type='latent', overlap=config.overlap, shift_offset=config.shift_offset, frames_per_batch=config.n_sample_frames, num_inference_steps=config.num_inference_steps, - i2i_noise_strength=config.i2i_noise_strength + i2i_noise_strength=config.i2i_noise_strength, + img_latent=img_latent, ).frames + + video=decode_latents_(video, len(audio_tensor_list),vae, decode_chunk_size=14) # torch.Size([1, 3, 250, 512, 512]) # Concat it with pose tensor # pose_tensor = torch.stack(pose_tensor_list,1).unsqueeze(0) - video = (video*0.5 + 0.5).clamp(0, 1) - video = torch.cat([video.to(pipe.device)], dim=0).cpu() - #print("video shape:", video.shape)# torch.Size([1, 3, 250, 512, 512]) + # video = (video*0.5 + 0.5).clamp(0, 1) + # video = torch.cat([video.to(pipe.device)], dim=0).cpu() + return video + + + class Sonic(): def __init__(self, device, weight_dtype, - vae, + vae_config, val_noise_scheduler, unet, flownet_ckpt, @@ -162,13 +203,14 @@ class Sonic(): rife.load_model(flownet_ckpt) self.rife = rife - vae.to(weight_dtype) + #vae.to(weight_dtype) unet.to(weight_dtype) pipe = SonicPipeline( unet=unet, - vae=vae, + #vae=vae, scheduler=val_noise_scheduler, + vae_config=vae_config, ) self.pipe = pipe.to(dtype=weight_dtype) self.device = device @@ -183,7 +225,9 @@ class Sonic(): test_data, config, image_embeds, + img_latent, fps, + vae, inference_steps=25, dynamic_scale=1.0, seed=None): @@ -210,6 +254,8 @@ class Sonic(): batch=test_data, image_embeds=image_embeds, fps=fps, + img_latent=img_latent, + vae=vae, ) if self.use_interframe: @@ -227,4 +273,4 @@ class Sonic(): video = torch.stack(results, 2).cpu() return video - \ No newline at end of file +