Мультимодальный ИИ

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

Долгое время ИИ был односенсорным.

  • Текстовый ИИ мог обрабатывать только текст, например, можно было попросить ChatGPT написать статьи.

  • ИИ для изображений мог обрабатывать только картинки, например, можно было попросить Midjourney нарисовать изображения.

  • Аудио-ИИ мог обрабатывать только звук, например, можно было попросить Whisper расшифровать речь.

Но реальный мир мультимодален: когда мы читаем книги, мы видим иллюстрации; когда смотрим фильмы, там есть изображение и звук; а когда общаемся с другими, мы наблюдаем выражения лиц и интонацию.

Мультимодальный ИИ — это ИИ, который способен одновременно понимать и генерировать несколько типов контента, словно дать ИИ глаза, уши и рот, позволяя ему взаимодействовать с миром более близким к человеку способом.

Практический пример: вы даёте ИИ фотографию кассового чека, он может распознать текст на ней (OCR), понять, какие товары были куплены, помочь вам оформить их в таблицу и даже прочитать это вслух. Это типичная мультимодальная задача.


Что такое мультимодальный ИИ

Сначала уточним несколько базовых понятий.

Одномодальный vs мультимодальный

Модальность — это форма, в которой выражается информация.

Текст, изображения, аудио и видео — всё это разные модальности.

TypeОписаниеТипичные продукты
Одномодальный ИИМожет обрабатывать только одну модальностьРанний GPT-3 (только текст), Stable Diffusion (только изображения)
Мультимодальный ИИМожет обрабатывать несколько модальностей одновременноGPT-4o, Claude 3, Gemini

Ключевой прорыв мультимодального ИИ заключается в следующем:он может преобразовывать информацию из разных модальностей в общий язык для понимания。

Например, увидев изображение «кошки», он может преобразовать изображение в вектор (набор чисел); увидев слово «кошка», он также может преобразовать его в вектор. Эти два вектора близки в математическом пространстве, потому что представляют одно и то же понятие.

Основные вызовы мультимодального ИИ

Мультимодальность звучит просто, но на практике это очень сложно.

  • Первая проблема — «выравнивание»: как сделать так, чтобы «кошка» на изображении и «кошка» в тексте воспринимались моделью как одно и то же?

  • Вторая проблема — «слияние»: когда одновременно видишь изображение и фрагмент текста, как объединить их информацию?

  • Третья проблема — «генерация»: как сгенерировать изображение на основе текстового описания или сгенерировать текстовое описание на основе изображения?

  • К счастью, эти проблемы постепенно решаются. После 2024 года почти все ведущие большие модели стали мультимодальными.


Понимание изображений (зрение)

Понимание изображений — это умение ИИ понимать изображения: описывать содержимое, распознавать текст, анализировать графики и замечать детали.

Современные ведущие большие модели теперь поддерживают ввод изображений.

Обычно есть два способа его использования:

  • Первый — загрузить файл изображения напрямую, например, нажав на значок изображения в веб-версии ChatGPT, чтобы загрузить его.

  • Другой способ — встроить изображение в API-запрос с помощью кодировки Base64, что подходит для программных вызовов.

МодельСпособы ввода изображенийПоддерживаемые форматы изображений
GPTURL, Base64, прямая загрузкаJPG、PNG、WEBP、GIF
ClaudeBase64, прямая загрузкаJPG、PNG、WEBP、GIF
GeminiПрямая загрузка, Google DriveJPG、PNG、WEBP

Типичные задачи компьютерного зрения включают:

  • Описание изображения — Что изображено на этой картинке?

  • OCR — Извлечение текста из изображения.

  • Анализ диаграмм — Что показывает нам эта столбчатая диаграмма?

  • Обнаружение деталей — Помогите проверить этот черновик дизайна на наличие проблем.

Практика: вызов GPT-4o Vision API с помощью Python

Давайте рассмотрим полный пример — использование API для анализа изображения.

Пример

# ============================================
# Файл: example_vision_demo.py
# Функция: анализ изображений с помощью GPT-4o Vision API
# ============================================

import base64
import requests
import os

# Настройте ключ API (пожалуйста, замените его на свой настоящий ключ)
# Получите его здесь: https://platform.openai.com/api-keys
OPENAI_API_KEY = "sk-your-api-key-here"
OPENAI_API_URL = "https://api.openai.com/v1/chat/completions"


def encode_image_to_base64(image_path: str) -> str:
    """
Закодируйте локальный файл изображения в строку Base64
Это формат передачи, требуемый API
    """

    with open(image_path, "rb") as image_file:
        # Прочитайте двоичное содержимое файла и закодируйте его с помощью Base64
        base64_data = base64.b64encode(image_file.read()).decode("utf-8")
        return base64_data


