Latent Noise
Seeded Perturbation for Latents That Know Their Own Scale
- latent
- mask
- latent
If you've ever wanted to "add a little randomness" to a latent and ended up with a smear, the problem wasn't the idea - it was that you had no control over how much noise you were actually adding. Latent Noise from Skoogeer-Noise fixes that by expressing strength relative to the latent's own standard deviation. A strength of 1.0 adds noise with roughly the same standard deviation as the latent you fed it, so the same setting behaves consistently across different latents, different models, even different resolutions. That's the whole appeal: predictable, seeded perturbation in latent space.
It's the latent-space sibling of the pack's Image Noise node, and it lives in the latent/perturb menu. Use it when you want to nudge a latent before it reaches a sampler - mild latent-space img2img-style edits, breaking up latent symmetries before sampling, or testing how much latent perturbation a seed can absorb before the composition shifts. Because it operates on latent["samples"] and copies the latent dict through, other keys like noise_mask survive intact.
How it works
The mechanism is the same seeded-Gaussian approach as the image variant, just at latent scale: noise is drawn with a CPU-seeded generator, scaled per-sample by the latent's standard deviation times strength, and added. Batch items each get a deterministic seed offset, so a batch of 4 and a batch of 1 produce identical results for the same index - a detail that quietly saves you from "why does batch size change my output" confusion. An optional mask is resized to latent resolution (bicubic when downscaling) and limits the noise to masked regions.
The inputs that matter
latent- the latent dict (B, C, H, W samples).seed- the reproducibility knob; same seed, same noise.strength- relative to the latent's std.0.1–0.3is gentle;1.0is aggressive.mask(optional) - localizes the effect.
Output is one latent (LATENT), ready to wire into a sampler, another latent op, or a VAE decode.
Installing it
Part of the Skoogeer-Noise pack. ComfyUI Manager → search "Skoogeer-Noise", or:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
Restart ComfyUI. Dependencies (torch, numpy>=1.26, einops, pyyaml>=6.0.3) are all things ComfyUI ships with, and there are no model downloads. Painless.
Common gotchas
Two real ones. First, if you're on Flux.2, the latents are patchified (128 channels at 1/16 resolution, 2x2 blocks) and this node operates on spatial neighborhoods - apply it directly and you get 2x2 block artifacts. Wrap it: Unpatchify Flux.2 Latent → Latent Noise → Patchify Flux.2 Latent. Second, this node and the pack's "Add Latent Noise (Seeded)" (LatentAddNoise) are the same operation under two menu paths - Skoogeer-Noise merged code from two older repos (FlowMatching-Upscaler and QwenRectifiedFlowInverter) and kept both. Pick one and stick with it; they don't differ in behavior you'd notice. And remember strength is relative to the input's std, not an absolute knob - that's a feature, but it means "how much" depends on the latent you give it.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | Latent to receive additional Gaussian noise. | |
| seed | INT | 00–18446744073709550000 | Seed for generating repeatable noise. |
| strength | FLOAT | 1.000–10 | Noise strength relative to the latent's standard deviation. |
| maskopt | MASK | Optional mask (often image-sized) to limit the noise addition to masked areas. The mask is resized to latent resolution (bicubic when downscaling). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |