AI-модерація контенту (відео) в мобільних додатках
Користувач завантажує відео — у вас є секунди, щоб вирішити, показувати його іншим. Ручна перевірка не масштабується. Поставити відео в очередь та показати через 10 хвилин — втратити користувача. Завдання: автоматична класифікація контенту відео прямо в момент завантаження або перед публікацією з мінімальним процентом хибних позитивів.
Де частіше виникають проблеми
Модерація у реальному часі vs постобробка
Найчастіший архітектурний просчет — намагатися гнати відео через модель покадрово на клієнті. CoreML на iPhone 14 Pro справляється з MobileNet v3 при 30 fps на коротких роликах, але це вбиває батарею та нагріває пристрій. На Android схожа картина з MediaPipe: обробка кожного кадру в ImageAnalysis.Analyzer при 1080p приводить до ImageProxy backlogs та крешів з java.lang.IllegalStateException: Image is already closed.
Правильний підхід для відео — не покадровий аналіз, а вибірковий: кожні N кадрів або ключові сцени через AVAssetImageGenerator (iOS) / MediaMetadataRetriever.getFrameAtTime() (Android). Для більшості завдань модерації достатньо 1 кадру на секунду.
Серверна модерація через Video Intelligence API
Для додатків з UGC-відео побудуйте таку схему: клієнт завантажує відео в сховище (S3/GCS), спускає Cloud Function, яка викликає Google Video Intelligence API з фічами EXPLICIT_CONTENT та OBJECT_TRACKING. Відповідь — JSON з часовими мітками та оцінками confidence на кожний сегмент.
// Android: запуск завантаження та передача URI на backend
val uploadRef = storageRef.child("uploads/${UUID.randomUUID()}.mp4")
uploadRef.putFile(localUri)
.addOnSuccessListener { taskSnapshot ->
taskSnapshot.storage.downloadUrl.addOnSuccessListener { downloadUri ->
moderationApi.submitVideo(downloadUri.toString(), onComplete = { result ->
when (result.verdict) {
ModerationVerdict.SAFE -> publishVideo()
ModerationVerdict.UNSAFE -> rejectWithReason(result.reason)
ModerationVerdict.REVIEW -> sendToHumanReview()
}
})
}
}
AWS Rekognition Video — альтернатива з аналогічним API: StartContentModeration + polling через GetContentModeration. Для синхронних сценаріїв (короткі reels до 30 сек) підходить Rekognition Image, застосований до вилучених кадрів — відповідь за 200–400 мс.
On-Device передфільтрація
Перед відправкою на сервер імає сенс прогнати перший та останній кадри відео через локальну CoreML / TFLite модель. Це відсікає очевидний NSFW ще на клієнті та економить трафік. Модель типу NudeNet Lite в TFLite форматі займає близько 14 MB і дає точність ~92% на бенчмарках NSFW-датасетів. Хибні спрацювання на медичному контенті — окрема історія, потребує whitelist-логіки на рівні категорії додатка.
Як ми будуємо рішення
Стек залежить від вимог до latency та бюджету. Для стартапів з малим трафіком — Google Video Intelligence API: платите тільки за оброблені хвилини, не потрібна інфраструктура. Для високозавантажених платформ — власний inference-сервіс на базі CLIP або користувальницької ONNX-моделі за reverse proxy з кешуванням хешів уже перевірених відео (перцептивний хешинг через pHash запобігає повторній модерації одного й того ж ролика).
На клієнті (iOS/Android/Flutter) реалізуємо:
- прогрес-бар завантаження з
URLSession.uploadTask/okhttp3.MultipartBody - pending-стан відео в ленті ("на перевірці")
- пуш-уведомлення про результат через FCM/APNs
Окремий кейс — live-стрімінг. Тут Video Intelligence API не підходить через latency. Використовуємо потоківку через WebRTC + аналіз HLS-сегментів на сервері кожні 2–4 секунди з моделлю, оптимізованою під швидкість (MobileViT-S у TorchScript).
Процес
Аудит вимог: тип контенту (UGC, Stories, live), допустима затримка публікації, вимоги до compliance (GDPR, COPPA).
Вибір стека: on-device передфільтр + хмарна модерація vs повністю серверна.
Розробка: інтеграція SDK завантаження, webhook/polling для результатів, UI статусів.
Тестування на датасеті edge-cases: багатомовні субтитри в кадрі, медичний контент, мультиплікація.
Ориентири за часовими рамками
Інтеграція з Google Video Intelligence або AWS Rekognition Video — 3–5 днів. Додавання on-device передфільтра на CoreML/TFLite — ще 2–3 дні. Повне рішення з live-стримингом та системою human review — 3–4 тижні.







