Как я за пять месяцев собрал Znich — ИИ-аналитику для авторов видео, в которой каждая фича родилась из боли

Как понять, почему один видос залетел, а другой нет?

Я задавал себе этот вопрос примерно полгода назад. Я маркетолог, и одна из задач, которую я регулярно решал, — понять, что именно делает у конкурента ролик с миллионом просмотров. YouTube Studio честно показывает цифры — удержание, источники трафика, CTR. Но цельного ответа в этих цифрах нет: его нужно собирать руками — что в ролике с этим CTR такого, чего нет у других, как это связано с обложкой, заголовком, первыми пятнадцатью секундами, ВИСП-структурой и тем, на какой ступеньке Лестницы Ханта стоит зритель.

Как я за пять месяцев собрал Znich — ИИ-аналитику для авторов видео, в которой каждая фича родилась из боли - 1

Сначала я искал ответы у блогеров-продюсеров. Получались крупицы — отдельные правила, иногда противоречащие друг другу. Потом начал мучить нейронку. И вот тут оказалось интересно: на одной транскрипции LLM уже выдавала вменяемый разбор. А когда я добавил к ней компьютерное зрение — чтобы модель видела ещё и кадры обложки, и отдельные сцены, — разбор стал качественно другим. Она начала объяснять не только «о чём это видео», но и «как оно сделано».

В декабре 2025 года я собрал из этого Telegram-бота для себя. К концу января он вырос в публичный сервис znich.ru. К апрелю в нём четырнадцать модулей, и для каждой фичи у меня была конкретная причина её сделать — обычно очень бытовая, в духе «блин, неудобно». Расскажу по порядку.

Сразу одна оговорка. Я маркетолог, не разработчик. То, что я называю кодом, опытный человек назовёт вайбкодингом, и это будет справедливо. Поэтому в статье я не показываю, «как правильно» с архитектурной точки зрения. Здесь история другого жанра: что не получалось, во что я упирался, что переделывал.

Оглавление

1. Анализ видео — точка, с которой всё началось

Когда я понял, что нейронка с компьютерным зрением выдаёт по одному видео разбор лучше, чем я сам собираю руками за полтора часа, первая мысль была: давайте обернём это в кнопку.

Архитектурно это работает так. Через yt-dlp (без скачивания) забираем метаданные — просмотры, лайки, ER, возраст ролика. Скачиваем самый лёгкий вариант видео (worst[ext=mp4] хватает: нам нужны кадры, а не качество). Через OpenCV вытаскиваем четыре кадра в позициях 5%, 35%, 65% и 90% — старт, развитие, кульминация, концовка. Параллельно гоним аудио через Whisper. Vision LLM (через RouterAI) получает метаданные, транскрипт и четыре base64-кадра — на выходе структурированный HTML-отчёт.

Четыре кадра — эмпирический оптимум: меньше — модель не видит структуру, больше — растёт стоимость токенов без выигрыша.

Структура отчёта — самая ценная часть в этой главе. Я долго подбирал, чтобы он не был «10 советов», а отвечал ровно на три вопроса: почему это видео залетело, что мне учесть в своей работе, к чему это приведёт. Плюс маркетинговый разрез — Лестница Ханта, ВИСП, целевые действия, — плюс отдельный блок по обложке: тип, человек/эмоция, текст, цвета, композиция.

Пример отчета. https://app.znich.ru/share/ALeymy7AV_pCq1E0DWVBN_2vS3C6cgT5

Самое неожиданное, что я обнаружил уже в процессе: ИИ замечает в обложках вещи, которые человек не вытаскивает на сознательный уровень. Например, что лицо в правом верхнем углу с эмоцией удивления статистически сильнее центрового портрета. Я знал эти эвристики и до того — но видеть, как модель регулярно выцепляет их из конкретного кадра без подсказки, было приятно.

2. Транскрибация и очередь к Whisper

Очень быстро стало понятно: для нормального анализа длинных видео LLM нужен текст. YouTube субтитры даёт нерегулярно, у TikTok и Reels их нет в принципе.

