Як реалізувати AI-анімацію статичних фотографій без компромісів?
Користувачі хочуть оживляти портрети, але реалізація на пристрої обмежена: моделі не поміщаються в пам'ять, а time-to-animation затягується. Серверна генерація дає якість, але потребує інтернету та часу. Ми знаємо, як поєднати обидва підходи, і за 7+ років набили руку на гібридних архітектурах. Наша команда виконала 15+ проєктів з мобільної анімації, включаючи інтеграцію нативних та кросплатформних рішень. Вибір архітектури напряму впливає на бюджет: on-device економить до 40% на GPU-ресурсах, а серверний варіант оптимізує витрати на розробку за рахунок готових моделей.
Як вибрати архітектуру для AI-анімації статичних фотографій?
Серверний інференс — модель живе на бекенді. Додаток завантажує фото, отримує відео. Простіше в деплої, немає обмежень за розміром моделі, можна використовувати SadTalker, LivePortrait або AnimateDiff. Мінус — потрібен інтернет, затримка 3-15 секунд, вартість GPU-часу (від 0.01 до 0.05 долара за хвилину відео).
On-device — більш легкі спеціалізовані моделі. Face Reenactment через landmark-based warping (First Order Motion Model у мобільній версії), або проста анімація через optical flow. Працює офлайн, але якість нижча.
Більшість реалізацій обирають гібрид: на пристрої — швидкий preview (низька якість), на сервері — фінальний результат.
| Характеристика | On-device | Серверний |
|---|---|---|
| Якість | Середня (артефакти на краях) | Висока (суперреалістично) |
| Швидкість | Секунди (до 6-12 с на 1 сек відео) | 5-60 секунд залежно від моделі |
| Інтернет | Не потрібен | Потрібен |
| Вартість використання | Безкоштовно (після розробки) | GPU-години / API-запити |
| Гнучкість | Обмежена розміром моделі | Великий вибір моделей |
Чому on-device рішення може бути недостатнім?
On-device анімація проста, але її якість поступається серверній: помітні артефакти, немає синхронізації з аудіо. Якщо вам потрібно, щоб портрет реалістично говорив, серверна генерація — єдиний варіант. Крім того, on-device потребує більше часу на оптимізацію моделі під конкретний пристрій: ми перевіряємо сумісність на 10+ моделях iPhone та Android.
On-device анімація: від MediaPipe до FOMM
Lightweight підхід без нейромережі на генерацію: використовуємо MediaPipe Face Mesh (468 точок обличчя) для побудови mesh, потім деформуємо вихідне зображення за заданою траєкторією руху.
// MediaPipe FaceLandmarker на iOS
let options = FaceLandmarkerOptions()
options.baseOptions.modelAssetPath = Bundle.main.path(forResource: "face_landmarker", ofType: "task")!
options.numFaces = 1
options.minFaceDetectionConfidence = 0.5
let faceLandmarker = try FaceLandmarker(options: options)
let result = try faceLandmarker.detect(image: .init(uiImage: sourcePhoto))
// landmarks.first?.faceLandmarks — 468 точок [NormalizedLandmark]
// Будуємо деформацію через TPS (Thin Plate Spline) або affine warp
Анімація — за заздалегідь записаною траєкторією руху голови (мокап дані) або синтетична: синусоїдальні коливання ключових точок з різними амплітудами. Рендеринг деформованого зображення через Metal Performance Shaders — кілька мілісекунд на кадр.
Результат — 3-5 секунд анімації, експортується в .mp4 через AVAssetWriter. Якість достатня для «живого портрета», але артефакти на краях обличчя та фоні неминучі без повноцінного GAN.
First Order Motion Model (FOMM): мобільна версія
First Order Motion Model генерує рух на основі одного driving відео (донора) та source image. На мобілі запускається через TFLite або ONNX Runtime, але модель після оптимізації — 40-80 МБ. На iPhone 12+ інференс одного кадру 256×256 — близько 200-400 мс. Для 30-кадрової анімації (1 секунда) — 6-12 секунд обробки. Це разова генерація, не real-time.
// Android: ONNX Runtime з FOMM
val session = OrtEnvironment.getEnvironment().createSession("fomm_optimized.onnx")
// Входи моделі: source frame (1, 3, 256, 256) + driving frame (1, 3, 256, 256) + keypoints
val sourceInput = OnnxTensor.createTensor(env, sourceArray, longArrayOf(1, 3, 256, 256))
val drivingInput = OnnxTensor.createTensor(env, drivingArray, longArrayOf(1, 3, 256, 256))
val result = session.run(mapOf("source" to sourceInput, "driving" to drivingInput))
// Результат: деформований source з застосованим рухом
Цикл по driving-кадрам (заздалегідь записаний motion clip): отримуємо послідовність вихідних кадрів, збираємо в відео.
Як реалізувати серверну генерацію з SadTalker та LivePortrait?
Для якісної анімації обличчя з аудіо (говоряча голова) — SadTalker: приймає фото + аудіодоріжку, генерує відео де обличчя говорить в синхронізації з мовленням. На сервері з A100 — 30-60 секунд на хвилину відео. Додаток завантажує фото та аудіо, отримує mp4.
LivePortrait — швидший та якісніший варіант, 128 мс на кадр на A100. API-обгортка через FastAPI або Replicate.
// Завантаження фото на сервер
func uploadPhotoForAnimation(image: UIImage, audio: URL?) async throws -> URL {
var request = URLRequest(url: URL(string: "https://api.example.com/animate")!)
request.httpMethod = "POST"
// multipart/form-data: image + optional audio
let boundary = UUID().uuidString
let body = createMultipartBody(image: image, audio: audio, boundary: boundary)
request.httpBody = body
let (data, _) = try await URLSession.shared.data(for: request)
let response = try JSONDecoder().decode(AnimationResponse.self, from: data)
return response.videoURL
}
Polling статусу завдання або WebSocket для сповіщення про готовність — залежить від часу генерації.
| Модель | Час на кадр (A100) | Якість синхронізації | Розмір моделі |
|---|---|---|---|
| SadTalker | ~50 мс | Висока | ~2 ГБ |
| LivePortrait | ~128 мс | Дуже висока | ~1.5 ГБ |
LivePortrait кращий за SadTalker за реалістичністю рухів, але потребує більше GPU-часу. Вибір залежить від пріоритету: швидкість чи якість.
Як ми реалізуємо AI-анімацію: процес та етапи
- Аналіз вимог та вибір стеку: визначаємо сценарій використання (on-device попередній перегляд, серверна генерація говорящої голови, гібрид).
- Проектування архітектури: схема передачі даних, модель розгортання, експорт.
- Реалізація та інтеграція моделі: кодинг на Swift/Kotlin, налаштування серверної частини.
- Тестування на реальних пристроях: мінімум 10 моделей iPhone та Android.
- Деплой в App Store / Google Play з документацією.
При необхідності виконуємо оптимізацію on-device моделей під конкретні чипсети, розробляємо власний пайплайн генерації або інтегруємо підтримку ARKit/ARCore для накладання анімації.
Експорт та відтворення
Результат анімації — .mp4 (H.264 або H.265). На iOS відтворюється через AVPlayer, експортується в Photos через PHPhotoLibrary. Для зацикленої анімації (Living Photo) — конвертуємо в .gif через CGImageDestination або у формат LivePhoto через PHLivePhoto.
Apple Live Photo: потрібні і відео-файл (.mov) і фото-файл (.jpg) з однаковим kCGImagePropertyMakerAppleDictionary → 17 (identifier). Без цього системний додаток Photos не сприймає файл як LivePhoto.
Обсяг робіт та терміни
При замовленні послуги під ключ ви отримуєте:
- Архітектурний документ з вибором моделі та обґрунтуванням.
- Інтеграцію обраного движка (MediaPipe, FOMM, SadTalker/LivePortrait).
- UI для вибору стилю анімації та тригера.
- Серверну частину (якщо обрана) з чергою завдань та статусами.
- Експорт в MP4/GIF/LivePhoto.
- Тестування на 10+ пристроях з різними версіями ОС.
- Документацію API та інструкцію з підтримки.
- Гарантію на код 3 місяці.
Орієнтири за термінами: on-device landmark-based анімація (одна платформа) — 3-4 тижні. Серверна інтеграція з SadTalker/LivePortrait + обидві платформи — 4-7 тижнів. Точні терміни залежать від складності анімації та необхідності on-device оптимізації.
Отримайте консультацію для точної оцінки вашого проєкту — зв'яжіться з нами, щоб обговорити деталі. Замовте реалізацію AI-анімації під ключ, і ми підберемо оптимальне рішення під ваш бюджет та терміни.







