Skip to content

stages

Classes

fastvideo.pipelines.basic.magi_human.stages.MagiHumanAudioDecodingStage

MagiHumanAudioDecodingStage(audio_vae, time_stretching: float = _UPSTREAM_AUDIO_TIME_STRETCH)

Bases: PipelineStage

Decode batch.audio_latents to a waveform using Stable Audio's VAE.

The VAE is loaded lazily by SAAudioVAEModel.sa_audio_vae_model — the first call triggers a snapshot_download (requires HF token + accepted terms on stabilityai/stable-audio-open-1.0).

Source code in fastvideo/pipelines/basic/magi_human/stages/audio_decoding.py
def __init__(
    self,
    audio_vae,
    time_stretching: float = _UPSTREAM_AUDIO_TIME_STRETCH,
) -> None:
    super().__init__()
    self.audio_vae = audio_vae
    self.time_stretching = time_stretching

fastvideo.pipelines.basic.magi_human.stages.MagiHumanDenoisingStage

MagiHumanDenoisingStage(transformer, scheduler, patch_size: tuple[int, int, int] = (1, 2, 2), video_in_channels: int = 192, audio_in_channels: int = 64, video_txt_guidance_scale: float = 5.0, audio_txt_guidance_scale: float = 5.0, cfg_number: int = 2, coords_style: str = 'v2', video_guidance_high_t_threshold: int = 500, video_guidance_low_t_value: float = 2.0)

Bases: PipelineStage

UniPC-flow joint denoising with CFG=2 over (video, audio) latents.

Source code in fastvideo/pipelines/basic/magi_human/stages/denoising.py
def __init__(
    self,
    transformer,
    scheduler,
    patch_size: tuple[int, int, int] = (1, 2, 2),
    video_in_channels: int = 192,
    audio_in_channels: int = 64,
    video_txt_guidance_scale: float = 5.0,
    audio_txt_guidance_scale: float = 5.0,
    cfg_number: int = 2,
    coords_style: str = "v2",
    video_guidance_high_t_threshold: int = 500,
    video_guidance_low_t_value: float = 2.0,
) -> None:
    super().__init__()
    self.transformer = transformer
    self.scheduler = scheduler
    self.patch_size = patch_size
    self.video_in_channels = video_in_channels
    self.audio_in_channels = audio_in_channels
    self.video_txt_guidance_scale = video_txt_guidance_scale
    self.audio_txt_guidance_scale = audio_txt_guidance_scale
    self.cfg_number = cfg_number
    self.coords_style = coords_style
    self.video_guidance_high_t_threshold = video_guidance_high_t_threshold
    self.video_guidance_low_t_value = video_guidance_low_t_value

fastvideo.pipelines.basic.magi_human.stages.MagiHumanLatentPreparationStage

MagiHumanLatentPreparationStage(vae_stride: tuple[int, int, int] = (4, 16, 16), z_dim: int = 48, patch_size: tuple[int, int, int] = (1, 2, 2), fps: int = 25, t5_gemma_target_length: int = 640, coords_style: Literal['v1', 'v2'] = 'v2', text_offset: int = 0, audio_in_channels: int = 64)

Bases: PipelineStage

Prepare latents, coords, modality maps, and padded text embed.

Source code in fastvideo/pipelines/basic/magi_human/stages/latent_preparation.py
def __init__(
    self,
    vae_stride: tuple[int, int, int] = (4, 16, 16),
    z_dim: int = 48,
    patch_size: tuple[int, int, int] = (1, 2, 2),
    fps: int = 25,
    t5_gemma_target_length: int = 640,
    coords_style: Literal["v1", "v2"] = "v2",
    text_offset: int = 0,
    audio_in_channels: int = 64,
) -> None:
    super().__init__()
    self.vae_stride = vae_stride
    self.z_dim = z_dim
    self.patch_size = patch_size
    self.fps = fps
    self.t5_gemma_target_length = t5_gemma_target_length
    self.coords_style = coords_style
    self.text_offset = text_offset
    self.audio_in_channels = audio_in_channels