Сначала использовал OpenAI Whisper, но при переходе на единый API, перешёл на Groq Whisper-large-v3: часовое аудио он отрабатывает примерно за тридцать секунд. На этом моменте я понял, что хочу делать ещё и отдельный модуль «Транскрибация» — потому что иногда мне нужен был именно полный текст, а не разбор. Для коротких видео Znich отдаёт чистый транскрипт. Для длинных — структурированный конспект: краткая суть, ключевые моменты с таймкодами.

Пример отчета: https://app.znich.ru/share/mBcMAGGBbC_A9yT_8oCDCB1p1e-OsiPX

Здесь столкнулся с интересным моментом, о котором ранее не задумывался: у Groq есть лимит — 7200 секунд аудио в час на ключ. Когда несколько пользователей одновременно гоняют длинные видео, можно быстро упереться в лимит. Если просто слать запросы и ловить 429 — половина задач уйдёт в ошибку, пользователь увидит «попробуйте позже» и больше не вернётся.

Я сделал отдельный сервис WhisperQueue — синглтон-rate-limiter со скользящим окном. Идея простая: храним список «когда → сколько секунд аудио сожгли», чистим всё старше часа, считаем текущий расход. Если новая задача в окно не помещается — встаём в очередь и ждём, пока самая старая запись из окна выйдет. Концептуально:

class WhisperQueue:
    def __init__(self, limit_sec=7200, window_sec=3600, safety_buffer=60):
        self._limit = limit_sec - safety_buffer
        self._window = window_sec
        self._usage = []  # [(timestamp, duration_sec), ...]

    async def acquire(self, duration_sec, on_wait=None):
        while True:
            now = time.time()
            self._usage = [(t, d) for t, d in self._usage if now - t < self._window]
            used = sum(d for _, d in self._usage)
            if used + duration_sec <= self._limit:
                self._usage.append((now, duration_sec))
                return
            oldest_ts = self._usage[0][0]
            wait_sec = self._window - (now - oldest_ts) + 1
            if on_wait:
                await on_wait(wait_sec)
            await asyncio.sleep(wait_sec)

Колбэк on_wait даёт пользователю интерактив: бот пишет «жду очередь к Whisper, осталось ~40 секунд», и человек не уходит, потому что видит, что система живая.

С этой очередью я ни разу не упёрся в лимит Groq так, чтобы потерять задачу. Двести строк кода, которые сэкономили мне много седых волос.

3. SEO-описание: фича, которую пришлось вынести

Изначально я делал «Анализ видео» как комбайн: на одной странице — анализ + транскрипция + сгенерированное описание с хэштегами. Логика казалась очевидной.

Очевидной она оказалась только для меня. Через пару недель я заметил странную вещь: когда я анализировал видео конкурента, мне нужно было видеть его существующее описание — как он сам себя описал, какие хэштеги выбрал, что указал в первой строке. А мой комбайн вместо этого молча генерировал поверх новое SEO-описание для этого видео. Получалась фигня.

Разнёс на два модуля. «Анализ видео» теперь показывает оригинальное описание автора рядом с разбором. А отдельная вкладка «SEO-описание» — это уже инструмент для своего ролика: на вход ссылка, на выход — три-четыре абзаца под YouTube + ровно двадцать хэштегов с понятной структурой: пять широких + семь нишевых + пять длиннохвостовых + три брендовых.

Пример сгенерированного описания для видео

Пример сгенерированного описания для видео

Это не магия. Это шаблон, который разработал еще задолго до Znich, — но шаблон, который для своего ролика ранее заполнял минут двадцать, теперь отрабатывается за пятнадцать секунд.

Урок, который я вытащил из этой истории: «всё на одной странице» — не всегда удобно. Я этот же принцип потом применял несколько раз.

4. Анализ ниши: переход от «одного видео» к стратегии

В обратной связи стал чётко звучать другой вопрос: «А стоит ли мне вообще лезть в эту тему?». Пользователю мало понять, почему конкретный ролик залетел. Ему нужно понять, есть ли в нише место.

На вход — название ниши и до трёх каналов конкурентов. На выход — отчёт со структурой: показатели лидеров и market fit, контентные пробелы, визуальный код ниши, план действий на тридцать дней, прогноз монетизации и финальный вердикт «входить / не входить».

