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.

iStock AI Generator

Prérequis

Avant de commencer, assurez-vous d’avoir configuré les éléments suivants :

  1. Un fichier .env dans 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"
  1. Installer les bibliothèques nécessaires : opencv-python, python-dotenv, azure-identity et langchain_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)

Maximiliano Díaz Doglia

AI Platform Engineer & Full-Stack Developer
Building Enterprise Integrations & Automations

Publié dans : IA