fastvideo.pipelines.basic.magi_human.stages.MagiHumanReferenceImageStage

MagiHumanReferenceImageStage(vae: Any, vae_scale_factor: int = 16)

Bases: PipelineStage

Encode a TI2V reference image into the first-frame video latent.

Source code in fastvideo/pipelines/basic/magi_human/stages/reference_image.py
def __init__(self, vae: Any, vae_scale_factor: int = 16) -> None:
    super().__init__()
    self.vae = vae
    self.video_processor = VideoProcessor(vae_scale_factor=vae_scale_factor)

fastvideo.pipelines.basic.magi_human.stages.MagiHumanSRDenoisingStage

MagiHumanSRDenoisingStage(transformer, scheduler, patch_size: tuple[int, int, int] = (1, 2, 2), video_in_channels: int = 192, audio_in_channels: int = 64, sr_num_inference_steps: int = 5, sr_video_txt_guidance_scale: float = 3.5, use_cfg_trick: bool = True, cfg_trick_start_frame: int = 13, cfg_trick_value: float = 2.0, cfg_number: int = 2, coords_style: str = 'v1')

Bases: PipelineStage

Denoise only the SR video latent; audio passes through unchanged.

Source code in fastvideo/pipelines/basic/magi_human/stages/sr_denoising.py
def __init__(
    self,
    transformer,
    scheduler,
    patch_size: tuple[int, int, int] = (1, 2, 2),
    video_in_channels: int = 192,
    audio_in_channels: int = 64,
    sr_num_inference_steps: int = 5,
    sr_video_txt_guidance_scale: float = 3.5,
    use_cfg_trick: bool = True,
    cfg_trick_start_frame: int = 13,
    cfg_trick_value: float = 2.0,
    cfg_number: int = 2,
    coords_style: str = "v1",
) -> None:
    super().__init__()
    self.transformer = transformer
    self.scheduler = scheduler
    self.patch_size = patch_size
    self.video_in_channels = video_in_channels
    self.audio_in_channels = audio_in_channels
    self.sr_num_inference_steps = sr_num_inference_steps
    self.sr_video_txt_guidance_scale = sr_video_txt_guidance_scale
    self.use_cfg_trick = use_cfg_trick
    self.cfg_trick_start_frame = cfg_trick_start_frame
    self.cfg_trick_value = cfg_trick_value
    self.cfg_number = cfg_number
    self.coords_style = coords_style

fastvideo.pipelines.basic.magi_human.stages.MagiHumanSRLatentPreparationStage

MagiHumanSRLatentPreparationStage(vae: Any, vae_stride: tuple[int, int, int] = (4, 16, 16), patch_size: tuple[int, int, int] = (1, 2, 2), noise_value: int = 220, sr_audio_noise_scale: float = 0.7, sr_height: int = 512, sr_width: int = 896, vae_scale_factor: int = 16)

Bases: PipelineStage

Upsample base latents, add SR noise, and refresh SR conditioning.

Source code in fastvideo/pipelines/basic/magi_human/stages/sr_latent_preparation.py
def __init__(
    self,
    vae: Any,
    vae_stride: tuple[int, int, int] = (4, 16, 16),
    patch_size: tuple[int, int, int] = (1, 2, 2),
    noise_value: int = 220,
    sr_audio_noise_scale: float = 0.7,
    sr_height: int = 512,
    sr_width: int = 896,
    vae_scale_factor: int = 16,
) -> None:
    super().__init__()
    self.vae = vae
    self.vae_stride = vae_stride
    self.patch_size = patch_size
    self.noise_value = noise_value
    self.sr_audio_noise_scale = sr_audio_noise_scale
    self.sr_height = sr_height
    self.sr_width = sr_width
    self.sigmas = ZeroSNRDDPMDiscretization()(1000, do_append_zero=False, flip=True)
    self.video_processor = VideoProcessor(vae_scale_factor=vae_scale_factor)