Обработка видео и аудио: Временные метки и семантический анализ

50 минут Урок 7

Введение: Четвертое измерение в промпт-инжиниринге

Добро пожаловать на урок, который изменит ваше представление о работе с мультимодальными моделями. Ранее мы рассматривали изображения как статичные снимки реальности. Но мир находится в движении. Видео и аудио добавляют критически важный контекст — время.

В Gemini 3 API (наследующем архитектуру длинного контекста Gemini 1.5 Pro) видео — это не просто набор кадров, а непрерывный поток информации. Модель способна воспринимать визуальный ряд, звуковую дорожку и временную последовательность событий одновременно.

Чему вы научитесь сегодня:

  • Как Gemini «видит» видеофайлы и почему это отличается от покадрового анализа.
  • Техникам извлечения точных временных меток (timestamps) с точностью до секунды.
  • Семантическому анализу аудио: понимание интонаций, эмоций и фоновых шумов.
  • Созданию сложных пайплайнов для автоматической разметки контента.

1. Архитектура восприятия видео и аудио

Прежде чем писать код, важно понять физику процесса. В отличие от старых подходов, где видео разбивалось на кадры, переводилось в base64 и скармливалось модели, Gemini использует нативную мультимодальность.

Когда вы загружаете видео через File API, происходит следующее:

  1. Сэмплирование: Видео переводится в последовательность визуальных токенов (с частотой, например, 1 кадр в секунду, но с сохранением временной привязки).
  2. Аудио-процессинг: Звуковая дорожка обрабатывается параллельно, превращаясь в аудио-токены.
  3. Слияние контекста: Визуальные и аудио токены помещаются в контекстное окно в хронологическом порядке.

Почему это важно? Это позволяет модели отвечать на вопросы типа: «Почему персонаж повысил голос на 10-й минуте?». Модель «видит» выражение лица и «слышит» интонацию одновременно.

python
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.
  • Хронология: Просите модель перечислять события в хронологическом порядке.
  • Привязка к действию: Просите описать, что происходит визуально в этот момент, чтобы модель «сфокусировалась» на конкретных кадрах.

Рассмотрим пример, где нам нужно найти все голы в футбольном матче или ключевые моменты в презентации продукта.

python
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 — в аудио-семантике.

Модель слышит:

  • Эмоции: Сарказм, гнев, радость, неуверенность.
  • Невербальные звуки: Вздохи, стук клавиатуры, шум улицы, музыку.
  • Идентификацию спикеров: Различение голосов без предварительной разметки (диаризация на уровне смысла).

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

python
# Пример анализа аудио-файла для 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?