Пример отчета: https://app.znich.ru/share/ZG3PUKmgOO_lL83o_N53fTUAH68I9Flu

Технически нетривиальная часть — анализ обложки лидера. По каждому каналу-конкуренту определяем channel_id, забираем статистику, выбираем «лучшее видео» из последних тридцати, берём его обложку и прогоняем через отдельный Vision-промпт с JSON-ответом — тип, лицо/эмоция, текст, цвета, композиция. Все данные конкурентов плюс название ниши скармливаем стратегическому промпту.

Поначалу ссылки на каналы конкурентов нужно было копировать руками. Это тоже оказалось болью: пользователь часто знает свою нишу, но не знает, кто там лидер. Сделал автоподбор — channel_search.py. На вход название ниши, на выход топ релевантных каналов: LLM генерирует под нишу четыре поисковых запроса → YouTube API ищет каналы и видео по ним → собираем подписки/просмотры/частоту → фильтруем (минимум 1000 подписчиков, минимум 5 видео) → скорим по релевантности и активности.

5. Анализ канала: YouTube + Instagram, и где я сел

Следующий вопрос пришёл предсказуемо: «А можно так же, но про мой канал?». Появился модуль «Анализ канала». Сначала только YouTube, через две недели — Instagram через Apify.

Интерфейсно это две вкладки. «Анализ аккаунта» — AI-разбор «что залетает / что проваливается / паттерны заголовков / стратегия роста». «Анализ постов» — таблица с последними 30 видео, отсортированная по дате, с метриками. Когда пользователь открывает вкладку, фронтенд автоматически делает двухфазное обновление без списания баланса: подтягивает последние 30 постов, потом 31–80, мерджит со старыми по video_id. Открыл канал второй раз через неделю — увидел свежую статистику без оплаты.

Как я за пять месяцев собрал Znich — ИИ-аналитику для авторов видео, в которой каждая фича родилась из боли - 6

Теперь про факап.

С Instagram я довольно сильно сел. Площадка планомерно усложняет жизнь сторонним инструментам аналитики: за пару месяцев работы мне приходилось неоднократно переключаться и донастраивать. Параллельно я смотрел на запросы пользователей и видел, что Instagram-анализ не востребован близко так же, как YouTube-аналитика. Соотношение примерно один к десяти, при этом стоимость поддержки — наоборот, на порядок выше.

В какой-то момент я принял неприятное решение: временно заморозить направление. Механика осталась в коде целиком — и модели в БД, и сервис, и трекинг-воркер. Когда (если) спрос пойдёт — всё включится за пару дней доработок. Пока приоритет там, где спрос больше.

Эта история мне самому хорошо вправила мозги: можно сделать фичу технически правильно и при этом упереться в неблагодарную внешнюю среду. Решение «закрыть и не трогать» в этом случае — не поражение, а нормальная продуктовая гигиена.

6. Кошелёк: тарифы, которые пришлось убрать

Начинал я с обычной подписочной модели — несколько тарифов, в каждом свой набор лимитов. Это казалось логичным: классическая SaaS-схема.

Через пару месяцев стал виден неприятный паттерн: пользователь покупает тариф, делает один-два анализа, забывает, вспоминает через три недели, заходит — а тариф уже истёк. Платить второй раз — обидно, потому что он его толком не использовал. Возвращаться — лень.

Перешёл на pay-per-use через кошелёк. Минимальное пополнение — 1 ₽ (специально, чтобы человек мог попробовать с маленькой суммы), каждая операция списывает фиксированную сумму. Не пользуешься месяц — баланс лежит и ждёт.

Прайс открытый, и я сознательно не прячу его за «свяжитесь с нами». Платёжка — YooKassa, поддержка промокодов, уведомления о низком балансе на порогах 100, 50 и 0 ₽ — чтобы пользователь не уткнулся в ноль внезапно посередине рабочего дня.

7. ИИ-чат с контекстом сущности

Отчёт — это монолог. Через какое-то время становится очевидно, что пользователь хочет диалог: «Как улучшить крючок?», «Напиши пять идей для похожих видео», «Перепиши заголовок жёстче».

