Реализация AI-автоматической генерации субтитров к видео в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация AI-автоматической генерации субтитров к видео в мобильном приложении
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    760
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    646
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1063
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    878
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    450

Реализация AI-автоматической генерации субтитров к видео в мобильном приложении

Субтитры через AI — это Whisper или его аналоги. Задача на первый взгляд простая: отдал видео, получил текст с таймкодами. Но в мобильном контексте появляется несколько нетривиальных вопросов: транскрибировать on-device или через API, как рендерить субтитры поверх видео, как дать пользователю отредактировать результат.

Whisper on-device vs API

Whisper через OpenAI API — самый простой путь. Отправляем аудио (до 25 MB), получаем JSON с segments (таймкоды + текст):

POST https://api.openai.com/v1/audio/transcriptions
model=whisper-1&response_format=verbose_json&timestamp_granularities[]=word

verbose_json с word-гранулярностью даёт таймкод каждого слова — нужно для синхронизации субтитров. Время обработки: ~10-секундный клип — 2–4 сек, минута видео — 10–20 сек.

Whisper on-device — реально для iOS 16+ через WhisperKit (swift-transformers). Модель whisper-small — 244 MB, скорость ~0.3× реального времени на iPhone 14 (т.е. минута аудио = 3 минуты обработки). whisper-tiny — 77 MB, 0.7× реального времени, но точность заметно хуже. Для русского языка — хуже, чем для английского.

На Android: whisper.cpp через JNI, или openai-whisper-tflite — но это сложнее в сборке. Проще для большинства приложений — API.

Извлечение аудио из видео на клиенте

Перед отправкой в Whisper нужно извлечь аудиодорожку — отправлять всё видео избыточно:

// iOS: AVAssetExportSession для извлечения аудио
func extractAudio(from videoURL: URL) async throws -> URL {
    let asset = AVURLAsset(url: videoURL)
    guard let exportSession = AVAssetExportSession(
        asset: asset, presetName: AVAssetExportPresetAppleM4A
    ) else { throw SubtitleError.exportFailed }

    let outputURL = FileManager.default.temporaryDirectory
        .appendingPathComponent(UUID().uuidString + ".m4a")
    exportSession.outputURL = outputURL
    exportSession.outputFileType = .m4a
    await exportSession.export()
    return outputURL
}

m4a/mp3 в 3–5 раз меньше оригинального видео — быстрее загружается и дешевле по API.

Сегменты субтитров: обработка на клиенте

Whisper verbose_json возвращает segments с start, end, text. Нарезаем по 5–7 слов на субтитр для читабельности:

// Android: разбивка на субтитры
data class SubtitleCue(val start: Double, val end: Double, val text: String)

fun segmentsToSubtitles(words: List<WhisperWord>, maxWords: Int = 7): List<SubtitleCue> {
    val cues = mutableListOf<SubtitleCue>()
    var chunk = mutableListOf<WhisperWord>()

    for (word in words) {
        chunk.add(word)
        if (chunk.size >= maxWords || word.word.endsWith(".") || word.word.endsWith("!")) {
            cues.add(SubtitleCue(
                start = chunk.first().start,
                end = chunk.last().end,
                text = chunk.joinToString(" ") { it.word.trim() }
            ))
            chunk.clear()
        }
    }
    if (chunk.isNotEmpty()) {
        cues.add(SubtitleCue(chunk.first().start, chunk.last().end,
            chunk.joinToString(" ") { it.word.trim() }))
    }
    return cues
}

Рендеринг субтитров поверх видео

Два подхода:

Overlay во время воспроизведенияUILabel/TextView поверх AVPlayerLayer/ExoPlayer. Обновляем текст по таймеру через player.currentTime(). Просто, не модифицирует исходный файл.

Запечённые субтитры — FFmpeg subtitles фильтр, сохраняет субтитры в пикселях видео. Постоянно видны при любом воспроизведении:

ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontName=Arial,FontSize=20,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Bold=1'" output.mp4

Для Stories/Reels нужны запечённые субтитры — при шаринге overlay потеряется. Для внутреннего плеера приложения — overlay достаточен.

Редактор субтитров

Часто пользователь хочет исправить ошибки транскрипции. Минимальный редактор:

  • Список SubtitleCue в RecyclerView/List
  • Tap на элемент → TextField для редактирования текста
  • Drag/resize для сдвига таймкодов
  • Preview в видеоплеере с обновлёнными субтитрами в реальном времени

Удобный UX: при редактировании текста — автоматически корректировать конец предыдущего / начало следующего субтитра.

Экспорт SRT/VTT

SRT — стандартный формат для экспорта:

1
00:00:01,200 --> 00:00:03,450
Привет, это тестовый текст

2
00:00:03,800 --> 00:00:06,100
Второй субтитр здесь

На мобиле пишем в FileManager.default.temporaryDirectory, шарим через UIActivityViewController/FileProvider.

Сроки

Транскрипция через Whisper API + базовый overlay player — 3–4 дня. Полная реализация с on-device транскрипцией, редактором, запечёнными субтитрами и экспортом SRT/VTT — 2–3 недели. Стоимость рассчитывается индивидуально.