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.

Requisitos Previos
Antes de comenzar, asegúrate de tener los siguientes elementos configurados:
- Un archivo
.enven 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"
- Instalar las bibliotecas necesarias:
opencv-python,python-dotenv,azure-identityylangchain_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)
