Skip to content
ComfyUI Wiki
Помогите создать лучшую базу знаний ComfyUI Стать спонсором

ComfyUI WanFunControlToVideo Node

ComfyUI WanFunControlToVideo Node

Этот узел был добавлен для поддержки модели Alibaba Wan Fun Control для генерации видео и был добавлен после этого коммита.

  • Назначение: Подготовка информации кондиционирования, необходимой для генерации видео, используя модель Wan 2.1 Fun Control.

Узел WanFunControlToVideo - это дополнение ComfyUI, разработанное для поддержки моделей Wan Fun Control для генерации видео, направленное на использование WanFun control для создания видео.

Этот узел служит точкой подготовки важной информации кондиционирования и инициализирует центральную точку латентного пространства, направляя последующий процесс генерации видео с использованием модели Wan 2.1 Fun. Название узла четко указывает его функцию: он принимает различные входы и преобразует их в формат, подходящий для управления генерацией видео в рамках WanFun.

Позиция узла в иерархии узлов ComfyUI указывает на то, что он работает на ранних этапах конвейера генерации видео, сосредотачиваясь на манипуляции сигналами кондиционирования до фактической выборки или декодирования видеокадров.

Детальный анализ узла WanFunControlToVideo

Входные параметры

Имя параметраОбязательныйТип данныхОписаниеЗначение по умолчанию
positiveДаCONDITIONINGСтандартные данные положительного кондиционирования ComfyUI, обычно от узла “CLIP Text Encode”. Положительный промпт описывает содержание, предмет и художественный стиль, которые пользователь представляет для сгенерированного видео.Н/Д
negativeДаCONDITIONINGСтандартные данные отрицательного кондиционирования ComfyUI, обычно генерируемые узлом “CLIP Text Encode”. Отрицательный промпт указывает элементы, стили или артефакты, которых пользователь хочет избежать в сгенерированном видео.Н/Д
vaeДаVAEТребует модель VAE (Вариационный Автоэнкодер), совместимую с семейством моделей Wan 2.1 Fun, используемую для кодирования и декодирования данных изображения/видео.Н/Д
widthДаINTЖелаемая ширина выходных видеокадров в пикселях, со значением по умолчанию 832, минимальным значением 16, максимальным значением, определяемым nodes.MAX_RESOLUTION, и размером шага 16.832
heightДаINTЖелаемая высота выходных видеокадров в пикселях, со значением по умолчанию 480, минимальным значением 16, максимальным значением, определяемым nodes.MAX_RESOLUTION, и размером шага 16.480
lengthДаINTОбщее количество кадров в сгенерированном видео, со значением по умолчанию 81, минимальным значением 1, максимальным значением, определяемым nodes.MAX_RESOLUTION, и размером шага 4.81
batch_sizeДаINTКоличество видео, генерируемых в одной партии, со значением по умолчанию 1, минимальным значением 1 и максимальным значением 4096.1
clip_vision_outputНетCLIP_VISION_OUTPUT(Опционально) Визуальные признаки, извлеченные моделью CLIP vision, позволяющие визуальное руководство стилем и содержанием.Нет
start_imageНетIMAGE(Опционально) Начальное изображение, которое влияет на начало сгенерированного видео.Нет
control_videoНетIMAGE(Опционально) Позволяет пользователям предоставить предварительно обработанное эталонное видео ControlNet, которое будет направлять движение и потенциальную структуру сгенерированного видео.Нет

Выходные параметры

Имя параметраТип данныхОписание
positiveCONDITIONINGПредоставляет улучшенные данные положительного кондиционирования, включая закодированные start_image и control_video.
negativeCONDITIONINGПредоставляет данные отрицательного кондиционирования, которые также были улучшены, содержащие тот же concat_latent_image.
latentLATENTСловарь, содержащий пустой латентный тензор с ключом “samples”.

Пример рабочего процесса узла

Пожалуйста, посетите Пример рабочего процесса узла Wan Fun Control, чтобы понять, как ComfyUI нативно поддерживает модели Wan Fun Control.

Исходный код узла

Исходный код узла, версия кода 3661c833bcc41b788a7c9f0e7bc48524f8ee5f82

