Что показано
Речи в ролике нет: whisper вернул одну точку. Всё держится на записи экрана с дашбордом «creator lab x jev» под заголовком «Decode @hormozi». Счётчик разобранных сценариев бежит от 14 до 447, счётчик ярлыков от 112 до 3 576, оценка стоимости от $0.0004 до $0.1713. Справа для каждого рилса карточка с тремя ярлыками (тема, крючок, структура), цитатой из речи и цифрами просмотров, под ней три типа крючка со счётчиками: Curiosity 133, Recognition 107, Result 63. Ниже человек за ноутбуком, поверх подписи и призыв написать в комментариях JEV. Этот дашборд не живой прогон, а режим записи «Recording studio» из Creator Lab: он проигрывает сохранённый результат для съёмки экрана (так сказано в README репозитория).
Почему это работает
Тут три части, и они делают разное. Скрапер отдаёт по каждому рилсу цифры и адреса: просмотры, лайки, ссылку на видео и отдельную ссылку на звук. Транскрипт актор Apify тоже умеет отдавать, но это платная опция (includeTranscript, $0.048 за начатую минуту ролика), и по умолчанию рассчитывать на неё не стоит. Автор её не берёт: в его инструменте речь расшифровывает Whisper v3 Turbo у Groq или Fireworks, и в описании ролика тоже сказано про Whisper. Третья часть это Jev, и он не чат-модель. Это «System One»-модель компании TypeSafe AI: вы присылаете текст и список типизированных вопросов, а назад получаете не абзац, а значения (выбор из вашего списка, оценка по вашей шкале или вероятность «да») с вероятностями и уверенностью. Все вопросы считаются параллельно по одному и тому же тексту. Поэтому «ярлык» приходит в формате, который код сразу кладёт в таблицу, без разбора строки.
Цифры автора сходятся по арифметике: 3 576 ярлыков на 447 сценариев это ровно 8 на ролик, а показаны в кадре только три. В исходниках инструмента все восемь названы: тема, первый ход, механизм крючка, структура, доказательства, эмоция, конкретность совета и призыв к действию в конце. Цена в кадре это сумма usage.input_tokens по ответам Jev, умноженная на $0.042 за миллион. $0.17 даёт около 4 млн токенов, то есть около 9 тыс. на ролик: инструмент посылает текст отдельно в каждый из восьми вопросов и ещё в вопросы про роль каждого куска речи (до 40 кусков на ролик). В вашей сборке с тремя вопросами выйдет заметно дешевле.
Ценность в стыке двух таблиц: ярлыки крючков, которые модель ставит по тексту, и просмотры, которые отдаёт скрапер, вместе показывают, какой тип начала работает именно у этого автора.
Кстати, ярлыки такого сорта (тема, тип начала, структура) наверняка поставит и обычная дешёвая LLM со структурированным выводом (это моё замечание, автор про это не говорит, и сравнения на своих данных у меня нет). Что добавляет Jev: бесплатные выходные токены, миллисекундные ответы (по заявлению вендора 70-500 мс) и вероятность по каждому варианту, по которой легко отсечь неуверенные ярлыки.
Как повторить
Ни один шаг я не гонял на живом ключе и реальном профиле, а код Creator Lab только прочитал, не запуская. Путь 1 сверен с README и docs/SETUP.md репозитория и с его исходниками (расценки, вызовы API, вопросы к Jev). В пути 2 шаги 1 и 2 сверены со страницей и публичным описанием актора Apify и локальным whisper-cli, шаги 3-5 с документацией TypeSafe и сигнатурой SDK, шаг 6 (таблица и график) восстановлен по подписи автора.
Путь 1. Готовый Creator Lab
- Поставьте Node.js (рекомендуют 24, минимум 22.9) и FFmpeg,
ffmpegиffprobeдолжны быть в PATH. На Mac:brew install ffmpeg, на Windows:winget install --id Gyan.FFmpeg --exact. - Скачайте инструмент и создайте конфиг (можно и «Code → Download ZIP» на странице репозитория):
git clone https://github.com/artemnovitckii/creator-lab.git
cd creator-lab
npm run setup Последняя команда копирует .env.example в .env, существующий .env она не трогает. Файл с точкой в Finder скрыт, откройте папку в редакторе кода.
- Заведите три ключа и впишите их в
.env:APIFY_TOKEN(Apify Console, настройки аккаунта, API и интеграции),TYPESAFE_API_KEY(ключ Jev на https://console.typesafe.ai/keys, если вас уже пустили из списка ожидания) и ключ одного сервиса расшифровки:GROQ_API_KEYс https://console.groq.com/keys илиFIREWORKS_API_KEYс https://app.fireworks.ai/. ЗначениеTRANSCRIPTION_PROVIDERдолжно совпадать с выбранным (groqилиfireworks, по умолчанию в файле стоитfireworks), ключ второго сервиса оставьте пустым. Платёжные данные и лимиты в каждом из трёх кабинетов включаете сами. - Проверьте и запустите:
npm run doctor
npm start- Нажмите «New analysis», впишите username без
@, поставьте 20 роликов, concurrency 2 и лимит Apify $1 (так советует инструкция репозитория). Это пилот. Откройте несколько роликов и сверьте ярлыки со скриптом. Если всё сходится, гоняйте больше: за один запуск инструмент берёт до 1 000 роликов одного аккаунта. Запуск можно поставить на паузу и продолжить, готовые расшифровки не оплачиваются второй раз.
Путь 2. Своя сборка на Python
- Откройте https://apify.com/apify/instagram-reel-scraper, войдите в аккаунт Apify, в поле username добавьте аккаунт конкурента, в лимит (
resultsLimit) поставьте около 500. Опции «включить транскрипт» и «скачать видео» выключите: обе платные ($0.048 за начатую минуту ролика и $0.02 за мегабайт на бесплатном тарифе). Нажмите Start. На бесплатном тарифе дают $5 кредита, по странице это почти 2 000 роликов. Скачайте результат в JSON: у каждого ролика там естьurl,shortCode,videoPlayCount,likesCount,videoDuration,captionи адресаaudioUrlиvideoUrl. - Расшифруйте речь. Ссылки
audioUrlиvideoUrlведут на CDN Instagram, живут недолго (в самой ссылке зашит параметр с датой окончания, а в описании актора сказано, что срок непредсказуем), поэтому скачайте звук сразу. БеритеaudioUrl, а если его нет,videoUrl: у части роликов звук лежит отдельно от видео. Дальше два варианта. Как в инструменте автора: отправить звук в Groq (whisper-large-v3-turbo, $0.04 за час звука, минимум 10 секунд на запрос, файл до 25 МБ на бесплатном тарифе). Или бесплатно и локально:
ffmpeg -i reel.mp4 -ar 16000 -ac 1 reel.wav
curl -L -o ggml-small.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin
mkdir -p transcripts
whisper-cli -m ggml-small.bin -f reel.wav -l auto -otxt -of transcripts/SHORTCODE Вместо SHORTCODE подставляйте значение shortCode ролика, тогда скрипт ниже сам найдёт текст. Программа ставится через brew install whisper-cpp, модель весит около 490 МБ. Нужна многоязычная модель (не .en): по умолчанию whisper-cli берёт английскую ggml-base.en.bin, и русскую речь она не разберёт. Формат входа у whisper-cli только flac, mp3, ogg и wav, поэтому mp4 сначала гоните через ffmpeg.
- Опишите вопросы. Категории ниже я взял из кадров ролика, определения к ним придумал сам. Настоящие определения автора (все восемь вопросов) лежат в файле
lib/schema.mjsрепозитория Creator Lab, их можно взять оттуда. Вариант «other» нужен, чтобы модель не натягивала ролик на ближайшую категорию:
import csv, json
from pathlib import Path
from typesafe_sdk import Choice, TypeSafeClient
client = TypeSafeClient() # ключ берёт из TYPESAFE_API_KEY
QUESTIONS = {
"topic": Choice(
instructions="What is the main topic of this reel script?",
criteria={
"business": "Running or growing a company",
"marketing": "Ads, leads, offers, funnels",
"mindset": "Habits, discipline, motivation",
"technology": "Tools, AI, software",
"other": "None of the above",
},
),
"hook": Choice(
instructions="What kind of hook does the opening of this script use?",
criteria={
"curiosity": "Opens a question or gap the viewer wants closed",
"recognition": "Describes a situation the viewer sees themselves in",
"result": "Opens with a concrete outcome or number",
"direct": "Addresses the viewer or states the offer at once",
"mistake": "Opens with an error or a warning",
"contradiction": "Attacks a common belief",
"other": "None of the above",
},
),
"structure": Choice(
instructions="How is this script structured?",
criteria={
"problem_solution": "A problem, then the fix",
"steps": "A numbered or sequential how-to",
"comparison": "Two things set against each other",
"opinion": "A stated position with support",
"explanation": "Explains how something works",
"qa": "A question and its answer",
"other": "None of the above",
},
),
}
reels = json.load(open("reels.json"))
rows = []
for r in reels:
f = Path("transcripts") / f"{r.get('shortCode')}.txt" # текст от whisper из шага 2
text = f.read_text().strip() if f.exists() else (r.get("transcript") or "").strip()
if not text:
continue
a = client.system_one(state=text, questions=QUESTIONS, model="jev-1.13.0").answers
rows.append({
"url": r.get("url"),
"plays": r.get("videoPlayCount"),
"likes": r.get("likesCount"),
"topic": a["topic"].choice,
"hook": a["hook"].choice,
"structure": a["structure"].choice,
})
with open("labeled.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=rows[0].keys())
w.writeheader()
w.writerows(rows)- Сначала прогоните 20 роликов, а не 500: откройте каждый и сравните ярлык со своим глазом. Если промахов больше одного из пяти, правьте описания в
criteria(граничные случаи и примеры кладите прямо в них, так советует документация), потом гоняйте всё. SDK по умолчанию повторяет запросы при 429 и 529. - Соберите таблицу: по каждому типу крючка число роликов и медиана просмотров, например через pandas (
groupby("hook")["plays"].median()). График «дата против просмотров, цвет по крючку», о котором говорит подпись автора, в кадрах не показан, поэтому это моя реконструкция. Выигрышный тип крючка даёт вам список 3-5 роликов, которые стоит разобрать руками. Вердикта скрипт не выдаёт.
Проверочный прогон
В Creator Lab пилот из 20 роликов должен закончиться без красных ошибок, а стоить примерно 5 центов у Apify (20 × $0.0026), около цента у Jev и центы за расшифровку. Откройте пять роликов через «Original Reel» и сверьте ярлыки со своим ощущением. Ролики без слов или с очень короткой речью инструмент исключает сам, это не сбой. Ярлыки с уверенностью ниже 0.65 или unclear он сам помечает на проверку (так в его коде).
В своей сборке: возьмите 20 роликов одного аккаунта и получите labeled.csv с непустыми topic, hook и structure на каждой строке. Откройте пять роликов и сверьте ярлык со своим: вы должны в основном соглашаться. Ещё два признака, что всё собрано правильно: доля «other» не выше пары десятков процентов, и ярлыки не слиплись в один. В кадре автора самый частый тип забрал 133 из 447, то есть около 30 %, остальные разошлись по другим. Если «curiosity» набрал 80-90 %, определения слишком широкие. Если ответ не приходит совсем, смотрите код: 401 значит неверный ключ, 429 и 529 значит лимит или перегрузка. Плюс стоимость: у ответа есть usage.input_tokens, на 20 роликов должны выйти доли цента.
Где это пригодится
Если вы ведёте канал или рилсы в нише, где у трёх-пяти конкурентов накопились сотни роликов, а решать, с чего начинать ролик, приходится на глаз, этот приём даёт вам данные вместо ощущения. То же работает на вашем собственном аккаунте: автор предлагает узнать, какие ваши крючки заходят вашей аудитории. И шире: любая связка «текст плюс метрика» (отзывы и оценки, тикеты поддержки и время закрытия, транскрипты звонков и результат сделки) ложится в ту же схему. Для русскоязычного аккаунта сначала проверьте на двух десятках роликов: документация честно пишет, что английский у Jev лучше остальных языков, а вопросы в Creator Lab написаны по-английски. Язык речи в его форме запуска можно указать двухбуквенным кодом (ru). Полный прогон я сам не собирал: проверил документацию, цены и формат ответа, а на живом ключе Jev не запускал.