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.

Pré-requisitos
Antes de começar, verifique se você tem o seguinte configurado:
- Um arquivo
.envno 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"
- Instalar as bibliotecas necessárias:
opencv-python,python-dotenv,azure-identityelangchain_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)
