My first attempt of replicating Zack D. Films' Shorts using AI

Results are quite poor, however i provide script for inference.

⚡🔵 Script for the inference:

import torch
import os
from diffsynth.utils.data import save_video
from diffsynth.pipelines.wan_video import WanVideoPipeline, ModelConfig

# ==================== КОНФИГУРАЦИЯ ====================
PROMPT_PREFIX = "ZackDFilms-style Short: "
PROMPT = "He found the injured fish on the ocean floor and instead of letting it die, he fed it crabs every day. He gave it gentle kisses on its head as it slowly recovered. When it finally healed, the man watched it swim away, thinking this was his goodbye."
LORA_PATH = "/home/ubuntu/ai/models/train/Wan2.2-TI2V-5B_lora_zackdfilms_3s30fps/step-800.safetensors"
HEIGHT = 1280
WIDTH = 736
NUM_FRAMES = 93
SEED = 42
FPS = 30
OUTPUT_FILE = "/home/ubuntu/ai/generated_videos/zackdfilms_output_full.mp4"

# Убедимся, что папка существует
os.makedirs(os.path.dirname(OUTPUT_FILE), exist_ok=True)

print("🚀 ГЕНЕРАЦИЯ WAN2.2-TI2V-5B С LoRA")
print("=" * 60)
final_prompt = PROMPT_PREFIX + PROMPT
print(f"Промпт: {final_prompt}")
print(f"Разрешение: {WIDTH}x{HEIGHT}")
print(f"Кадров: {NUM_FRAMES}")
print("### v3")

# ==================== ШАГ 1: ЗАГРУЗКА МОДЕЛИ ====================
print("\n📥 Загрузка базовой модели...")
try:
    pipe = WanVideoPipeline.from_pretrained(
        torch_dtype=torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16,
        device="cuda",
        model_configs=[
            ModelConfig(model_id="Wan-AI/Wan2.2-TI2V-5B", origin_file_pattern="models_t5_umt5-xxl-enc-bf16.pth"),
            ModelConfig(model_id="Wan-AI/Wan2.2-TI2V-5B", origin_file_pattern="diffusion_pytorch_model*.safetensors"),
            ModelConfig(model_id="Wan-AI/Wan2.2-TI2V-5B", origin_file_pattern="Wan2.2_VAE.pth"),
        ],
        tokenizer_config=ModelConfig(model_id="Wan-AI/Wan2.1-T2V-1.3B", origin_file_pattern="google/umt5-xxl/"),
        redirect_common_files=False,
    )
    print("✅ Базовая модель загружена")
except Exception as e:
    print(f"❌ Ошибка загрузки модели: {e}")
    exit(1)

# ==================== ШАГ 2: ЗАГРУЗКА LoRA ====================
print(f"\n🔗 Применение LoRA...")
if os.path.exists(LORA_PATH):
    try:
        if hasattr(pipe, 'load_lora'):
            print("Обнаружен метод pipe.load_lora...")
            if hasattr(pipe, 'dit'):
                pipe.load_lora(pipe.dit, LORA_PATH, alpha=1.0)
                print(f"✅ LoRA загружена (alpha=0.8)")
            else:
                print("⚠ Не найден dit в пайплайне")
        else:
            print("Прямая загрузка через pipe.model...")
            from safetensors.torch import load_file
            import torch
            
            lora_weights = load_file(LORA_PATH)
            model_state_dict = pipe.model.state_dict()
            
            applied_count = 0
            for key in lora_weights:
                if key in model_state_dict:
                    if lora_weights[key].shape == model_state_dict[key].shape:
                        with torch.no_grad():
                            model_state_dict[key].mul_(0.2)
                            model_state_dict[key].add_(lora_weights[key] * 0.8)
                        applied_count += 1
            
            if applied_count > 0:
                pipe.model.load_state_dict(model_state_dict)
                print(f"✅ LoRA применена к {applied_count} тензорам")
    except Exception as e:
        print(f"❌ Ошибка LoRA: {e}")
else:
    print(f"⚠ Файл LoRA не найден")

# ==================== ШАГ 3: ГЕНЕРАЦИЯ И СОХРАНЕНИЕ ====================
print("\n" + "=" * 60)
print("🎬 ГЕНЕРАЦИЯ ВИДЕО")
print("=" * 60)

try:
    # Генерация видео
    video = pipe(
        prompt=final_prompt,
        negative_prompt="low quality, worst quality, blurry, distorted, deformed, ugly",
        seed=SEED,  # Важно: используем seed, а не random_seed
        tiled=True,
        height=HEIGHT,
        width=WIDTH,
        num_frames=NUM_FRAMES,
        num_inference_steps=30,
    )
    
    print(f"✅ Видео сгенерировано: {len(video)} кадров")
    
    # СОХРАНЕНИЕ ВИДЕО (упрощенное, без ошибок)
    save_video(video, OUTPUT_FILE, fps=FPS, quality=5)
    print(f"💾 Видео сохранено: {OUTPUT_FILE}")
    
    # УБИРАЕМ ПРОБЛЕМНЫЙ БЛОК С ПРЕВЬЮ
    # if len(video) > 0:
    #     preview_path = OUTPUT_FILE.replace('.mp4', '_preview.jpg')
    #     from PIL import Image
    #     Image.fromarray(video[0]).save(preview_path)
    #     print(f"👁 Первый кадр для проверки: {preview_path}")
    
except torch.cuda.OutOfMemoryError:
    print("⚠ Нехватка памяти VRAM...")
    
except Exception as e:
    print(f"❌ Ошибка генерации: {e}")

print("\n" + "=" * 60)
print("🎉 СКРИПТ ВЫПОЛНЕН")
print("=" * 60)

# Проверяем, сохранилось ли видео
if os.path.exists(OUTPUT_FILE):
    file_size = os.path.getsize(OUTPUT_FILE) / (1024 * 1024)
    print(f"✅ Видео найдено: {OUTPUT_FILE}")
    print(f"📏 Размер файла: {file_size:.1f} MB")
else:
    print(f"❌ ВНИМАНИЕ: Видео не сохранено по пути {OUTPUT_FILE}")
    print("Проверьте права доступа к папке или наличие свободного места")
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for FalconNet/Wan2.2-TI2V-5B-ZackDFilms-LoRA

Finetuned
(15)
this model

Dataset used to train FalconNet/Wan2.2-TI2V-5B-ZackDFilms-LoRA