Реализация AI-генерации изображений в мобильном приложении
Генерация изображений через Stable Diffusion, DALL·E 3 или Midjourney API — задача, в которой узкое место не алгоритм, а UX ожидания и управление ресурсами. Запрос к cloud-модели занимает 5–30 секунд, on-device генерация на мобильном — 10–60 секунд в зависимости от модели и устройства. Всё это время пользователь должен понимать, что происходит.
Cloud-генерация: DALL·E 3 и Stable Diffusion API
OpenAI Images API (POST /v1/images/generations) — самый простой путь. Запрос возвращает URL изображения или base64. Время ответа — 8–20 секунд для 1024×1024.
struct ImageGenerationRequest: Encodable {
let model: String // "dall-e-3"
let prompt: String
let n: Int // 1 (dall-e-3 не поддерживает > 1)
let size: String // "1024x1024"
let quality: String // "standard" или "hd"
let responseFormat: String // "url" или "b64_json"
enum CodingKeys: String, CodingKey {
case model, prompt, n, size, quality
case responseFormat = "response_format"
}
}
Replicate API даёт доступ к Stable Diffusion XL, FLUX и другим open-source моделям. Особенность — асинхронная модель: первый запрос возвращает prediction ID, затем нужно polling или webhook. На мобильном клиенте polling каждые 2 секунды с exponential backoff при ошибках:
suspend fun pollPrediction(predictionId: String): String {
var delay = 2000L
repeat(15) {
delay(delay)
val result = api.getPrediction(predictionId)
if (result.status == "succeeded") return result.output.first()
if (result.status == "failed") throw GenerationException(result.error)
delay = minOf(delay * 1.5, 8000L).toLong()
}
throw TimeoutException("Generation timed out")
}
On-device генерация через Core ML
Apple ML Research выпустила Stable Diffusion для Apple Silicon. На iPhone 15 Pro / M-серии iPad — ~20 секунд на 512×512, 20 шагов. На iPhone 12 — 60–90 секунд. Модель весит 2–6 ГБ в зависимости от квантизации.
import StableDiffusion
let pipeline = try StableDiffusionPipeline(
resourcesAt: modelDirectory,
controlNet: [],
configuration: .init()
)
pipeline.loadResources()
var config = StableDiffusionPipeline.Configuration(prompt: userPrompt)
config.stepCount = 20
config.guidanceScale = 7.5
config.seed = UInt32.random(in: 0...UInt32.max)
let images = try pipeline.generateImages(configuration: config) { progress in
DispatchQueue.main.async {
self.generationProgress = Double(progress.step) / Double(progress.stepCount)
}
return true // продолжить генерацию
}
Thermal throttling — реальная проблема. После 3–4 последовательных генераций iPhone сбрасывает производительность. Решение: пауза между генерациями, мониторинг ProcessInfo.thermalState, предупреждение пользователя.
На Android on-device Stable Diffusion работает через MediaPipe с LlmInferenceSession или напрямую через ONNX Runtime с GPU-делегатом. Поддержка значительно хуже, чем на Apple Silicon — рекомендую cloud-first подход для Android.
UX во время генерации
Прогресс-бар с реальным значением (не spinner) — критично для длинных операций. Stable Diffusion возвращает progress.step — используйте его. Показывайте промежуточные превью (latent-preview) начиная с 5-го шага — это удерживает внимание.
Отмена генерации: cloud-запрос можно отменить через URLSessionTask.cancel() или Replicate API POST /predictions/{id}/cancel. On-device — через флаг shouldContinue в колбэке прогресса.
Сохранение в галерею: PHPhotoLibrary.requestAuthorization(for: .addOnly) на iOS. Разрешение WRITE_EXTERNAL_STORAGE (до Android 9) или MediaStore.Images API. Запрашивайте разрешение только в момент первого сохранения, не при открытии экрана генерации.
Типичные ошибки
Content policy violations — DALL·E 3 отклоняет промпты с violence, NSFW, celebrity-контентом. На это нужна валидация промпта до отправки (OpenAI Moderation API) и понятное сообщение об ошибке. Не показывайте системное сообщение «Your request was rejected» — объясните, что именно нельзя.
Память на устройстве: on-device Stable Diffusion требует 4–6 ГБ RAM в пике. os_proc_available_memory() на iOS даёт понимание доступной памяти — если меньше 1 ГБ свободно, лучше fallback на cloud.
Процесс работы
Выбор архитектуры (cloud / on-device / hybrid). Интеграция выбранного API с обработкой async-паттернов (polling / webhook). UX генерации: прогресс, превью, отмена. Хранение и экспорт результатов. Обработка ошибок content policy и сети. Тестирование на range устройств — от бюджетных до флагманов.
Ориентиры по срокам
Cloud-генерация с базовым UI — 4–6 дней. On-device Stable Diffusion с latent-preview и thermal management — 2–3 недели.







