Проверка видео на релевантность тематике через нейросеть

Заголовок Кейсы

Итак, продолжаем решать задачу (на самом деле она уже решена) по парсингу видео с Ютуба, и разметке полученных видео, для дальнейшего использования в своих целях.

В предыдущих сериях

В первой статье я рассказал, как спарсил 300к роликов с Ютуба используя самописный парсер — Парсинг Ютуб через официальный АПИ.

На втором шаге я развернул автоматический чеккер, который отсеивает 60-70% брака (это промежуточная проверка, которая призвана сэкономить бюджет) — проверка полученных видео на соответствие ключевому запросу.

Мы остановились на этапе, когда у нас есть n-ное количество видео роликов, помеченных разным score от 0 до 1 с шагом 0,1. Чем выше score, тем выше вероятность, что видео соответствует ключевому слову, осталось решить — доверяем ли мы на 100% текстовому фактору TF-IDF или сомневаемся и нужна еще одна проверка — нейросетью за деньги?

Я пошел по пути разбиения, принял как должное, что score 0,6 в принципе нормальный, но в рамках научного интереса решил прогнать полученные видео через третью проверку. Более навороченную и ресурсоемкую, ну и не бесплатную, конечно же.

Чем вам может быть полезен этот скрипт? Вы можете использовать его на своих массивах и размечать свои видео, если они у вас собраны автоматически и необходимо выполнять проверку на релевантность. Скрипт работает с любыми тематиками, главное правильно формулировать вопрос.

Как работает платная проверка видео с Ютуб

Скрипт производит автоматическую разметку роликов по двум произвольным критериям (например, «есть ли в кадре кошки?» и «говорят ли о квантовых компьютерах?»). Помимо того, что я описал выше этот скрипт помогает сформировать обучающие выборки, быстро просеять видеоколлекции и сократить ручной труд медиаредактора.

Архитектура решения

Архитектура
  1. Скачивание контента
    • Инструмент yt-dlp получает MP4-файл по ссылке из таблицы.
  2. Выделение модальностей
    • FFmpeg превращает видео в моно-WAV 16 кГц.
    • OpenCV выдёргивает пять равномерно распределённых кадров.
  3. Транскрипция
    • Whisper (openai.audio.transcriptions.create) конвертирует речь в текст.
  4. Мульти-модальный запрос

GPT-4o-Vision получает текст + 5 картинок + два вопроса:

Question1: Does this video relate to ‘<Criterion1>’?

Question2: Does this video relate to ‘<Criterion2>’?

  • System-prompt требует ответа только «yes» или «no».
  1. Пост-обработка
    • Скрипт превращает «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 обязателен — одна строка на ролик:

ПолеТипПример
urlstring(URL)https://youtu.be/dQw4w9WgXcQ
Criterion1stringCats
Criterion2stringQuantum Computing

Выходной CSV

ПолеТипОписание
urlstringИсходная ссылка
label_1int1 — «yes» на Question 1, 0 — «no»
label_2int1 — «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):

  1. Расшифровка речи
    Скорость речи ≈ 150 слов/мин ≈ 225 токенов/мин.
    ⇒ Speech_tokens = 225 × minutes.
  2. Кадры (low-detail)
    Image_tokens = 85 × images (при 512–768 px кадре это ≤ 1 тайл).
  3. Служебный промпт — ~100 токенов.

Вывод: при 5-кадровом запросе и 8-минутном ролике
Input_tokens ≈ (225×8) + (85×5) + 100 = 2 200.

Выход — пара «yes/no» ≈ 4 токена, стоимостью пренебрегаемо мала.

Что получаем в итоге

Масштаб проектаМин./роликРоликовWhisper $GPT input $GPT output $Итого $
Small PoC51003.000.830.013.84
Medium850024.005.810.0429.85
Large101 00060.0013.880.0873.96

Однако, не все ролики обязательно имеют длительность в 10 минут и выше, в среднем это от 3 до 6 минут. 

Мой опыт следующий, в среднем на 500 роликов я тратил от 7 до 10 баксов, в зависимости от выборки. Но вы опирайтесь на расчеты выше, чтобы не пролететь с бюджетом!

Оцените статью
autoparse.tech
Добавить комментарий