def analyze_image_with_gpt4o(
    image_path: str,
    prompt: str = "Пожалуйста, опишите содержание этого изображения подробно.",
    model: str = "gpt-4o"
) -> str:
    """
Используйте GPT-4o Vision API для анализа изображения

Описание параметра:
image_path: Путь к локальному файлу изображения (например, "example_test.jpg")
prompt: Вопрос, который вы хотите задать, или задача, которую должен выполнить ИИ
model: Имя используемой модели (по умолчанию gpt-4o)

Возвращает:
Текст результата анализа ИИ
    """

    # Шаг 1: Закодировать изображение в Base64
    base64_image = encode_image_to_base64(image_path)

    # Шаг 2: Сформировать заголовки запроса
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {OPENAI_API_KEY}"
    }

    # Шаг 3: Сформировать тело запроса
    # Примечание: Содержимое изображения передаётся через поле image_url в формате "data:image/jpeg;base64,..."
    payload = {
        "model": model,
        "messages": [
            {
                "role": "user",
                "content": [
                    # Первая часть — это текстовый запрос
                    {"type": "text", "text": prompt},
                    # Вторая часть — это изображение
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/jpeg;base64,{base64_image}"
                        }
                    }
                ]
            }
        ],
        "max_tokens": 1000  # Ограничить длину вывода, чтобы избежать высоких затрат
    }

    # Шаг 4: Отправить API-запрос
    print(f"Анализ изображения: {image_path} ...")
    response = requests.post(OPENAI_API_URL, headers=headers, json=payload)

    # Шаг 5: Обработать ответ
    if response.status_code == 200:
        result = response.json()
        # Извлечь ответ ИИ
        answer = result["choices"][0]["message"]["content"]
        return answer
    else:
        # Выводить подробную информацию об ошибке при возникновении ошибки
        error_msg = f"Ошибка запроса: {response.status_code} - {response.text}"
        print(error_msg)
        return error_msg


def extract_text_from_image(image_path: str) -> str:
    """
Специально для OCR: извлечение текста из изображений
    """

    prompt = """
Пожалуйста, извлеките весь текст из этого изображения.
Требования:
1. Точно воспроизведите текст, ничего не пропускайте
2. Сохраняйте исходные абзацы и форматирование
3. Если есть таблицы, выводите их в виде таблиц
4. Если в изображении нет текста, сообщите об этом
Это тест OCR из руководства EXAMPLE.
    """

    return analyze_image_with_gpt4o(image_path, prompt)


def analyze_chart(image_path: str) -> str:
    """
Специально для анализа диаграмм
    """

    prompt = """
Пожалуйста, проанализируйте эту диаграмму.
Пожалуйста, ответьте на следующие вопросы:
1. Какой это тип диаграммы (столбчатая, линейная, круговая и т. д.)?
2. Каков заголовок диаграммы и что означают оси?
3. Какую основную мысль передаёт диаграмма?
4. Есть ли заметные тенденции или аномалии?
Это тест анализа диаграмм из руководства EXAMPLE.
    """

    return analyze_image_with_gpt4o(image_path, prompt)


# ============================================
# Основная программа: демонстрация различных задач анализа изображений
# ============================================

if __name__ == "__main__":
    # Предположим, у нас есть тестовое изображение (вам нужно подготовить реальное изображение)
    # Это может быть: фотография товара, скриншот, фотография документа, диаграмма и т. д.
    test_image = "example_test_image.jpg"

    # Проверить, существует ли изображение
    if not os.path.exists(test_image):
        print(f"Совет: подготовьте изображение, назовите его {test_image} и поместите его в текущий каталог")
        print("Или измените путь к изображению в коде")
    else:
        # Задача 1: Общее описание изображения
        print("\n" + "="*50)
        print("Задача 1: Описание изображения")
        print("="*50)
        result1 = analyze_image_with_gpt4o(
            test_image,
            "Пожалуйста, подробно опишите это изображение, включая объект, фон, цвета, композицию и т. д."
        )
        print(result1)

        # Задача 2: Извлечение текста с помощью OCR
        print("\n" + "="*50)
        print("Задача 2: Извлечение текста OCR")
        print("="*50)
        result2 = extract_text_from_image(test_image)
        print(result2)

        # Задача 3: Анализ диаграмм (если изображение является диаграммой)
        print("\n" + "="*50)
        print("Задача 3: Анализ диаграмм")
        print("="*50)
        result3 = analyze_chart(test_image)
        print(result3)

        print("\n" + "="*50)
        print("ПРИМЕР: демонстрация обучающего руководства завершена!")
        print("="*50)

Перед запуском этой программы вам нужно:

  • 1. Установите зависимости:pip install requests

  • 2. Подготовьте тестовое изображение и назовите егоexample_test_image.jpg

  • 3. Замените ключ API на свой собственный

Примечание о стоимости: GPT-4o Vision тарифицируется по размеру изображения. Изображение 1024x1024 стоит около $0.00765. Изображения меньшего размера дешевле. Для отладки используйте изображения с низким разрешением; для продакшена используйте высокое разрешение.


Генерация изображений по тексту

Генерация изображений по тексту позволяет ИИ создавать изображения по текстовым описаниям. Это ещё одна очень зрелая область мультимодальных приложений.

Введение в принципы диффузионных моделей

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

Простой способ понять, как это работает:

  • Этап обучения: покажите модели чёткое изображение, затем постепенно добавляйте к нему шум, пока оно не станет полностью зашумлённым изображением. Модель учится шаг за шагом превращать зашумлённое изображение обратно в чёткое.

  • Этап генерации: дайте модели изображение со случайным шумом и позвольте ей шаг за шагом удалять шум в соответствии с текстовым запросом, в итоге создавая чёткое изображение, соответствующее описанию.

