Видео из текста

<!-- lesson: video-text -->

Урок «video-text» в группе Видео списка уроков. Шагов: 14.

Чему вы научитесь

Соберёте граф Wan 2.2, который делает ролик на пять секунд по промпту.

Что понадобится

  • Файлы моделей, которые урок проверяет:
    • половина high_noise модели Wan 2.2 «текст в видео» (t2v): models/diffusion_models, например wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors;
    • половина low_noise модели Wan 2.2 «текст в видео» (t2v): models/diffusion_models, например wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors;
    • чтение текста Wan, umt5-xxl: models/text_encoders, например umt5_xxl_fp8_e4m3fn_scaled.safetensors;
    • VAE от Wan 2.1 (wan_2.1_vae): models/vae, например wan_2.1_vae.safetensors.
  • Ноды: Load Diffusion Model, Load CLIP, Load VAE, CLIP Text Encode (Prompt), ModelSamplingSD3, Empty Hunyuan Video 1.0 Latent, KSampler (Advanced), VAE Decode, Create Video, Save Video.
  • Приложение ничего не скачивает и не устанавливает. Тексты шагов ниже говорят, какие файлы, в какие папки и какой шаблон ComfyUI их называет.

Шаги

Слова каждого шага, как их показывает урок. Имена нод выделены.

  1. Что такое видео для модели (чтение)

    Для модели видео состоит из пачки кадров. Она рисует их все сразу, чтобы движение было связным.

    Wan 2.2 делает это в два прохода двумя моделями. Первая, high_noise, намечает композицию и движение. Вторая, low_noise, доводит детали. Поэтому в графе две загрузки модели и два сэмплера.

    Граф больше, чем для картинки: четырнадцать нод. Шаги маленькие, и приложение отметит каждый.

    Если на холсте уже есть другой граф, начните с пустого: «Файл ▸ Новый проект».

  2. Загрузите две модели

    Добавьте две ноды Load Diffusion Model. В одной выберите в поле unet_name файл со словами high_noise, в другой файл со словами low_noise. Для этого урока нужны файлы t2v, то есть «текст в видео».

    Это две половины одной модели. Один и тот же файл в обеих нодах работать не будет.

    Если нужного файла в списке нет, значит, его нет в вашем ComfyUI. Приложение ничего не скачивает. Проще всего открыть в самом ComfyUI готовый шаблон Wan 2.2 «текст в видео»: он покажет, каких файлов не хватает и куда их положить. Потом выберите здесь в меню «Синхронизация ▸ Синхронизировать сейчас», и файлы появятся в списках.

  3. Загрузите чтение текста

    Добавьте ноду Load CLIP. В поле clip_name выберите файл umt5_xxl, в поле type поставьте wan.

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

  4. Загрузите VAE

    Добавьте ноду Load VAE и выберите в поле vae_name файл wan_2.1_vae.

    VAE превращает результат в кадры. Большим моделям Wan 2.2 нужен VAE от версии 2.1. Файл wan2.2_vae подходит только к малой модели 5B.

  5. Напишите промпт

    Добавьте две ноды CLIP Text Encode (Prompt) и подключите ко входу clip каждой выход ноды Load CLIP. В одной опишите ролик в поле text: что в кадре, что происходит, как движется камера. Вторая остаётся для того, чего быть не должно.

    Для видео важно описать действие. «Человек идёт по пляжу, камера следует сбоку» работает лучше, чем «человек на пляже».

  6. Настройте сдвиг шума

    Добавьте две ноды ModelSamplingSD3. Через одну пропустите первую модель, через другую вторую: выход MODEL загрузчика ко входу model. В поле shift обеих поставьте 8.

    Это число меняет, сколько шума остаётся на каждом шаге. У Wan при маленьком значении хуже держатся композиция и движение, ролик выходит вялым.

    Слово SD3 в названии ноды осталось от другой модели: Wan настраивается той же нодой.

  7. Задайте размер и длину

    Добавьте ноду Empty Hunyuan Video 1.0 Latent. Поставьте width 832, height 480 и length 81.

    length задаёт число кадров. 81 кадр при 16 кадрах в секунду даёт пять секунд. У Wan число кадров должно быть вида 4n + 1: 49, 81, 121.

    Размер и длина сильнее всего влияют на время и память видеокарты. Начинайте с малого.

    Слово Hunyuan в названии ноды осталось от другой видео-модели: заготовка у Wan такая же.

  8. Первый проход

    Добавьте ноду KSampler (Advanced) и подключите к ней:

    • ко входу model выход той ноды ModelSamplingSD3, через которую идёт модель high_noise;
    • ко входам positive и negative два текста;
    • ко входу latent_image выход ноды Empty Hunyuan Video 1.0 Latent.

    Этот сэмплер начинает с чистого шума и намечает ролик.

  9. Второй проход

    Добавьте вторую ноду KSampler (Advanced) и подключите к ней:

    • ко входу model выход ноды ModelSamplingSD3 с моделью low_noise;
    • ко входам positive и negative те же два текста;
    • ко входу latent_image выход первого сэмплера.

    Второй сэмплер получает недорисованный ролик и доводит его.

  10. Настройте первый сэмплер