Сделал чат-панель прямо на странице видео, канала и ниши. Главное продуктовое решение — чат знает всю сущность целиком. Не «дайте мне ссылку, я посмотрю», а сразу: ему уже передан в системный промпт весь анализ, метрики, а для каналов — ещё и список постов с датами и метриками каждого.

Как я за пять месяцев собрал Znich — ИИ-аналитику для авторов видео, в которой каждая фича родилась из боли - 7

Технически все модели идут через единый шлюз RouterAI. У пользователя в дропдауне Claude, GPT, Gemini и Perplexity Sonar — последний удобен, когда нужны актуальные данные с поиском. Цена за сообщение видна прямо у названия модели — от 2 ₽ до 8 ₽.

Когда история чата превышает четыре тысячи токенов, отдельная дешёвая модель сжимает её в пересказ. Не оригинальный приём, но в сценарии «пользователь ведёт диалог по одной нише неделями» он сильно экономит.

8. Трекинг постов: первые 24 часа решают

Когда автор публикует видео, самое ценное окно для понимания «залетит/не залетит» — первые 24 часа. Скорость роста просмотров в первый час, динамика лайков, появление комментариев.

Открываешь канал, на вкладке «Анализ постов» галочкой отмечаешь нужные ролики, выбираешь интервал — 15 минут / 30 минут / 1 час / 6 часов / 24 часа / неделя — и система сама ходит и снимает метрики.

Как я за пять месяцев собрал Znich — ИИ-аналитику для авторов видео, в которой каждая фича родилась из боли - 8

Под капотом — фоновый воркер, который крутится на asyncio.create_task со старта приложения. Каждые десять минут выбирает активные записи трекинга с next_check_at <= now, ходит за свежими метриками, складывает снимок в youtube_video_snapshots, обновляет next_check_at. Стоимость одной проверки — 1 ₽. При нулевом балансе трекинг сам деактивируется, бот пишет «баланс ушёл в ноль, остановил трекинг таких-то постов, вот ссылка пополнить». Уважение к деньгам пользователя — та вещь, на которой сложно сэкономить и легко потерять доверие.

9. RouterAI и Groq: страховка от одного провайдера

Вначале у меня в коде были три разных SDK — OpenAI, Anthropic, Google. Каждый со своим клиентом, ошибками, биллингом. Когда добавлялась четвёртая модель, нужно было писать четвёртый адаптер.

В апреле я перенёс все LLM-операции на единый шлюз RouterAI и оставил Groq отдельно — только для транскрипции, потому что он пока самый быстрый Whisper по соотношению цена/время.

Что дало переключение. Один SDK (OpenAI-совместимый клиент). Один формат запросов и ответов. Один счёт за всю LLM-инфраструктуру. Добавление новой модели = строчка в БД-таблице ai_models, а не релиз кода: видишь, что у RouterAI появилась anthropic/claude-sonnet-4.7 — добавил в админку, пользователи в дропдауне видят её через пять минут. Если у одного провайдера упадёт API или вырастет цена — переключаю модели на другого без релиза. Это страховка, которая внутри маленькой команды важнее, чем кажется.

10. Скриннер ниш — самая большая фича

Все предыдущие фичи отвечали на запрос «расскажи про вот эту нишу/канал/видео». Но есть запрос принципиально другой: «найди мне нишу». Как из тысяч возможных тем выбрать пять, где низкая конкуренция и при этом растущий спрос?

Скриннер принимает на вход «хочу N ниш в регионе RU» и выдаёт ранжированную таблицу с вердиктами «Отличная / Перспективная / Средняя / Слабая». Это самая дорогая в разработке фича за пять месяцев — потребовала отдельной БД-схемы, своих воркеров, SSE для прогресса, шаблонов скоринга и AI-саммари.

Как я за пять месяцев собрал Znich — ИИ-аналитику для авторов видео, в которой каждая фича родилась из боли - 9

