Обработка видео и аудио: Временные метки и семантический анализ
Введение: Четвертое измерение в промпт-инжиниринге
Добро пожаловать на урок, который изменит ваше представление о работе с мультимодальными моделями. Ранее мы рассматривали изображения как статичные снимки реальности. Но мир находится в движении. Видео и аудио добавляют критически важный контекст — время.
В Gemini 3 API (наследующем архитектуру длинного контекста Gemini 1.5 Pro) видео — это не просто набор кадров, а непрерывный поток информации. Модель способна воспринимать визуальный ряд, звуковую дорожку и временную последовательность событий одновременно.
Чему вы научитесь сегодня:
- Как Gemini «видит» видеофайлы и почему это отличается от покадрового анализа.
- Техникам извлечения точных временных меток (timestamps) с точностью до секунды.
- Семантическому анализу аудио: понимание интонаций, эмоций и фоновых шумов.
- Созданию сложных пайплайнов для автоматической разметки контента.
1. Архитектура восприятия видео и аудио
Прежде чем писать код, важно понять физику процесса. В отличие от старых подходов, где видео разбивалось на кадры, переводилось в base64 и скармливалось модели, Gemini использует нативную мультимодальность.
Когда вы загружаете видео через File API, происходит следующее:
- Сэмплирование: Видео переводится в последовательность визуальных токенов (с частотой, например, 1 кадр в секунду, но с сохранением временной привязки).
- Аудио-процессинг: Звуковая дорожка обрабатывается параллельно, превращаясь в аудио-токены.
- Слияние контекста: Визуальные и аудио токены помещаются в контекстное окно в хронологическом порядке.
Почему это важно? Это позволяет модели отвечать на вопросы типа: «Почему персонаж повысил голос на 10-й минуте?». Модель «видит» выражение лица и «слышит» интонацию одновременно.
import google.generativeai as genai
import time
# Настройка API (предполагается, что ключ уже в окружении)
genai.configure(api_key="YOUR_API_KEY")
def upload_and_process_video(file_path):
"""
Загружает видео через File API и ожидает завершения обработки.
"""
print(f"Загрузка файла: {file_path}...")
video_file = genai.upload_file(path=file_path)
print(f"Обработка файла: {video_file.name}...")
# Ожидание готовности файла на серверах Google
while video_file.state.name == "PROCESSING":
print(".", end="", flush=True)
time.sleep(5)
video_file = genai.get_file(video_file.name)
if video_file.state.name == "FAILED":
raise ValueError("Не удалось обработать видеофайл.")
print(f"\nФайл готов! URI: {video_file.uri}")
return video_file
# Пример использования
# my_video = upload_and_process_video("meeting_recording.mp4")
2. Магия временных меток (Timestamps)
Одна из самых мощных возможностей Gemini — способность указывать, когда произошло событие. Однако, LLM по своей природе склонны к галлюцинациям, если не задать жесткие рамки.
Правила промптинга для таймкодов:
- Явный формат: Всегда требуйте формат
MM:SSилиHH:MM:SS. - Хронология: Просите модель перечислять события в хронологическом порядке.
- Привязка к действию: Просите описать, что происходит визуально в этот момент, чтобы модель «сфокусировалась» на конкретных кадрах.
Рассмотрим пример, где нам нужно найти все голы в футбольном матче или ключевые моменты в презентации продукта.
def analyze_video_timeline(video_file):
model = genai.GenerativeModel(model_name="gemini-1.5-pro-latest")
prompt = """
Проанализируй это видео презентации продукта.
Создай хронологический список ключевых функций, которые были продемонстрированы.
Формат вывода строго такой:
- [MM:SS] Название функции: Краткое описание того, что происходит на экране.
Будь точен с временными метками.
"""
response = model.generate_content(
[video_file, prompt],
request_options={"timeout": 600} # Видео требует времени на обдумывание
)
return response.text
# print(analyze_video_timeline(my_video))
3. Семантический анализ аудио: Больше, чем текст
Частая ошибка разработчиков — использовать Gemini просто как дорогой инструмент транскрипции (Speech-to-Text). Для простого текста есть более дешевые модели. Сила Gemini 3 — в аудио-семантике.
Модель слышит:
- Эмоции: Сарказм, гнев, радость, неуверенность.
- Невербальные звуки: Вздохи, стук клавиатуры, шум улицы, музыку.
- Идентификацию спикеров: Различение голосов без предварительной разметки (диаризация на уровне смысла).
Представьте, что вы анализируете звонки в службу поддержки. Транскрипция скажет вам, что клиент сказал «Спасибо большое». Семантический анализ аудио скажет вам, что это было сказано с глубоким сарказмом и агрессией.
# Пример анализа аудио-файла для call-центра
def analyze_audio_sentiment(audio_path):
# Загружаем аудио (аналогично видео)
audio_file = genai.upload_file(path=audio_path)
# Ждем процессинга...
while audio_file.state.name == "PROCESSING":
time.sleep(2)
audio_file = genai.get_file(audio_file.name)
model = genai.GenerativeModel("gemini-1.5-pro-latest")
prompt = """
Прослушай аудиозапись разговора клиента и оператора.
1. Определи общую тональность разговора.
2. Найди момент (таймкод), когда клиент начал нервничать или повышать голос.
3. Укажи, был ли оператор вежлив или перебивал (приведи таймкоды перебиваний).
Верни ответ в формате JSON:
{
"overall_sentiment": "string",
"escalation_point": "MM:SS",
"operator_interruptions": ["MM:SS", "MM:SS"]
}
"""
response = model.generate_content(
[audio_file, prompt],
generation_config={"response_mime_type": "application/json"}
)
return response.text
4. Продвинутая техника: «Иголка в стоге сена» для видео
Одной из главных проблем RAG (Retrieval Augmented Generation) на видео является поиск конкретного визуального факта в часовом ролике. Gemini обладает огромным контекстным окном (до 2M+ токенов), что позволяет загружать целые фильмы.
Кейс: У вас есть запись с камеры видеонаблюдения за 2 часа. Вам нужно найти момент, когда «красная машина паркуется в неположенном месте».
Для этого мы используем технику «Визуального якорения». В промпте мы просим модель сначала описать сцену в общих чертах, а затем сузить поиск до конкретных объектов.
Совет: Если видео слишком длинное (более 2-3 часов), лучше разбить его на чанки по 45-60 минут, обработать их параллельно, а затем агрегировать результаты. Хотя контекстное окно позволяет больше, точность поиска мелких деталей на сверхдлинных дистанциях может снижаться.
Создайте генератор оглавления для YouTube-видео. Вам дано видео (представьте, что у вас есть файл 'lecture.mp4'). Напишите промпт и код на Python, который вернет список глав (Chapters) с таймкодами и кратким заголовком для каждой темы. Главы не должны быть короче 2 минут.
5. Типичные ошибки и Troubleshooting
При работе с мультимодальным API вы можете столкнуться со следующими проблемами:
- «I don't see that»: Модель утверждает, что чего-то нет на видео, хотя это там есть.
Решение: Убедитесь, что объект достаточно крупный. Если событие очень короткое (менее 1 сек), модель может пропустить его при сэмплировании. Попробуйте попросить модель описать видео «секунда за секундой» в нужном диапазоне. - Сдвиг времени: Таймкоды смещены на 5-10 секунд.
Причина: Особенности токенизации видео.
Решение: Используйте системный промпт: «Ты — эксперт по видеомонтажу, точность таймкодов критически важна». Обычно это повышает внимание модели к временной шкале. - File Processing Error: Ошибка при загрузке.
Решение: Проверьте кодек. H.264 (MP4) — самый безопасный и поддерживаемый формат.
Какой подход наиболее эффективен для поиска конкретной эмоции (например, сарказма) в аудиозаписи с помощью Gemini API?