В первом сэмплере поставьте:

  • add_noise: enable;
  • steps: 20;
  • cfg: 3.5;
  • start_at_step: 0 и end_at_step: 10;
  • return_with_leftover_noise: enable.

Он делает первую половину из двадцати шагов и отдаёт ролик вместе с оставшимся шумом. Без последней настройки второй сэмплер получит уже очищенный ролик, и дорабатывать ему будет нечего.

  1. Настройте второй сэмплер

Во втором сэмплере поставьте:

  • add_noise: disable;
  • steps и cfg: как в первом;
  • start_at_step: 10, то же число, на котором остановился первый;
  • return_with_leftover_noise: disable.

Шум уже есть, второй раз добавлять его нельзя. Если start_at_step не совпадёт с end_at_step первого сэмплера, часть шагов пропадёт или сделается дважды.

  1. Превратите результат в кадры

Добавьте ноду VAE Decode. Ко входу samples подключите выход второго сэмплера, ко входу vae выход ноды Load VAE.

Сэмплер выдаёт ролик в сжатом виде. Эта нода разворачивает его в кадры.

  1. Соберите и сохраните ролик

Добавьте ноды Create Video и Save Video. Кадры из ноды VAE Decode идут во вход images ноды Create Video, а её выход во вход video ноды Save Video. В поле fps поставьте 16.

Wan рисует 16 кадров в секунду. С другим числом ролик пойдёт быстрее или медленнее, чем задумано.

  1. Граф готов (чтение)

Сохраните граф через «Файл ▸ Сохранить workflow для ComfyUI…», откройте файл в ComfyUI и запустите там. Само приложение в ComfyUI ничего не запускает.

Первый запуск долгий: модели загружаются в память. Если памяти видеокарты не хватает, уменьшите width, height или length.

Дальше: урок «Видео из картинки» оживляет готовый кадр, урок «Быстрое видео за четыре шага» сокращает ожидание в несколько раз.

Что проверяет урок

