Итак, продолжаем решать задачу (на самом деле она уже решена) по парсингу видео с Ютуба, и разметке полученных видео, для дальнейшего использования в своих целях.
В предыдущих сериях
В первой статье я рассказал, как спарсил 300к роликов с Ютуба используя самописный парсер — Парсинг Ютуб через официальный АПИ.
На втором шаге я развернул автоматический чеккер, который отсеивает 60-70% брака (это промежуточная проверка, которая призвана сэкономить бюджет) — проверка полученных видео на соответствие ключевому запросу.
Мы остановились на этапе, когда у нас есть n-ное количество видео роликов, помеченных разным score от 0 до 1 с шагом 0,1. Чем выше score, тем выше вероятность, что видео соответствует ключевому слову, осталось решить — доверяем ли мы на 100% текстовому фактору TF-IDF или сомневаемся и нужна еще одна проверка — нейросетью за деньги?
Я пошел по пути разбиения, принял как должное, что score 0,6 в принципе нормальный, но в рамках научного интереса решил прогнать полученные видео через третью проверку. Более навороченную и ресурсоемкую, ну и не бесплатную, конечно же.
Чем вам может быть полезен этот скрипт? Вы можете использовать его на своих массивах и размечать свои видео, если они у вас собраны автоматически и необходимо выполнять проверку на релевантность. Скрипт работает с любыми тематиками, главное правильно формулировать вопрос.
Как работает платная проверка видео с Ютуб
Скрипт производит автоматическую разметку роликов по двум произвольным критериям (например, «есть ли в кадре кошки?» и «говорят ли о квантовых компьютерах?»). Помимо того, что я описал выше этот скрипт помогает сформировать обучающие выборки, быстро просеять видеоколлекции и сократить ручной труд медиаредактора.
Архитектура решения