Два режима. Автопоиск: выбираешь шаблон скоринга, регион (RU/GLOBAL), количество ниш. Система берёт из шаблона базовые сиды → расширяет через YouTube Suggest API → прогоняет через Google Trends на pre-screen, отсеивая мёртвые и сезонные → топ оставшихся идёт в полный анализ. По вирусным видео: алгоритм, который мне самому понравился больше всего. Берём топ вирусных видео категории на YouTube, фильтруем тех, у кого канал маленький (до N подписчиков), через GPT-4o-mini вытаскиваем из заголовков нишевые темы. То есть пользователь получает ниши, в которых маленькие каналы прямо сейчас выстреливают, — это сигнал, что в нише есть пробитие.

Полный анализ одной ниши. Поиск каналов через YouTube API с фильтром «1k–20k подписчиков» — это окно, где маленькому новичку реально конкурировать. Сбор статистики каналов и видео. Google Trends за 12 месяцев через pytrends — считаем avg_level (средний уровень за год) и breakout_score — отношение пика последних четырёх недель к пику года, в процентах. Если breakout >= 70 — это явный сигнал растущего тренда. Дислайки через returnyoutubedislike.com — обратная связь аудитории, которой нет в публичном API после изменений 2021 года. Скоринг по шаблону: у каждой метрики есть вес, тип нормализации (linear / log / sigmoid / inverted) и опциональное cutoff-условие. На выходе — итоговый балл 0–10.

Прогресс через SSE. Пайплайн долгий — на батч из десяти ниш уходит несколько минут. Без обратной связи пользователь уйдёт. Сделал поток событий: prescreen_tick (один кандидат проверен), job_done (анализ одной ниши завершён, в payload — niche_name, score, verdict), batch_done. Фронтенд строит таблицу инкрементально: ниша появляется в списке сразу же, как только её анализ завершается. Это даёт ощущение, что система работает, а не зависла.

AI-саммари батча. После завершения через GPT-4o-mini генерирую короткое саммари: «самая лёгкая ниша для старта», «лучший потенциал просмотров», «самая жизнеспособная по совокупности». Три рекомендации, сравнивающие все ниши в батче между собой. Полезно, когда у пользователя десять ниш на руках и он не хочет читать полные карточки всех — нужен путеводитель.

Как я за пять месяцев собрал Znich — ИИ-аналитику для авторов видео, в которой каждая фича родилась из боли - 10

Что сейчас в работе

Не дорожная карта, а несколько направлений, которые в работе или рядом и скоро поедут на бой:

  • Поиск трендов — модуль, который ищет вирусные видео маленьких каналов (1K–100K подписчиков) по ключевому слову. Скриннер отвечает на «куда заходить вдолгую», поиск трендов — на «что снять прямо сейчас, чтобы попасть в волну». Пайплайн собран, дорабатываю UI и формулу viral_score.

  • Свой аналитический контур. К апрелю в Znich стало больше десяти модулей, и я поймал себя на ощущении, что не понимаю своих пользователей. У меня были чужие метрики, но не было своих. Сейчас пилю единый event-лог в той же PostgreSQL, атрибуцию first/last touch через anonymous_id, событие активации (первый успешный анализ + просмотр результата минимум 30 секунд) и реферальную программу, в которой счётчик инкрементируется не при регистрации приглашённого, а при его активации. Всё это — чтобы строить триггеры и автоматизации прямо из БД.

Если бы меня спросили, что я сделал бы по-другому — раньше начал бы фиксировать события и атрибуцию. Если у тебя продукт хотя бы на десять платящих пользователей — заведи свой event-лог. Это тридцать строк кода и одна таблица.

И второе, неожиданное для меня самого: маленький проект на стадии «маркетолог + LLM + неловкий код» вполне может работать. Не как замена «правильного» SaaS — а как продукт, у которого внятная аудитория и понятная ценность. У меня сейчас меньше сотни платящих пользователей, средний чек 200–300 ₽, и я ими горжусь сильнее, чем гордился бы тысячей случайных регистраций в красивой админке.

Каждая фича родилась из конкретного «блин, неудобно». Если у вас в работе с видео есть собственное «блин, неудобно» — попробуйте Znich, возможно, оно уже там решено. Если нет — напишите, я добавлю.

Потыкать можно на znich.ru.

Автор: Alextos

Источник

Оставить комментарий