Этот процесс обычно занимает 20-50 шагов, поэтому генерация изображения занимает несколько секунд.

Продвинутые советы по использованию Midjourney

Midjourney в настоящее время — один из самых популярных инструментов генерации изображений по тексту, используемый через Discord.

Качественный промпт обычно включает следующие элементы:

  • Описание объекта — "кот в шляпе"

  • Стиль — "в стиле Studio Ghibli", "масляная живопись", "3D-рендер"

  • Освещение — "естественное освещение", "кинематографичное освещение", "киберпанк-неоновые огни"

  • Композиция — "крупный план", "широкий угол", "вид сверху"

  • Качество — "8K", "сверхвысокая детализация", "фотографическое качество"

ПараметрОписаниеПример
--arУстановить соотношение сторон--ar 16:9 (видео), --ar 3:4 (мобильные устройства)
--vУказать версию модели--v 6.0 (последняя версия)
--sУровень стилизации (0-1000)--s 750 (сильный художественный эффект)
--qКачество рендеринга (0.25-2)--q 2 (более высокое качество, медленнее)
--iwВес референсного изображения--iw 1.5 (более похоже на референсное изображение)

Локальное развёртывание Stable Diffusion

Если вы хотите получить полный контроль, вы можете запустить Stable Diffusion локально:https://github.com/compvis/stable-diffusion。

Наиболее часто используемый инструмент — WebUI от Automatic1111.

Шаги примерно следующие:

  • 1. Установите Python 3.10

  • 2. Скачайте Stable Diffusion WebUI

  • 3. Скачайте файл модели (формат .safetensors)

  • 4. Запустите webui.bat (Windows) или webui.sh (Mac/Linux)

Преимущества локального развёртывания: генерация бесплатна, нет ограничений на контент, можно использовать LoRA для тонкой настройки стилей и ControlNet для точного контроля композиции.

Недостатки: нужен GPU как минимум с 6GB VRAM, а настройка довольно сложна.

Практика: генерация изображений с помощью API DALL·E 3

Если вам нужен простой способ генерации изображений через API, DALL·E 3 — хороший выбор.

Пример

# ============================================
# Файл: example_dalle3_demo.py
# Функция: генерация изображений с помощью API DALL·E 3
# ============================================

import requests
import os
from datetime import datetime

# Настройте ключ API (замените его своим настоящим ключом)
OPENAI_API_KEY = "sk-your-api-key-here"
DALLE3_API_URL = "https://api.openai.com/v1/images/generations"


def generate_image_with_dalle3(
    prompt: str,
    size: str = "1024x1024",
    quality: str = "standard",
    style: str = "vivid",
    save_dir: str = "example_generated_images"
) -> dict:
    """
Генерация изображений с помощью API DALL·E 3

Описания параметров:
prompt: текстовое описание, чем подробнее, тем лучше
size: размер изображения
Варианты: 1024x1024, 1024x1792 (портретная), 1792x1024 (альбомная)
quality: качество изображения
Варианты: standard (стандартное), hd (высокое разрешение, дороже)
style: стиль
Необязательно: vivid (яркий, более художественный), natural (естественный, более реалистичный)
save_dir: каталог сохранения изображений

Возвращает:
Словарь, содержащий URL изображения и путь сохранения
    """

    # Шаг 1: Подготовьте заголовки запроса
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {OPENAI_API_KEY}"
    }

    # Шаг 2: Подготовьте тело запроса
    payload = {
        "model": "dall-e-3",
        "prompt": prompt,
        "n": 1,  # DALL·E 3 может генерировать только 1 изображение за раз
        "size": size,
        "quality": quality,
        "style": style
    }

    # Шаг 3: Отправьте запрос
    print(f"Генерация изображения, промпт: {prompt[:50]}...")
    response = requests.post(DALLE3_API_URL, headers=headers, json=payload)

    # Шаг 4: Обработайте ответ
    if response.status_code == 200:
        result = response.json()
        image_url = result["data"][0]["url"]
        revised_prompt = result["data"][0].get("revised_prompt", prompt)

        print(f"DALL·E 3 автооптимизированный промпт: {revised_prompt}")

        # Шаг 5: Скачать и сохранить изображение
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)

        # Сгенерировать имя файла с использованием временной метки
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"example_dalle3_{timestamp}.png"
        filepath = os.path.join(save_dir, filename)

        # Скачать изображение
        image_response = requests.get(image_url)
        if image_response.status_code == 200:
            with open(filepath, "wb") as f:
                f.write(image_response.content)
            print(f"Изображение сохранено в: {filepath}")

        return {
            "image_url": image_url,
            "filepath": filepath,
            "revised_prompt": revised_prompt
        }
    else:
        error_msg = f"Ошибка запроса: {response.status_code} - {response.text}"
        print(error_msg)
        return {"error": error_msg}


