Гайд: сохранение персонажей, замена лиц, смена причёсок и одежды в Telegram-боте¶
Что ты хочешь построить¶
Пользователь → кидает 5-20 фото лица → бот сохраняет «персонажа»
кидает ещё фото → бот сохраняет «персонажа-2»
пишет промпт «персонаж-1 и персонаж-2 пьют кофе в Париже»
→ бот генерирует картинку с обоими
кидает фото → «замени лицо на персонажа-1»
кидает фото → «примерь вот эту куртку»
«покажи персонажа-1 с ирокезом»
Это 4 разных технологии, каждая под свою задачу. Сейчас разложу.
Технологии: как они работают¶
1. Face Swapping (замена лица)¶
Принцип: Берём готовое фото, детектируем лицо, вырезаем, вклеиваем лицо целевого персонажа, сглаживаем границы (блендинг + цветокоррекция).
Что нужно: 1 чёткое фото лица персонажа (анфас, хорошее освещение). Скорость: 1-5 секунд на GPU.
Инструменты (бесплатные, open-source):
| Инструмент | Качество | Сложность API | Цена |
|---|---|---|---|
| FaceFusion | ★★★★★ | HTTP API из коробки | Бесплатно |
| InsightFace + inswapper_128 | ★★★★☆ | Python-либа | Бесплатно |
| ReActor (SD extension) | ★★★★☆ | Внутри ComfyUI/AUTOMATIC1111 | Бесплатно |
| Ghost 2.0 / SimSwap | ★★★☆☆ | Python | Бесплатно |
Рекомендация: FaceFusion. Лучшее качество блендинга, есть REST API (--ui-listen), заточено именно под face swap. http://docs.facefusion.io
Платные API-хостинги (если нет своей GPU):
- Replicate: lucataco/facefusion — ~$0.002 за прогон
- Fal.ai: fal-ai/face-swap — ~$0.01 за прогон
2. Сохранение персонажа и генерация с ним (Identity Preservation)¶
Принцип: Нейросеть учится «понимать» лицо человека, чтобы воспроизводить его в новых позах/сценах/стилях. Три основных подхода:
А) InstantID / IP-Adapter — без обучения, 1 фото¶
В Stable Diffusion (SDXL) подмешиваются эмбеддинги лица через отдельный энкодер (insightface + CLIP). Не обучаем модель — просто на инференсе добавляем лицо как conditioning.
- Фото нужно: 1-4 (чем больше ракурсов, тем лучше)
- Качество: ★★★☆☆ (хорошо держит лицо, но не идеально)
- Время: 10-30 сек на генерацию
- GPU: 8-12 GB VRAM
Б) LoRA (Low-Rank Adaptation) — обучение, 10-20 фото¶
Тренируем маленький адаптер (~15-150 MB) поверх Stable Diffusion на фото персонажа. После этого персонаж «живёт» внутри модели.
- Фото нужно: 10-20 (разные ракурсы, освещение, эмоции, без повторов)
- Качество: ★★★★★ (золотой стандарт)
- Время обучения: 20-40 минут на GPU
- GPU: 12-24 GB VRAM
- Время инференса: 10-20 сек
В) PuLID + Flux — новое поколение, 1+ фото¶
Более свежий подход. Использует Flux (новую модель от Black Forest Labs) с PuLID-адаптером для удержания identity.
- Фото нужно: 1-10
- Качество: ★★★★☆
- GPU: 24 GB VRAM (Flux тяжёлый)
Инструменты для identity preservation:
| Инструмент | Подход | Свой API | Хостинг | Цена |
|---|---|---|---|---|
| ComfyUI + InstantID | Без обучения | WebSocket API | Локально / RunPod | Бесплатно + GPU |
| ComfyUI + Flux-PuLID | Без обучения | WebSocket API | Локально / RunPod | Бесплатно + GPU |
| Kohya SS + LoRA | Обучение | CLI | Локально / RunPod | Бесплатно + GPU |
| Replicate: InstantID | Без обучения | REST API | Облако | ~$0.02/изобр |
| Replicate: Flux-PuLID | Без обучения | REST API | Облако | ~$0.05/изобр |
| astro.ai | LoRA-тренировка | REST API | Облако | ~$5/модель |
| fal.ai: flux-lora | LoRA | REST API | Облако | ~$0.05/изобр |
3. Virtual Try-On (примерка одежды)¶
Принцип: Нейросеть сегментирует человека на исходном фото (отделяет одежду от тела), затем «натягивает» новую одежду с сохранением позы и пропорций тела.
Что нужно: 1 фото человека (в полный рост) + 1 фото одежды (на белом фоне или на манекене).
| Инструмент | Качество | API | Цена |
|---|---|---|---|
| IDM-VTON | ★★★★☆ | Python / Gradio | Бесплатно |
| OOTDiffusion | ★★★★☆ | Python / Gradio | Бесплатно |
| CatVTON | ★★★★★ | Python | Бесплатно (новый, лучший) |
| Replicate: idm-vton | ★★★★☆ | REST API | ~$0.015 |
| Fashn.ai API | ★★★★★ | REST API | ~$0.05 |
4. Смена причёски (Hairstyle Transfer)¶
Принцип: Сеть кодирует причёску с референс-фото и переносит на целевое лицо, сохраняя identity.
| Инструмент | Качество | API | Цена |
|---|---|---|---|
| HairFastGAN | ★★★★☆ | Python | Бесплатно |
| StyleCLIP | ★★★☆☆ | Python | Бесплатно |
| Stable Diffusion + IP-Adapter + ControlNet | ★★★★☆ | ComfyUI | Бесплатно |
На практике проще всего: описать причёску текстом в промпте при генерации с LoRA-персонажем. «Character-1 with a blue mohawk, punk style».
Сколько фото нужно: чеклист для LoRA (лучшее качество)¶
Если хочешь идеальное качество персонажа — тренируй LoRA. Требования к фото:
| Параметр | Минимум | Рекомендация |
|---|---|---|
| Количество | 10 | 15-20 |
| Разнообразие ракурсов | 3-4 | анфас, профиль, ¾, снизу |
| Освещение | 2-3 варианта | дневное, вечернее, студийное |
| Эмоции | 2-3 | нейтральная, улыбка, серьёзная |
| Одежда | разная | не 20 фото в одной футболке |
| Фон | разный | не на одном и том же фоне |
| Качество | 512×512+ | 1024×1024 |
| Без других людей | обязательно | только целевой человек в кадре |
| Без очков/масок | обязательно | чистые лицо и глаза |
Что портит LoRA: - Однотипные фото (все с одного ракурса, в одной одежде) - Разные люди на фото без кропа - Сильно разный макияж (лучше без косметики) - Фильтры, HDR, ретушь - Вода, блики на лице
Архитектура для Telegram-бота¶
Рекомендуемый стек (цена/качество)¶
Telegram Bot (aiogram / python-telegram-bot)
│
├─ Face Swap → FaceFusion (локально на GPU-сервере)
│ или Replicate API (без своей GPU)
│
├─ Сохранение персонажа → Kohya SS → LoRA на FLUX/SDXL
│ ├─ Тренировка: разовая задача на GPU (RunPod $0.50-1.00)
│ └─ Инференс: ComfyUI API с загруженной LoRA
│
├─ Примерка одежды → CatVTON (локально) или Fashn.ai API
│
└─ Генерация с персонажем → ComfyUI Workflow API
└─ Модель: SDXL + LoRA или FLUX + LoRA
Варианты размещения¶
А) Своя GPU (самый дешёвый на объёмах)¶
- RTX 4090 / A5000 (24 GB) — идеально
- Ставишь ComfyUI как сервер (запускается с
--listen --port 8188) - Из бота дёргаешь через WebSocket API (
/ws) - ComfyUI workflow — это JSON, можно собирать программно
# Пример вызова ComfyUI из бота
import json, uuid, websocket
def generate_with_comfyui(workflow_json: dict, server="localhost:8188"):
client_id = str(uuid.uuid4())
ws = websocket.WebSocket()
ws.connect(f"ws://{server}/ws?clientId={client_id}")
# Отправляем workflow
workflow_json["client_id"] = client_id
resp = requests.post(f"http://{server}/prompt", json={"prompt": workflow_json})
prompt_id = resp.json()["prompt_id"]
# Ждём результат
while True:
msg = json.loads(ws.recv())
if msg.get("type") == "executed" and msg["data"]["prompt_id"] == prompt_id:
# Забираем изображение из вывода
output = msg["data"]["output"]["images"][0]
return f"http://{server}/view?filename={output['filename']}"
Б) Бессерверно через Replicate/Fal (платишь за использование)¶
import replicate
# Face swap
output = replicate.run(
"lucataco/facefusion:...",
input={"source": "https://...", "target": "https://..."}
)
# Генерация с персонажем (InstantID)
output = replicate.run(
"zsxkib/instantid:...",
input={
"image": "https://...", # фото персонажа
"prompt": "person wearing a tuxedo at a gala",
"negative_prompt": "bad quality, blurry",
}
)
В) RunPod / Vast.ai (аренда GPU по часам)¶
- RunPod: RTX 4090 ≈ $0.74/час, A100 ≈ $1.89/час
- Vast.ai: RTX 4090 ≈ $0.40/час
- Для LoRA-тренировки арендуешь на час, тренируешь, выключаешь
- Для инференса — serverless или держишь подешевле GPU
Сравнение стоимости¶
Сценарий: пользователь загрузил 15 фото, бот натренировал LoRA, потом 100 генераций с этим персонажем.
| Подход | Тренировка | 100 генераций | Итого |
|---|---|---|---|
| Своя RTX 4090 | $0 (своё) | $0 (своё) | $0 + электричество |
| RunPod (аренда) | ~$0.75 | ~$1.50 (2 часа) | ~$2.25 |
| Replicate (serverless) | N/A (InstantID) | ~$2.00 | ~$2.00 |
| Replicate (LoRA train + gen) | ~$2.00 train | ~$5.00 | ~$7.00 |
| Fal.ai (flux-lora) | ~$3.00 train | ~$5.00 | ~$8.00 |
Итоговая рекомендация¶
Если у тебя есть GPU (RTX 3060+ / RTX 4090):¶
Face Swap: FaceFusion (бесплатно, лучший)
Персонажи: LoRA через Kohya SS + ComfyUI для инференса
Одежда: CatVTON (бесплатно, SOTA)
Причёски: Промптом в SDXL + LoRA (работает хорошо)
Если GPU нет (хочется только API):¶
Face Swap: Replicate: lucataco/facefusion ($0.002/шт)
Персонажи: Replicate: InstantID ($0.02/шт)
Replicate: flux-pulid ($0.05/шт)
Одежда: Replicate: catvton ($0.01/шт)
Компромисс (гибрид):¶
- Покупаешь RTX 4060 Ti 16GB (~$450) — тянет SDXL + LoRA + FaceFusion
- Для FLUX (если нужно) — арендуешь RunPod по часам
- Telegram бот на aiogram, ComfyUI как backend
Готовые решения «из коробки»¶
Если не хочется собирать самому:
| Продукт | Что умеет | Модель |
|---|---|---|
| PhotoAI | Обучение персонажа + генерация | SD + LoRA |
| HeadshotPro | Профессиональные портреты | Свой пайплайн |
| HeyGen | Аватары + видео | Свой пайплайн |
| Astria.ai | API для LoRA-тренировки и генерации | SDXL/FLUX |
Все платные, от $10-30/мес. Для бота неудобно — нет смысла переплачивать, когда ComfyUI делает то же самое локально.
План внедрения в бота (MVP)¶
Этап 1: Face Swap (1 день)¶
- FaceFusion в Docker на сервере с GPU
- Команда
/swapв боте: кидаешь 2 фото → получаешь результат
Этап 2: Сохранение персонажа (2-3 дня)¶
/add_character Имя→ бот просит кинуть 10-20 фото- Бот запускает тренировку LoRA в Kohya SS (фоновый процесс)
- Когда готово → уведомление «Персонаж Имя готов»
Этап 3: Генерация (1-2 дня)¶
/generate Имя описание→ ComfyUI workflow с LoRA персонажа- Поддержка нескольких персонажей в одном промпте (две LoRA одновременно)
Этап 4: Одежда и причёски (1-2 дня)¶
/tryon Имя+ фото одежды → CatVTON- Причёски — через промпт в
/generate
Технические детали: обучение LoRA для персонажа¶
# Установка Kohya SS
git clone https://github.com/bmaltais/kohya_ss.git
cd kohya_ss
./setup.sh
# Конфиг для тренировки (sd_xl_lora.toml)
# Ключевые параметры:
# - resolution: 1024x1024
# - network_dim: 32 (размер LoRA, больше = точнее, но тяжелее)
# - network_alpha: 16
# - learning_rate: 0.0001
# - epochs: 10-20
# - batch_size: 1-2
# Подготовка датасета:
# 1. Обрезать все фото до квадрата (центр на лице)
# 2. Подписать каждое фото текстовым файлом: "ohwx woman" или "ohwx man"
# (ohwx = rare token чтобы LoRA не пересекалась с другими концептами)
Вопросы, которые стоит решить перед стартом¶
- Модерация: что если пользователь зальёт фото не себя, а другого человека? (юридические риски)
- Хранение фото: где хранить датасеты пользователей? S3? Локально? Сколько хранить?
- Очерёдность: если 10 пользователей одновременно просят тренировку — GPU один
- Ценообразование для пользователей: бесплатно? Подписка? За токены?