Vídeos + IA

Traduzido do original em espanhol. Ler em espanhol

Neste tutorial, você vai aprender a pegar um vídeo e transformá-lo em um tutorial escrito usando inteligência artificial. O código a seguir mostra como extrair frames de um vídeo, convertê-los para base64 e usar o modelo multimodal GPT-4o do Azure OpenAI para gerar um tutorial com base nesses frames.

iStock AI Generator

Pré-requisitos

Antes de começar, verifique se você tem o seguinte configurado:

  1. Um arquivo .env no mesmo diretório do script com as seguintes informações:
AZURE_TENANT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_SECRET = "xxxxx"
  1. Instalar as bibliotecas necessárias: opencv-python, python-dotenv, azure-identity e langchain_openai.

Passo 1: Configurar as credenciais e as variáveis de ambiente

Primeiro, carregamos as credenciais e configuramos as variáveis de ambiente necessárias para interagir com o 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

Passo 2: Processar o vídeo e extrair os frames

A função process_video se encarrega de abrir o vídeo, extrair frames em intervalos definidos e convertê-los para 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

Passo 3: Ler o vídeo e converter para base64

Neste passo, lemos um vídeo a partir de um arquivo e processamos os frames. Você pode ajustar a quantidade de frames por segundo se o vídeo for longo demais. A API aceita até 20 imagens por requisição, então será preciso implementar alguma lógica para processar vídeos maiores.

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

Passo 4: Preparar a mensagem para o modelo

Geramos uma mensagem de texto e uma para cada frame do vídeo, que serão enviadas ao 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)

Passo 5: Inicializar o modelo e gerar a resposta

Por fim, inicializamos o modelo do Azure OpenAI e geramos a resposta.

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 em: IA