def generate_example_logo_demo():
    """Демо: Генерация логотипа в стиле EXAMPLE"""
    prompt = """
    Милый и дружелюбный робот-талисман для учебного сайта EXAMPLE.
    Сине-зелёная цветовая схема, современный плоский дизайн, белый фон.
    Робот выглядит полезным и умным, с большими дружелюбными глазами.
    Простой, чистый, подходит для бренда в сфере технологического образования.
    """

    # Китайские промпты тоже работают; DALL·E 3 поддерживает несколько языков
    prompt = """
Разработайте милого и дружелюбного робота-талисмана для учебного сайта EXAMPLE.
Сине-зелёная цветовая схема, современный плоский дизайн, белый фон.
Робот выглядит полезным и сообразительным, с большими дружелюбными глазами.
Простой и чистый, подходит для бренда в сфере технологического образования.
    """

    return generate_image_with_dalle3(
        prompt=prompt,
        size="1024x1024",
        quality="hd",
        style="vivid"
    )


def generate_book_cover_demo():
    """Демо: Создание обложки книги"""
    prompt = """
    Дизайн обложки книги для "Руководства по ИИ для начинающих".
    Современный минималистичный стиль, фон с градиентом от глубокого синего к фиолетовому.
    Текст заголовка элегантный и удобочитаемый.
    Ненавязчивые технические элементы: парящие геометрические фигуры, едва заметные узоры микросхем.
    Профессиональный, вызывающий доверие, подходящий для книги по программированию.
    """

    return generate_image_with_dalle3(
        prompt=prompt,
        size="1024x1792",  # Портретная ориентация
        quality="hd",
        style="natural"
    )


def generate_banner_demo():
    """Демо: Создание баннерной рекламы"""
    prompt = """
    Дизайн веб-баннера для сайта с уроками программирования (ПРИМЕР).
    Широкий формат 16:9. Современный фон с градиентом от бирюзового к синему.
    Чистый макет с местом для текста.
    Абстрактные технические элементы: парящие фрагменты кода, едва заметные линии сетки.
    Профессиональный и привлекательный.
    """

    return generate_image_with_dalle3(
        prompt=prompt,
        size="1792x1024",  # Альбомная ориентация
        quality="standard",
        style="vivid"
    )


# ============================================
# Основная программа: демонстрация различных задач генерации
# ============================================

if __name__ == "__main__":
    print("="*60)
    print("ПРИМЕР: Демонстрация генерации изображений DALL·E 3")
    print("="*60)

    # Задача 1: Сгенерировать логотип
    print("\n[Задача 1] Генерация логотипа ...")
    result1 = generate_example_logo_demo()

    # Задача 2: Сгенерировать обложку книги
    print("\n[Задача 2] Генерация обложки книги ...")
    result2 = generate_book_cover_demo()

    # Задача 3: Сгенерировать баннер
    print("\n[Задача 3] Генерация баннера ...")
    result3 = generate_banner_demo()

    print("\n" + "="*60)
    print("Все задачи выполнены! Проверьте каталог example_generated_images")
    print("="*60)

Сильные стороны DALL·E 3: сильное понимание, не ломает руки и лица и хорошо генерирует текст.

Но у неё есть и ограничения: она может генерировать только 1 изображение за раз, не может точно контролировать стиль и не может быть дообучена, как Stable Diffusion.

Уведомление об авторских правах: текущий консенсус таков, что для изображений, сгенерированных ИИ, автор промпта имеет права на использование, но не владеет авторским правом (поскольку бюро по авторским правам требуют человеческого авторства). Для коммерческого использования рекомендуется уточнить условия использования инструмента.


ИИ для видео

ИИ для видео делится на две категории: генерация видео и понимание видео.

По сравнению с изображениями видео технически сложнее — потому что видео — это комбинация «времени + пространства», требующая, чтобы каждый кадр был согласован, а движения выглядели естественно.

Сравнение инструментов для генерации видео с ИИ

2024 год стал первым годом ИИ-видео: несколько компаний выпустили продукты для генерации видео.

ИнструментРазработчикОсобенностиТипичная длительность
SoraOpenAIВедущая в отрасли детализация изображений и понимание пространственных сцен, реалистичная физическая логика, ещё не полностью открыт для публичного бета-тестированияДо 60 секунд
Runway Gen-4RunwayУниверсальная платформа для создания, объединяющая преобразование текста/изображения в видео, ИИ-постобработку, кисть движения и VFX-эффекты; лучший выбор для зарубежных профессиональных создателей10–20 секунд
Kling (Keling AI)KuaishouОтличная адаптация к китайским промптам, плавные движения персонажей, стабильные персонажи между кадрами, высокая экономическая эффективность в Китае, поддерживает многосегментную сшивку повествования5–30 секунд, до 2 минут на сегмент
PikaPika LabsЧрезвычайно выразителен в стилях аниме и кинематографичной иллюстрации, согласованный дизайн персонажей, поддерживает перерисовку в стиле видео и интерполяцию кадров5–10 секунд
VeoGoogleКинематографическое освещение и движение камеры, стабильное повествование с длинными планами, естественный физический рендеринг, ещё не выпущен публичноБолее 60 секунд
Jimeng AI (Seedance)ByteDanceГлубокая интеграция с экосистемой CapCut/Douyin, точное понимание китайской семантики, аудиовизуальная синхронизация губ, поддержка автоматического создания раскадровки из сценариев5–15 секунд, несколько сегментов сшиваются в полный фильм
Tongyi Wanxiang VideoAlibaba DAMO AcademyБазовая модель с открытым исходным кодом, стабильное взаимодействие нескольких субъектов, поддерживает генерацию текста на изображениях, может быть развёрнута локально для инференса.2–15 секунд
Hailuo AI (Hailuo)MiniMax (Xiyu)Лёгкая сверхбыстрая генерация; подходит для преобразования постеров в динамичные короткие видео и флеш-контент для соцсетей, с выдающимся рендерингом в аниме-стиле.4–10 секунд
Luma Dream MachineLuma AIПервоклассная симуляция физической динамики; реалистичные эффекты воды, огня, ткани и взрывов, с кинематографичным движением камеры.5–12 секунд
ZhiyingTencentСпециализируется на ИИ-монтаже и видео с цифровыми людьми, имеет огромную коллекцию шаблонов коротких видео, комплексные решения для субтитров, озвучивания и удаления фона, а также низкий порог для коммерческого использования.Нет ограничений на длину видео; ИИ-генерируемые клипы — 5–15 секунд.
Хайи AIХайи ТехнолоджиПоддерживает вывод в 4K/60fps с высокой частотой кадров, генерацию видео с привязкой нескольких изображений, поставляется с полноценной рабочей станцией для производства и предоставляет значительный лимит бесплатного использования на ограниченное время.Один фрагмент — до 30 секунд.

