Videos + AI

En este tutorial, aprenderás cómo utilizar un video y convertirlo en un tutorial escrito utilizando inteligencia artificial. El siguiente código muestra cómo extraer frames de un video, convertirlos a base64 y utilizar el modelo multimodal GPT-4o de Azure OpenAI para generar un tutorial basado en esos frames.

iStock AI Generator

Requisitos Previos

Antes de comenzar, asegúrate de tener los siguientes elementos configurados:

  1. Un archivo .env en el mismo directorio que el script con la siguiente información:
AZURE_TENANT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_SECRET = "xxxxx"
  1. Instalar las bibliotecas necesarias: opencv-python, python-dotenv, azure-identity y langchain_openai.

Paso 1: Configurar Credenciales y Variables de Entorno

Primero, cargamos las credenciales y configuramos las variables de entorno necesarias para interactuar con Azure OpenAI.

import base64
import os, cv2
from langchain_core.messages import HumanMessage
from langchain_openai import AzureChatOpenAI
from azure.identity import ChainedTokenCredential, EnvironmentCredential
from dotenv import load_dotenv
load_dotenv()

credential = ChainedTokenCredential(EnvironmentCredential())
access_token = credential.get_token("https://cognitiveservices.azure.com/.default")

deployment = "zerogap-openai-gpt4o"
embedding_deployment = "zerogap-openai-embedding"

os.environ["AZURE_OPENAI_ENDPOINT"] = "https://zero.openai.azure.com/"
os.environ["AZURE_OPENAI_API_KEY"] = access_token.token
os.environ["OPENAI_API_TYPE"] = "azure_ad"
os.environ["OPENAI_DEPLOYMENT"] = deployment

Paso 2: Procesar el Video y Extraer Frames

La función process_video se encarga de abrir el video, extraer frames a intervalos específicos y convertirlos a base64.

def process_video(video_path, seconds_per_frame=2):
    base64Frames = []

    video = cv2.VideoCapture(video_path)
    total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    fps = video.get(cv2.CAP_PROP_FPS)
    frames_to_skip = int(fps * seconds_per_frame)
    curr_frame = 0

    while curr_frame < total_frames - 1:
        video.set(cv2.CAP_PROP_POS_FRAMES, curr_frame)
        success, frame = video.read()
        if not success:
            break
        _, buffer = cv2.imencode(".jpg", frame)
        base64Frames.append(base64.b64encode(buffer).decode("utf-8"))
        curr_frame += frames_to_skip
    video.release()

    print(f"Extracted {len(base64Frames)} frames")
    return base64Frames

Paso 3: Leer el Video y Convertir a Base64

En este paso, leemos un video desde un archivo y procesamos los fotogramas. Puedes ajustar la cantidad de fotogramas por segundo si el video es demasiado largo. La API acepta hasta 20 imágenes por solicitud, por lo que tendrás que implementar alguna lógica para procesar videos de mayor tamaño.

VIDEO_PATH = "C:\\demo.mp4"
base64Frames = process_video(VIDEO_PATH, seconds_per_frame=3)

Paso 4: Preparar el Mensaje para el Modelo

Generamos un mensaje de texto y uno por cada frame del video para ser enviados al modelo.

text_message = {
    "type": "text",
    "text": "Generate a tutorial based on a video. These are the frames from the video.",
}

video_message = [
        *map(lambda x: {"type": "image_url",
                        "image_url": {"url": f'data:image/jpg;base64,{x}', "detail": "low"}}, base64Frames),
]

message_content = [text_message] + video_message
message = HumanMessage(content=message_content)

Paso 5: Inicializar el Modelo y Generar la Respuesta

Finalmente, inicializamos el modelo de Azure OpenAI y generamos la respuesta.

llm = AzureChatOpenAI(openai_api_version="2024-02-01", azure_deployment=deployment, temperature=0.1)

output = llm.invoke([message])

print(output.content)

Código Completo

import base64
import os, cv2
from langchain_core.messages import HumanMessage
from langchain_openai import AzureChatOpenAI
from azure.identity import ChainedTokenCredential, EnvironmentCredential
from dotenv import load_dotenv
load_dotenv()

credential = ChainedTokenCredential(EnvironmentCredential())
access_token = credential.get_token("https://cognitiveservices.azure.com/.default")

deployment = "zerogap-openai-gpt4o"
embedding_deployment = "zerogap-openai-embedding"

os.environ["AZURE_OPENAI_ENDPOINT"] = "https://zero.openai.azure.com/"
os.environ["AZURE_OPENAI_API_KEY"] = access_token.token
os.environ["OPENAI_API_TYPE"] = "azure_ad"
os.environ["OPENAI_DEPLOYMENT"] = deployment

def process_video(video_path, seconds_per_frame=2):
    base64Frames = []

    video = cv2.VideoCapture(video_path)
    total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    fps = video.get(cv2.CAP_PROP_FPS)
    frames_to_skip = int(fps * seconds_per_frame)
    curr_frame = 0

    while curr_frame < total_frames - 1:
        video.set(cv2.CAP_PROP_POS_FRAMES, curr_frame)
        success, frame = video.read()
        if not success:
            break
        _, buffer = cv2.imencode(".jpg", frame)
        base64Frames.append(base64.b64encode(buffer).decode("utf-8"))
        curr_frame += frames_to_skip
    video.release()

    print(f"Extracted {len(base64Frames)} frames")
    return base64Frames

VIDEO_PATH = "C:\\demo.mp4"
base64Frames = process_video(VIDEO_PATH, seconds_per_frame=3)

text_message = {
    "type": "text",
    "text": "Generate a tutorial based on a video. These are the frames from the video.",
}

video_message = [
        *map(lambda x: {"type": "image_url",
                        "image_url": {"url": f'data:image/jpg;base64,{x}', "detail": "low"}}, base64Frames),
]

message_content = [text_message] + video_message
message = HumanMessage(content=message_content)

llm = AzureChatOpenAI(openai_api_version="2024-02-01", azure_deployment=deployment, temperature=0.1)

output = llm.invoke([message])

print(output.content)

Maximiliano Díaz Doglia

AI Platform Engineer & Full-Stack Developer
Building Enterprise Integrations & Automations

Publicado en: AI