Nodes/Sonder Editor/Sonder Masks Bridge
ComfyUI Node

Sonder Masks Bridge

Freeze the audio while you edit the video (or vice versa)

By SonderSaid·Created 2 months ago·Updated 6 days ago· 2
Sonder Masks Bridge
  • project
  • video_latent
  • audio_latent
  • video_vae
  • audio_vae
  • video_mask_start_time
  • video_mask_end_time
  • audio_mask_start_time
  • audio_mask_end_time
  • video_mask
  • audio_mask
edit_videotrue
edit_audiotrue

Sonder Masks Bridge is how you tell a temporal inpainting workflow what it's allowed to regenerate in a Sonder Editor project. The editor already computes a generation-mask window - the frames your selection actually touches, distinct from the protected context frames around it. This node reads that window and hands it to your downstream temporal mask node as start/end times, split into separate video and audio channels. Two toggles, four numbers out, and suddenly "regenerate the video but keep the audio locked" is a switch instead of a surgery.

The Edit/Freeze design is the whole personality of this node. Each channel (video, audio) has its own toggle:

  • Edit - the channel generates over the mask window; you get the editor's real start/end times.
  • Freeze - the channel emits a zero-width window (start == end), so the mask covers nothing and nothing gets generated for it.

That's the audio-fixed-while-video-drives workflow in a single boolean. You keep your existing audio, regenerate only the picture, and the mask node downstream sees an empty audio window and leaves the audio untouched. Flip the toggles and it works the other way too.

How it works

Inputs are project (from a Sonder Editor's project output, so it sees the same execution window) plus the two booleans edit_video and edit_audio. Outputs are the four mask times in seconds:

  • video_mask_start_time / video_mask_end_time
  • audio_mask_start_time / audio_mask_end_time

When a channel is frozen, both its start and end collapse to the same value (zero width). The node requires a project that has actually executed through a Sonder Editor - the mask window is a property of a render, not of a raw project file.

Install and the trap to avoid

Standard pack install: ComfyUI Manager search Sonder Editor, or git clone https://github.com/SonderSaid/ComfyUI-Sonder-Editor.git + pip install -r requirements.txt + restart.

The thing that catches people: the mask times are seconds offsets within the output, not timeline frame numbers. If you're feeding these into a temporal mask node, make sure it expects the same convention - mixing a seconds-based mask with a frames-based one is a silent off-by-whatever that makes your "protected" frames get regenerated anyway. And remember this node only exposes the mask window: the actual protected context frames come from the editor's pre_context_frames/post_context_frames settings. The bridge is the window's messenger, not its author.

For anyone chaining long-form video scenes, this is the node that turns "keep audio while I redo the visuals" from a manual workflow rebuild into a per-run toggle. It's small, it's boring, and it saves exactly the kind of repeated fiddling that makes people give up on iteration.

CategorySonder

Inputs (7)

NameTypeDefaultDescription
projectSONDER_PROJECTWire from the Sonder Editor project output so the bridge sees the same execution window.
edit_videoBOOLEANtrueEdit: video generates over the mask window. Freeze: zero-width window keeps video from source.
edit_audioBOOLEANtrueEdit: audio generates over the mask window. Freeze: zero-width window keeps audio from source.
video_latentoptLATENTOptional. Separate AV Latent > video_latent. Sizes video_mask and is checked against this render window. Needs video_vae wired too.
audio_latentoptLATENTOptional. Separate AV Latent > audio_latent. Shapes audio_mask and identifies its time axis. Needs audio_vae wired too.
video_vaeoptVAEOptional. The VAE that encoded the video latent — supplies the exact pixel-frame to latent-frame map.
audio_vaeoptVAEOptional. The VAE that encoded the audio latent — supplies its latent rate (LTX 25/s, MiniMax H3 40/s).

Outputs (6)

NameTypeDescription
video_mask_start_timeFLOATVideo generation-mask start time (seconds). Equals the editor's mask start when Edit Video is on; equals the end (zero width) when frozen.
video_mask_end_timeFLOATVideo generation-mask end time (seconds). Collapses to the start time when Edit Video is off, freezing the video channel.
audio_mask_start_timeFLOATAudio generation-mask start time (seconds). Equals the editor's mask start when Edit Audio is on; equals the end (zero width) when frozen.
audio_mask_end_timeFLOATAudio generation-mask end time (seconds). Collapses to the start time when Edit Audio is off, freezing the audio channel.
video_maskMASKHard 0/1 noise mask for the VIDEO latent — one mask per latent frame (1 = generate, 0 = keep). Feed Set Latent Noise Mask on the video latent. Not interchangeable with audio_mask. All-zeros when the video latent and VAE are not both wired, or when Edit Video is off. On LTX, a graph that also uses guides or a start image should drive LTXVAudioVideoMask from the time outputs above instead of feeding this mask to Set Latent Noise Mask — see docs/generating.md. A mask also replaces rather than composes, so it overwrites any pin a start-image or continuation node set upstream.
audio_maskMASKHard 0/1 noise mask for the AUDIO latent — a SINGLE mask image shaped to the audio latent's last two axes, not a batch (1 = generate, 0 = keep). Feed Set Latent Noise Mask on the audio latent. Not interchangeable with video_mask. All-zeros when the audio latent and VAE are not both wired, or when Edit Audio is off. Like the video mask it replaces rather than composes, so it overwrites any noise mask set upstream.