ИИ-видео всё ещё находится на ранней стадии развития:

  • Преимущества: быстрая реализация идей, низкая стоимость и возможность достижения эффектов, которые очень сложно получить при натурных съёмках.

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

  • Подходящие сценарии: демонстрация концепций, материал для коротких видео, реклама в электронной коммерции, игровые анимации.

  • Неподходящие сценарии: длинные фильмы, требующие точного контроля, серьёзные новости, юридические доказательства.

Понимание и обобщение видео

Помимо генерации видео, ИИ также может понимать видео.

Типичные задачи понимания видео:

  • Суммаризация видео — «О чём это видео? Кратко опишите в 3 предложениях.»

  • Поиск контента — «Найдите в видео фрагмент, где кто-то едет на велосипеде.»

  • Ответы на вопросы — «Что сказал третий человек в видео?»

Типичный технический подход таков: извлечь кадры из видео (например, 1 кадр в секунду), затем с помощью модели компьютерного зрения просмотреть каждый кадр по очереди и в конце объединить информацию.

Будущие тенденции

Направление развития видео-ИИ очевидно:

  • Дольше — от 10 секунд до 1 минуты, а затем до 10 минут.

  • Более управляемый — возможность точно управлять каждым кадром с помощью раскадровок.

  • Более последовательный — один и тот же персонаж сохраняет единообразие в разных кадрах.

  • Более практичный — от крутого внешнего вида к решению реальных задач.

  • Чего ожидать: через несколько лет каждый, возможно, сможет создавать с помощью ИИ кинематографичные видеоработы.


ИИ для аудио и речи

Аудио-ИИ в основном включает: распознавание речи (ASR), синтез речи (TTS) и генерацию музыки.

Это довольно зрелая область.

Распознавание речи (Whisper API)

Whisper — это открытая модель распознавания речи от OpenAI. Она показывает очень хорошие результаты и поддерживает 99 языков.

Пример

# ============================================
# Файл: example_whisper_demo.py
# Функция: использование Whisper API для транскрипции речи
# ============================================

import requests
import os

# Настройка ключа API
OPENAI_API_KEY = "sk-your-api-key-here"
WHISPER_API_URL = "https://api.openai.com/v1/audio/transcriptions"


def transcribe_audio_with_whisper(
    audio_path: str,
    language: str = "zh",  # zh=китайский, en=английский, оставьте пустым для автоопределения
    prompt: str = "",     # Необязательно: укажите подсказки по терминологии, чтобы повысить точность
    temperature: float = 0.0
) -> dict:
    """
Используйте Whisper API для расшифровки аудиофайлов

Описание параметра:
audio_path: путь к аудиофайлу (поддерживаются mp3, wav, m4a и т. д.)
language: код языка (необязательно, определяется автоматически, если не указан)
Распространённые коды: zh (китайский), en (английский), ja (японский)
prompt: текст подсказки (необязательно; здесь можно указать возможные технические термины или имена)
temperature: температура сэмплирования (0.0 — наиболее детерминированный, 1.0 — более разнообразный)

Возвращает:
Словарь, содержащий расшифрованный текст
    """

    # Шаг 1: Проверить, существует ли файл
    if not os.path.exists(audio_path):
        return {"error": f"Файл не найден: {audio_path}"}

    # Шаг 2: Подготовьте заголовки запроса
    headers = {
        "Authorization": f"Bearer {OPENAI_API_KEY}"
    }

    # Шаг 3: Подготовьте тело запроса (примечание: аудио должно использовать формат multipart/form-data)
    files = {
        "file": open(audio_path, "rb")
    }
    data = {
        "model": "whisper-1",
        "temperature": temperature
    }
    if language:
        data["language"] = language
    if prompt:
        data["prompt"] = prompt

    # Шаг 4: Отправить запрос
    print(f"Транскрибирование аудио: {audio_path} ...")
    response = requests.post(WHISPER_API_URL, headers=headers, files=files, data=data)

    # Шаг 5: Закрыть файл
    files["file"].close()

    # Шаг 6: Обработать ответ
    if response.status_code == 200:
        result = response.json()
        text = result["text"]
        print(f"Транскрипция завершена, всего {len(text)} символов.")
        return {
            "text": text,
            "language": language
        }
    else:
        error_msg = f"Ошибка запроса: {response.status_code} - {response.text}"
        print(error_msg)
        return {"error": error_msg}