Шаг для чтения сделан, когда вы нажимаете Понятно, дальше. Шаг с делом отмечается сам, когда на холсте есть:

  • Шаг 2, Загрузите две модели:
    • нода Load Diffusion Model.
    • нода Load Diffusion Model.
    • в поле unet_name ноды Load Diffusion Model (первый проход) стоит файл такого вида: половина high_noise модели Wan 2.2 «текст в видео» (t2v); такой файл лежит в models/diffusion_models, например wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors.
    • unet_name ноды Load Diffusion Model (второй проход): не тот же файл, что в поле unet_name ноды Load Diffusion Model (первый проход).
    • в поле unet_name ноды Load Diffusion Model (второй проход) стоит файл такого вида: половина low_noise модели Wan 2.2 «текст в видео» (t2v); такой файл лежит в models/diffusion_models, например wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors.
  • Шаг 3, Загрузите чтение текста:
    • нода Load CLIP.
    • в поле clip_name ноды Load CLIP стоит файл такого вида: чтение текста Wan, umt5-xxl; такой файл лежит в models/text_encoders, например umt5_xxl_fp8_e4m3fn_scaled.safetensors.
    • type ноды Load CLIP: wan. Почему: поле type говорит ноде, для какой модели этот текст. С другим значением Wan получит бессмыслицу.
  • Шаг 4, Загрузите VAE:
    • нода Load VAE.
    • в поле vae_name ноды Load VAE стоит файл такого вида: VAE от Wan 2.1 (wan_2.1_vae); такой файл лежит в models/vae, например wan_2.1_vae.safetensors.
  • Шаг 5, Напишите промпт:
    • нода CLIP Text Encode (Prompt).
    • нода CLIP Text Encode (Prompt).
    • CLIP ноды Load CLIP во вход clip ноды CLIP Text Encode (Prompt) (промпт).
    • CLIP ноды Load CLIP во вход clip ноды CLIP Text Encode (Prompt) (негатив).
    • text ноды CLIP Text Encode (Prompt) (промпт): не меньше 3 знаков и 2 настоящих слов.
  • Шаг 6, Настройте сдвиг шума:
    • нода ModelSamplingSD3.
    • нода ModelSamplingSD3.
    • MODEL ноды Load Diffusion Model (первый проход) во вход model ноды ModelSamplingSD3 (сдвиг первого прохода) (можно через LoraLoaderModelOnly).
    • MODEL ноды Load Diffusion Model (второй проход) во вход model ноды ModelSamplingSD3 (сдвиг второго прохода) (можно через LoraLoaderModelOnly).
    • shift ноды ModelSamplingSD3 (сдвиг первого прохода): от 5 до 8; «Сделать за меня» ставит 8. Почему: у Wan при маленьком сдвиге хуже держатся композиция и движение, ролик выходит вялым.
    • shift ноды ModelSamplingSD3 (сдвиг второго прохода): от 5 до 8; «Сделать за меня» ставит 8. Почему: у Wan при маленьком сдвиге хуже держатся композиция и движение, ролик выходит вялым.
  • Шаг 7, Задайте размер и длину:
    • нода Empty Hunyuan Video 1.0 Latent.
    • length ноды Empty Hunyuan Video 1.0 Latent: от 49 до 121, число кадров вида 4n + 1; «Сделать за меня» ставит 81. Почему: wan берёт число кадров вида 4n + 1: 49, 81, 121. 81 кадр при 16 в секунду даёт пять секунд.
  • Шаг 8, Первый проход:
    • нода KSampler (Advanced).
    • MODEL ноды ModelSamplingSD3 (сдвиг первого прохода) во вход model ноды KSampler (Advanced) (первый проход) (можно через LoraLoaderModelOnly).
    • CONDITIONING ноды CLIP Text Encode (Prompt) (промпт) во вход positive ноды KSampler (Advanced) (первый проход).
    • CONDITIONING ноды CLIP Text Encode (Prompt) (негатив) во вход negative ноды KSampler (Advanced) (первый проход).
    • LATENT ноды Empty Hunyuan Video 1.0 Latent во вход latent_image ноды KSampler (Advanced) (первый проход).
  • Шаг 9, Второй проход:
    • нода KSampler (Advanced).
    • MODEL ноды ModelSamplingSD3 (сдвиг второго прохода) во вход model ноды KSampler (Advanced) (второй проход) (можно через LoraLoaderModelOnly).
    • CONDITIONING ноды CLIP Text Encode (Prompt) (промпт) во вход positive ноды KSampler (Advanced) (второй проход).
    • CONDITIONING ноды CLIP Text Encode (Prompt) (негатив) во вход negative ноды KSampler (Advanced) (второй проход).
    • LATENT ноды KSampler (Advanced) (первый проход) во вход latent_image ноды KSampler (Advanced) (второй проход).
  • Шаг 10, Настройте первый сэмплер:
    • add_noise ноды KSampler (Advanced) (первый проход): enable. Почему: первый сэмплер начинает с чистого шума, поэтому шум добавляет он.
    • steps ноды KSampler (Advanced) (первый проход): от 4 до 60; «Сделать за меня» ставит 20. Почему: двадцать шагов делятся на два прохода; с другим числом граница между ними сдвинется.
    • cfg ноды KSampler (Advanced) (первый проход): от 1 до 4; «Сделать за меня» ставит 3.5. Почему: для Wan 2.2 большой cfg выжигает ролик. Шаблоны ComfyUI ставят 3.5.
    • start_at_step ноды KSampler (Advanced) (первый проход): 0. Почему: первый сэмплер начинает с самого начала, с шага 0.
    • end_at_step ноды KSampler (Advanced) (первый проход): от 1 до 15; «Сделать за меня» ставит 10. Почему: на этом шаге первая модель отдаёт ролик второй. Шаблоны ComfyUI делят двадцать шагов пополам.
    • end_at_step ноды KSampler (Advanced) (первый проход) меньше поля steps ноды KSampler (Advanced) (первый проход). Почему: если первый сэмплер остановится не раньше последнего шага, он сделает всё сам и второму нечего будет доводить.
    • return_with_leftover_noise ноды KSampler (Advanced) (первый проход): enable. Почему: без оставшегося шума второй сэмплер получит уже очищенный ролик, и дорабатывать ему будет нечего.
  • Шаг 11, Настройте второй сэмплер:
    • add_noise ноды KSampler (Advanced) (второй проход): disable. Почему: шум уже есть в ролике от первого сэмплера, второй раз добавлять его нельзя.
    • steps ноды KSampler (Advanced) (второй проход) равно полю steps ноды KSampler (Advanced) (первый проход). Почему: оба сэмплера считают одни и те же шаги, иначе граница между проходами не сойдётся.
    • cfg ноды KSampler (Advanced) (второй проход): от 1 до 4; «Сделать за меня» ставит 3.5. Почему: для Wan 2.2 большой cfg выжигает ролик. Шаблоны ComfyUI ставят 3.5.
    • start_at_step ноды KSampler (Advanced) (второй проход) равно полю end_at_step ноды KSampler (Advanced) (первый проход). Почему: второй сэмплер продолжает с того шага, на котором остановился первый. Иначе часть шагов пропадёт или сделается дважды.
    • return_with_leftover_noise ноды KSampler (Advanced) (второй проход): disable. Почему: второй сэмплер доводит ролик до конца, остаток шума отдавать некому.
  • Шаг 12, Превратите результат в кадры:
    • нода VAE Decode.
    • LATENT ноды KSampler (Advanced) (второй проход) во вход samples ноды VAE Decode.
    • VAE ноды Load VAE во вход vae ноды VAE Decode.
  • Шаг 13, Соберите и сохраните ролик:
    • нода Create Video.
    • нода Save Video.
    • IMAGE ноды VAE Decode во вход images ноды Create Video.
    • VIDEO ноды Create Video во вход video ноды Save Video.
    • fps ноды Create Video: 16. Почему: wan рисует 16 кадров в секунду. С другим числом ролик пойдёт быстрее или медленнее, чем задумано.

Частые ошибки

  • Файлы i2v в графе видео из текста или один файл в обоих загрузчиках.
  • Забыть return_with_leftover_noise у первого сэмплера: второй получит чистый ролик, и ему нечего доделывать.
  • start_at_step второго не равен end_at_step первого: шаги теряются или делаются дважды.
  • fps не 16: ролик идёт слишком быстро или медленно.

Что дальше

Этот урок продолжают: Промпт для видео, Видео из картинки, LoRA: добавить стиль или тему, Видео на скромной видеокарте: Wan 2.2 5B.

См. также

Страница перенесена из wiki репозитория приложения (docs/wiki/lessons/Video-Text.ru.md, ревизия b8e3f71). То же руководство встроено в приложение: «Справка ▸ Руководство».

Чтобы обновить её, выполните npm run import, а затем npm run build в папке сайта.