class WanFunControlToVideo:
    @classmethod
    def INPUT_TYPES(s):
        return {"required": {"positive": ("CONDITIONING", ),
                             "negative": ("CONDITIONING", ),
                             "vae": ("VAE", ),
                             "width": ("INT", {"default": 832, "min": 16, "max": nodes.MAX_RESOLUTION, "step": 16}),
                             "height": ("INT", {"default": 480, "min": 16, "max": nodes.MAX_RESOLUTION, "step": 16}),
                             "length": ("INT", {"default": 81, "min": 1, "max": nodes.MAX_RESOLUTION, "step": 4}),
                             "batch_size": ("INT", {"default": 1, "min": 1, "max": 4096}),
                },
                "optional": {"clip_vision_output": ("CLIP_VISION_OUTPUT", ),
                             "start_image": ("IMAGE", ),
                             "control_video": ("IMAGE", ),
                }}
 
    RETURN_TYPES = ("CONDITIONING", "CONDITIONING", "LATENT")
    RETURN_NAMES = ("positive", "negative", "latent")
    FUNCTION = "encode"
 
    CATEGORY = "conditioning/video_models"
 
    def encode(self, positive, negative, vae, width, height, length, batch_size, start_image=None, clip_vision_output=None, control_video=None):
        latent = torch.zeros([batch_size, 16, ((length - 1) // 4) + 1, height // 8, width // 8], device=comfy.model_management.intermediate_device())
        concat_latent = torch.zeros([batch_size, 16, ((length - 1) // 4) + 1, height // 8, width // 8], device=comfy.model_management.intermediate_device())
        concat_latent = comfy.latent_formats.Wan21().process_out(concat_latent)
        concat_latent = concat_latent.repeat(1, 2, 1, 1, 1)
 
        if start_image is not None:
            start_image = comfy.utils.common_upscale(start_image[:length].movedim(-1, 1), width, height, "bilinear", "center").movedim(1, -1)
            concat_latent_image = vae.encode(start_image[:, :, :, :3])
            concat_latent[:,16:,:concat_latent_image.shape[2]] = concat_latent_image[:,:,:concat_latent.shape[2]]
 
        if control_video is not None:
            control_video = comfy.utils.common_upscale(control_video[:length].movedim(-1, 1), width, height, "bilinear", "center").movedim(1, -1)
            concat_latent_image = vae.encode(control_video[:, :, :, :3])
            concat_latent[:,:16,:concat_latent_image.shape[2]] = concat_latent_image[:,:,:concat_latent.shape[2]]
 
        positive = node_helpers.conditioning_set_values(positive, {"concat_latent_image": concat_latent})
        negative = node_helpers.conditioning_set_values(negative, {"concat_latent_image": concat_latent})
 
        if clip_vision_output is not None:
            positive = node_helpers.conditioning_set_values(positive, {"clip_vision_output": clip_vision_output})
            negative = node_helpers.conditioning_set_values(negative, {"clip_vision_output": clip_vision_output})
 
        out_latent = {}
        out_latent["samples"] = latent
        return (positive, negative, out_latent)

Анализ функции encode

Функция encode в узле WanFunControlToVideo отвечает за преобразование входных параметров в информацию кондиционирования и латентное пространство, которые будут использоваться последующими моделями генерации видео.

Функция сначала инициализирует пустой латентный тензор с именем latent с определенной формой: [batch_size, 16, ((length - 1) // 4) + 1, height // 8, width // 8]. Этот тензор размещается на comfy.model_management.intermediate_device(), обычно доступном GPU. Затем инициализируется другой латентный тензор concat_latent с той же формой, что и latent, используемый для хранения закодированной информации из опциональных входов start_image и control_video.

После обработки опциональных визуальных входов, тензор concat_latent теперь содержит закодированную информацию из start_image и control_video (если предоставлены) и добавляется как к положительной, так и к отрицательной информации кондиционирования под ключом “concat_latent_image” с использованием функции node_helpers.conditioning_set_values.

Наконец, функция проверяет, предоставлен ли clip_vision_output. Если да, он также добавляется как к положительному, так и к отрицательному кондиционированию под ключом “clip_vision_output”. Это позволяет визуальным признакам, извлеченным моделью CLIP, дополнительно уточнять процесс генерации.

Дополнительный контент, связанный с Wan Fun Control

WanFun Control в основном используется с семейством моделей Wan 2.1. Метод вдохновлен ControlNet, мощной техникой, широко используемой в генерации изображений для модуляции выхода через различные пространственные и структурные входы. WanFun Control расширяет эти принципы на временную область видео, позволяя пользователям достичь высокой степени влияния на генерируемый видеоконтент, выходя за рамки ограничений чисто текстовых методов. Он использует визуальную информацию, извлеченную из входных видео (таких как карты глубины, контуры краев (Canny) или человеческие позы (OpenPose)) для облегчения создания контролируемых видео.

Семейство моделей Wan 2.1 является основой для WanFun Control, предлагая различные варианты параметров, включая модели 1.3B и 14B, предоставляя пользователям варианты для балансирования вычислительных ресурсов с желаемым качеством и сложностью выхода.

Основная концепция WanFun Control заключается в использовании визуальных подсказок из эталонного видео для направления творческого процесса ИИ. Пользователи могут предоставить “контрольное видео”, которое воплощает желаемое движение или пространственное расположение, вместо того чтобы полагаться исключительно на текстовые промпты для определения движения, структуры и стиля сгенерированного видео. Это позволяет более прямой и интуитивный способ создания видео с конкретными характеристиками. Например, пользователь может предоставить видео человека, идущего, и система WanFun Control сгенерирует новое видео другого субъекта, выполняющего то же движение ходьбы, при этом соблюдая текстовый промпт для внешнего вида субъекта и общей сцены. Этот структурированный подход к генерации видео, сочетающий визуальные данные с текстовыми описаниями, приводит к выходам с более высокой точностью движения, улучшенными эффектами стилизации и способностью достигать более намеренных визуальных преобразований.

Связанные модели и репозитории кода