def transcribe_with_timestamps(audio_path: str) -> dict:
    """
Транскрипция с временными метками (с использованием формата verbose_json)
    """

    headers = {
        "Authorization": f"Bearer {OPENAI_API_KEY}"
    }
    files = {"file": open(audio_path, "rb")}
    data = {
        "model": "whisper-1",
        "response_format": "verbose_json",  # Возвращает подробную информацию, включая временные метки
        "timestamp_granularities": ["segment", "word"]  # Поддерживает временные метки на уровне сегментов и слов
    }

    response = requests.post(WHISPER_API_URL, headers=headers, files=files, data=data)
    files["file"].close()

    if response.status_code == 200:
        result = response.json()
        return result
    else:
        return {"error": response.text}


def translate_audio_to_english(audio_path: str) -> dict:
    """
Перевести аудио с любого языка в английский текст
    """

    headers = {
        "Authorization": f"Bearer {OPENAI_API_KEY}"
    }
    files = {"file": open(audio_path, "rb")}
    data = {
        "model": "whisper-1",
        "task": "translate"  # Явно указать: задача перевода
    }

    response = requests.post("https://api.openai.com/v1/audio/translations",
                            headers=headers, files=files, data=data)
    files["file"].close()

    if response.status_code == 200:
        return response.json()
    else:
        return {"error": response.text}


def example_meeting_minutes_demo(audio_path: str) -> str:
    """
Практическое занятие: создание протокола совещания
Шаг 1: Транскрибируйте запись с помощью Whisper
Шаг 2: Составление протокола с помощью GPT-4o
    """

    # Сначала расшифровать
    print("Шаг 1: Расшифровка записи совещания...")
    transcribe_result = transcribe_audio_with_whisper(
        audio_path,
        language="zh",
        prompt="Это совещание технической команды EXAMPLE, где обсуждаются разработка продукта, прогресс, технические решения и т. д."
    )

    if "error" in transcribe_result:
        return transcribe_result["error"]

    transcript = transcribe_result["text"]

    # Затем организовать (здесь упрощённо; в реальном проекте можно вызвать GPT-4o API)
    print("Шаг 2: Составление протокола совещания...")
    # Для демонстрационных целей возвращаем текст расшифровки напрямую
    # В реальном проекте вы можете отправить расшифровку в GPT-4o и поручить ему её структурировать
    return transcript


# ============================================
# Основная программа
# ============================================

if __name__ == "__main__":
    # Подготовьте тестовый аудиофайл
    test_audio = "example_test_audio.mp3"

    if not os.path.exists(test_audio):
        print(f"Подсказка: подготовьте аудиофайл и назовите его {test_audio}")
        print("Или запишите голосовую заметку на телефоне и сохраните её как MP3")
    else:
        # Задача 1: Простая транскрипция
        print("\n" + "="*50)
        print("Задача 1: Простая транскрипция")
        print("="*50)
        result1 = transcribe_audio_with_whisper(test_audio, language="zh")
        if "text" in result1:
            print("Результат транскрипции:")
            print(result1["text"])

        # Задача 2: Транскрипция с временными метками
        print("\n" + "="*50)
        print("Задача 2: Транскрипция с временными метками")
        print("="*50)
        result2 = transcribe_with_timestamps(test_audio)
        if "segments" in result2:
            print("Информация о сегментах:")
            for seg in result2["segments"][:3]:  # Вывести только первые 3 сегмента
                start = round(seg["start"], 2)
                end = round(seg["end"], 2)
                text = seg["text"]
                print(f"[{start}-{end}] {text}")

        print("\n" + "="*50)
        print("ПРИМЕР Демонстрация Whisper завершена!")
        print("="*50)

Преимущества Whisper: хорошая поддержка многоязычности, нетребовательность к акцентам и автоматическая расстановка знаков препинания.

Типичные сценарии применения: транскрипция записей встреч, генерация субтитров для видео, транскрипты подкастов, голосовые дневники.

Преобразование текста в речь (TTS)

Преобразование текста в речь позволяет ИИ "читать" статьи.

OpenAI также предоставляет TTS API с поддержкой нескольких голосовых стилей.

Другие инструменты TTS: ElevenLabs (наиболее человечный), Azure TTS (коммерческого уровня), Edge TTS (бесплатный), Coqui (открытый исходный код).

Генерация музыки (Suno, Udio)

В генерации музыки также произошли прорывы.

Suno и Udio — два показательных продукта: вы вводите текст песни и описание стиля, а они могут сгенерировать полноценную песню с вокалом и аккомпанементом.