- Скачивание контента
- Инструмент yt-dlp получает MP4-файл по ссылке из таблицы.
- Инструмент yt-dlp получает MP4-файл по ссылке из таблицы.
- Выделение модальностей
- FFmpeg превращает видео в моно-WAV 16 кГц.
- OpenCV выдёргивает пять равномерно распределённых кадров.
- Транскрипция
- Whisper (openai.audio.transcriptions.create) конвертирует речь в текст.
- Whisper (openai.audio.transcriptions.create) конвертирует речь в текст.
- Мульти-модальный запрос
GPT-4o-Vision получает текст + 5 картинок + два вопроса:
Question1: Does this video relate to ‘<Criterion1>’?
Question2: Does this video relate to ‘<Criterion2>’?
- System-prompt требует ответа только «yes» или «no».
- Пост-обработка
- Скрипт превращает «yes/ no» в 1/0 и сохраняет в CSV.
- Скрипт превращает «yes/ no» в 1/0 и сохраняет в CSV.
Диаграмму можно представить так (чтение слева направо):
YouTube URL ──▶ yt-dlp ──▶ MP4
├─▶ FFmpeg ──▶ WAV ──▶ Whisper ──▶ текст
└─▶ OpenCV ──▶ JPEG×5
текст + JPEG×5 ─▶ GPT-4o-Vision ─▶ yes/no → CSV
Формат входных данных
CSV-файл metadata.csv обязателен — одна строка на ролик:
| Поле | Тип | Пример |
| url | string(URL) | https://youtu.be/dQw4w9WgXcQ |
| Criterion1 | string | Cats |
| Criterion2 | string | Quantum Computing |
Выходной CSV
| Поле | Тип | Описание |
| url | string | Исходная ссылка |
| label_1 | int | 1 — «yes» на Question 1, 0 — «no» |
| label_2 | int | 1 — «yes» на Question 2, 0 — «no» |
Полный исходный код
Файл video_generic_openai.py приведён целиком в моем Гитхаб и готов к использованию без скрытых фрагментов или вырезок.
Быстрый старт
# 1. Установка зависимостей
pip install "openai>=1.13.3" yt-dlp pandas opencv-python Pillow
# 2. Экспорт ключа OpenAI
export OPENAI_API_KEY=sk-...
# 3. Запуск пайплайна
python video_generic_openai.py \
--metadata metadata.csv \
--videos_dir videos \
--results_out results.csv
После выполнения рядом появится results.csv, где каждому ролику поставлены две бинарные метки.
Можно ли модифицировать скрипт?
Если есть желание — вы можете модифицировать этот скрипт, доработать его, в частности:
- Больше критериев: добавьте колонки
Criterion3…Nи допишите вопросы в промпт. - Параллельная обработка: оберните цикл for
row in df.iterrows()вconcurrent.futures.ThreadPoolExecutor. - Кэш: проверяйте существование WAV/JPEG, чтобы не тратить токены повторно.
- Тонкая настройка FPS/кадров: параметр
sample_frames(video, n=N)меняется одной цифрой.
Для тех, кто не хочет разбираться в сложных терминах — как работает скрипт
Скрипт достает видео из ютуба (это тонкий момент, тут нужно внимательно смотреть и если ютуб обновится, вероятно понадобится допиливание), преобразует полученное видео в аудиоформат, достает первые 5 кадров и вместе с текстовым описанием, промтом, и аудиофайлом отправляет в Чат ГПТ, чтобы тот уже ответил на поставленные вопросы.
Тонкие моменты — чистые аудиодорожки без текста — если там музыка или тишина, скрипт детектирует это и пометит видео как нерелевантное, я делал так. В противном случае, пустой аудиофайл уменьшает вероятность правильного ответа, так как у нейросети меньше исходных данных и она может просто галлюцинировать.
Сколько стоит
Вот официальные лимиты, на которые можно ориентироваться при расчете бюджета
1. Ключевые лимиты API
| Компонент | Ограничение |
| Whisper-1 | Размер аудио ≤ 25 MB, иначе нужно резать на чанки |
| Цена — $0.006 за минуту аудио | |
| GPT-4o Vision | Стоимость токенов — input $5/1 M, output $20/1 M |
| Токены за картинку ≈ 85 + 170×tiles (512 px тайлы) | |
| Контекст ≤ 128 k токенов | |
| Скорость — лимиты масштабируются до 10 M TPM (токенов/мин) |
Считаем по такой формуле
Сost = Whisper_minutes × 0.006
+ GPT_input_tokens × 5 / 1 000 000
+ GPT_output_tokens × 20 / 1 000 000
Как оценить токены ввода (input):
- Расшифровка речи
Скорость речи ≈ 150 слов/мин ≈ 225 токенов/мин.
⇒ Speech_tokens = 225 × minutes. - Кадры (low-detail)
Image_tokens = 85 × images (при 512–768 px кадре это ≤ 1 тайл). - Служебный промпт — ~100 токенов.
Вывод: при 5-кадровом запросе и 8-минутном ролике
Input_tokens ≈ (225×8) + (85×5) + 100 = 2 200.
Выход — пара «yes/no» ≈ 4 токена, стоимостью пренебрегаемо мала.
Что получаем в итоге
| Масштаб проекта | Мин./ролик | Роликов | Whisper $ | GPT input $ | GPT output $ | Итого $ |
| Small PoC | 5 | 100 | 3.00 | 0.83 | 0.01 | 3.84 |
| Medium | 8 | 500 | 24.00 | 5.81 | 0.04 | 29.85 |
| Large | 10 | 1 000 | 60.00 | 13.88 | 0.08 | 73.96 |
Однако, не все ролики обязательно имеют длительность в 10 минут и выше, в среднем это от 3 до 6 минут.
Мой опыт следующий, в среднем на 500 роликов я тратил от 7 до 10 баксов, в зависимости от выборки. Но вы опирайтесь на расчеты выше, чтобы не пролететь с бюджетом!








