Vidéos + IA
Traduit de l'original en espagnol. Lire en espagnol
Dans ce tutoriel, vous allez apprendre à prendre une vidéo et à la transformer en tutoriel écrit grâce à l’intelligence artificielle. Le code suivant montre comment extraire des frames d’une vidéo, les convertir en base64 et utiliser le modèle multimodal GPT-4o d’Azure OpenAI pour générer un tutoriel à partir de ces frames.

Prérequis
Avant de commencer, assurez-vous d’avoir configuré les éléments suivants :
- Un fichier
.envdans le même répertoire que le script, avec les informations suivantes :
AZURE_TENANT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_SECRET = "xxxxx"
- Installer les bibliothèques nécessaires :
opencv-python,python-dotenv,azure-identityetlangchain_openai.
Étape 1 : configurer les identifiants et les variables d’environnement
D’abord, nous chargeons les identifiants et configurons les variables d’environnement nécessaires pour interagir avec 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
Étape 2 : traiter la vidéo et extraire les frames
La fonction process_video ouvre la vidéo, extrait des frames à intervalles réguliers et les convertit en 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
Étape 3 : lire la vidéo et la convertir en base64
Dans cette étape, nous lisons une vidéo depuis un fichier et traitons ses frames. Vous pouvez ajuster le nombre de frames par seconde si la vidéo est trop longue. L’API accepte jusqu’à 20 images par requête ; il faudra donc ajouter un peu de logique pour traiter des vidéos plus longues.
VIDEO_PATH = "C:\\demo.mp4"
base64Frames = process_video(VIDEO_PATH, seconds_per_frame=3)
Étape 4 : préparer le message pour le modèle
Nous générons un message texte, puis un message par frame de la vidéo, à envoyer au modèle.
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)
Étape 5 : initialiser le modèle et générer la réponse
Enfin, nous initialisons le modèle Azure OpenAI et générons la réponse.
llm = AzureChatOpenAI(openai_api_version="2024-02-01", azure_deployment=deployment, temperature=0.1)
output = llm.invoke([message])
print(output.content)
Code complet
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)