Границы возможностей:

  • Может: генерировать фоновую музыку, писать демо-версии песен, быстро пробовать стили.

  • Ограничения: полное воспроизведение конкретной песни, точное управление нотами, профессиональный постпродакшн.

  • Авторские права: условия зависят от инструмента; уточните перед коммерческим использованием.


Введение в архитектуры мультимодальных моделей

Понимание хотя бы небольшой части теории помогает лучше использовать инструменты.

CLIP: основа сопоставления изображений и текста

CLIP (Contrastive Language-Image Pre-training) — это модель, выпущенная OpenAI в 2021 году.

Её идея проста: одновременно смотреть на изображения и текст и учиться сопоставлять их.

Во время обучения дайте модели пакет паризображение + описаниеи позвольте ей учиться:

  • 1. Преобразовать изображения в векторы

  • 2. Преобразовать текст в векторы

  • 3. Сделать векторы пар изображение-текст как можно ближе, а непарные — как можно дальше друг от друга.

Значимость CLIP состоит в следующем:Он доказал, что «кросс-модальное понимание» возможно。

Более поздние модели, такие как Stable Diffusion и GPT-4o, были вдохновлены CLIP.

LLaVA: открытая мультимодальная LLM

LLaVA (Large Language and Vision Assistant) — это открытая мультимодальная модель.

Её архитектура очень понятна:

  • Визуальный энкодер (например, ViT) — отвечает за восприятие изображений

  • Большая языковая модель (например, LLaMA) — отвечает за речь

  • Проекционный слой — преобразует векторы изображений в формат, понятный языковой модели

Обучение проходит в два этапа:

  • Шаг 1: Выравнивание при предобучении — заставить визуальный энкодер и языковую модель говорить на одном языке

  • Шаг 2: Дообучение на инструкциях — обучение на данных «изображение-вопрос-ответ», чтобы научить её отвечать в соответствии с инструкциями

LLaVA — хорошая отправная точка для изучения мультимодальных технологий: открытый исходный код, понятная архитектура, хорошие результаты.


Практическое занятие: создание инструмента анализа изображений

Давайте объединим предыдущие знания и создадим практичный инструмент анализа изображений.

Пример

# ============================================
# Файл: example_image_analyzer.py
# Функция: полноценный инструмент мультимодального анализа изображений
# ============================================

import base64
import requests
import os
import json
from datetime import datetime
from typing import Optional, Dict, Any


