Video + IA
Tradotto dall'originale in spagnolo. Leggi in spagnolo
In questo tutorial imparerai a prendere un video e a trasformarlo in un tutorial scritto usando l’intelligenza artificiale. Il codice seguente mostra come estrarre i frame da un video, convertirli in base64 e usare il modello multimodale GPT-4o di Azure OpenAI per generare un tutorial a partire da quei frame.

Prerequisiti
Prima di iniziare, assicurati di avere configurato quanto segue:
- Un file
.envnella stessa cartella dello script con le seguenti informazioni:
AZURE_TENANT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_SECRET = "xxxxx"
- Installare le librerie necessarie:
opencv-python,python-dotenv,azure-identityelangchain_openai.
Passo 1: configurare credenziali e variabili d’ambiente
Per prima cosa carichiamo le credenziali e impostiamo le variabili d’ambiente necessarie per interagire 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
Passo 2: elaborare il video ed estrarre i frame
La funzione process_video si occupa di aprire il video, estrarre i frame a intervalli specifici e convertirli in 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: leggere il video e convertirlo in base64
In questo passo leggiamo un video da un file ed elaboriamo i fotogrammi. Puoi regolare il numero di fotogrammi al secondo se il video è troppo lungo. L’API accetta fino a 20 immagini per richiesta, quindi dovrai implementare un po’ di logica per elaborare video più lunghi.
VIDEO_PATH = "C:\\demo.mp4"
base64Frames = process_video(VIDEO_PATH, seconds_per_frame=3)
Passo 4: preparare il messaggio per il modello
Generiamo un messaggio di testo e uno per ogni frame del video da inviare al modello.
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: inizializzare il modello e generare la risposta
Infine inizializziamo il modello di Azure OpenAI e generiamo la risposta.
llm = AzureChatOpenAI(openai_api_version="2024-02-01", azure_deployment=deployment, temperature=0.1)
output = llm.invoke([message])
print(output.content)
Codice 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)