class ExampleImageAnalyzer:
    """
EXAMPLE Image Analyzer - упакованный класс мультимодального инструмента
    """


    def __init__(self, api_key: str, base_url: str = "https://api.openai.com/v1"):
        """
Инициализация анализатора

Параметры:
api_key: ключ OpenAI API
base_url: адрес API (настраиваемый прокси)
        """

        self.api_key = api_key
        self.base_url = base_url
        self.headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {api_key}"
        }

    def _encode_image(self, image_path: str) -> str:
        """Кодировать изображение в Base64"""
        with open(image_path, "rb") as f:
            return base64.b64encode(f.read()).decode("utf-8")

    def _call_vision_api(
        self,
        image_path: str,
        prompt: str,
        model: str = "gpt-4o",
        max_tokens: int = 2000
    ) -> Optional[str]:
        """Внутренний метод: вызов API зрения"""
        base64_image = self._encode_image(image_path)

        payload = {
            "model": model,
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": prompt},
                        {
                            "type": "image_url",
                            "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}
                        }
                    ]
                }
            ],
            "max_tokens": max_tokens
        }

        url = f"{self.base_url}/chat/completions"
        response = requests.post(url, headers=self.headers, json=payload)

        if response.status_code == 200:
            return response.json()["choices"][0]["message"]["content"]
        else:
            print(f"Ошибка API: {response.status_code} - {response.text}")
            return None

    def describe(self, image_path: str) -> Optional[str]:
        """Подробно опишите содержимое изображения"""
        prompt = """
Пожалуйста, опишите это изображение подробно, включая:
1. Основное содержание (какие люди/объекты присутствуют)
2. Фоновое окружение
3. Цвета и освещение
4. Общая атмосфера
Ответьте на китайском языке, с чёткой структурой.
        """

        return self._call_vision_api(image_path, prompt)

    def extract_text(self, image_path: str) -> Optional[str]:
        """Извлечь весь текст из изображения (OCR)"""
        prompt = """
Пожалуйста, извлеките весь текст из этого изображения.
Требования:
1. Воспроизведите точно, без пропусков
2. Сохраните исходную структуру абзацев
3. Если это таблица, выведите её в формате таблицы Markdown
4. Если текста нет, явно укажите "На изображении нет распознаваемого текста"
        """

        return self._call_vision_api(image_path, prompt)

    def analyze_ui(self, image_path: str) -> Optional[str]:
        """Проанализировать макет UI-дизайна (скриншот)"""
        prompt = """
Пожалуйста, проанализируйте этот макет UI-дизайна:
1. Какой это тип интерфейса (APP, веб-страница, мини-программа и т. д.)?
2. Каковы основные функциональные модули интерфейса?
3. Каков стиль дизайна (цветовая схема, макет, типографика)?
4. Что можно улучшить?
Ответьте на китайском языке, перечислите по пунктам.
        """

        return self._call_vision_api(image_path, prompt)

    def analyze_product(self, image_path: str) -> Optional[str]:
        """Анализ изображений товаров и генерация текста для электронной коммерции"""
        prompt = """
Пожалуйста, проанализируйте это изображение товара и сгенерируйте текст для электронной коммерции.
Текст должен включать:
1. Название и тип товара
2. Особенности внешнего вида (цвет, материал, дизайн)
3. Привлекательная короткая рекомендация (30-50 символов)
Ответьте на китайском, в дружелюбном и позитивном тоне.
        """

        return self._call_vision_api(image_path, prompt)

    def classify(self, image_path: str, categories: list = None) -> Optional[str]:
        """Классифицировать изображение"""
        if categories is None:
            categories = [
                "Портретное фото", "Пейзажное фото", "Фото еды", "Фото продукта",
                "Макет дизайна/скриншот", "Документ/таблица", "Диаграмма/визуализация данных", "Другое"
            ]
        cat_list = "、".join(categories)
        prompt = f"""
Пожалуйста, определите, к какой категории относится это изображение.
Необязательные категории: {cat_list}
Верните только наиболее подходящее название категории, без другого текста.
        """

        return self._call_vision_api(image_path, prompt)

    def full_analysis(self, image_path: str, output_dir: str = "example_analysis") -> Dict[str, Any]:
        """
Полный анализ: сгенерировать подробный отчет об анализе

Вернуть dict, содержащий все результаты анализа
        """

        print(f"Начинаем анализ изображения: {image_path}")

        # Сначала классифицировать
        print("[1/5] Классификация...")
        category = self.classify(image_path) or "Неизвестно"

        # Описание
        print("[2/5] Описание...")
        description = self.describe(image_path) or ""

        # Извлечь текст
        print("[3/5] OCR в процессе...")
        text = self.extract_text(image_path) or ""

        # Выполнить специализированный анализ на основе категории
        print("[4/5] Выполняется специализированный анализ...")
        special_analysis = ""
        if "design" in category or "screenshot" in category:
            special_analysis = self.analyze_ui(image_path) or ""
        elif "product" in category or "merchandise" in category:
            special_analysis = self.analyze_product(image_path) or ""

        # Сохранить отчёт
        print("[5/5] Создание отчёта...")
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)

        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        report = {
            "image_file": os.path.basename(image_path),
            "analysis_time": datetime.now().isoformat(),
            "category": category,
            "description": description,
            "extracted_text": text,
            "special_analysis": special_analysis
        }

        # Сохранить JSON
        json_path = os.path.join(output_dir, f"report_{timestamp}.json")
        with open(json_path, "w", encoding="utf-8") as f:
            json.dump(report, f, ensure_ascii=False, indent=2)

        # Сохранить читаемый текст
        txt_path = os.path.join(output_dir, f"report_{timestamp}.txt")
        with open(txt_path, "w", encoding="utf-8") as f:
            f.write("="*60 + "\n")
            f.write("ПРИМЕР Отчёта об анализе изображения\n")
            f.write("="*60 + "\n\n")
            f.write(f"Изображение: {report['image_file']}"\n")
            f.write(f"Время: {report['analysis_time']}"\n")
            f.write(f"Категория: {report['category']}"\n\n")
            f.write("-"*60 + "\n")
            f.write("Описание изображения:\n")
            f.write("-"*60 + "\n")
            f.write(report["description"] + "\n\n")
            f.write("-"*60 + "\n")
            f.write("Извлечённый текст:\n")
            f.write("-"*60 + "\n")
            f.write(report["extracted_text"] + "\n\n")
            if report["special_analysis"]:
                f.write("-"*60 + "\n")
                f.write("Специальный анализ:\n")
                f.write("-"*60 + "\n")
                f.write(report["special_analysis"] + "\n")

        print(f"Анализ завершён! Отчёт сохранён в: {output_dir}")
        return report


# ============================================
# Пример использования
# ============================================

def main():
    # Настройте свой ключ API
    api_key = "sk-your-api-key-here"

    # Создайте анализатор
    analyzer = ExampleImageAnalyzer(api_key)

    # Путь к изображению для анализа
    image_path = "example_test_image.jpg"

    if not os.path.exists(image_path):
        print(f"Пожалуйста, подготовьте изображение: {image_path}")
        return

    # Метод 1: Используйте одну функцию отдельно
    print("\n"Метод 1: Использовать только OCR")
    print("-"*40)
    text = analyzer.extract_text(image_path)
    if text:
        print("Извлечённый текст:")
        print(text)

    # Метод 2: Полный анализ
    print("\n"Метод 2: Полный анализ")
    print("-"*40)
    report = analyzer.full_analysis(image_path)
    print(f"Результат классификации: {report['category']}")
    print(f"Отчёт сохранён")


if __name__ == "__main__":
    main()

Этот инструмент инкапсулирует общие функции анализа изображений и может использоваться напрямую в проектах.

Вы можете расширить его по мере необходимости:

  • Добавьте больше сценариев анализа (например, медицинская визуализация, промышленная инспекция, анализ учебных вопросов)

  • Добавьте простой веб-интерфейс (с использованием Flask или Gradio)

  • Поддержка пакетной обработки изображений в папках

  • Сохраняйте результаты в базе данных

Другие расширения