Analizar y Generar Contenido a partir de Videos con Python y la API de OpenAI.


La semana pasada estuve trabajando en la creación del Curso práctico: Explorando la inteligencia artificial y OpenAI con Python que esta disponible actualmente en Azul School. Y he decidido compartirles aquí el proyecto final que se ve en esas clases y explicar cada parte del código para que puedan usar este conocimiento para sus propios proyectos.

Tambien les he creado una versión del curso en formato de texto y gratuita aquí en mi sitio web personal, puedes acceder a el aquí: Explorando la inteligencia artificial y OpenAI con Python.


La tecnología nos ofrece muchas herramientas interesantes para trabajar con contenido multimedia, y en este artículo vamos a analizar un código en Python que nos permitirá descargar videos de YouTube, extraer el audio, transcribirlo y generar contenido basado en esa transcripción.

Primero, es importante destacar que necesitaremos tener instaladas algunas librerías para que el código funcione correctamente. Estas librerías son: openai, whisper y yt_dlp. Asegúrate de tenerlas instaladas antes de ejecutar el código.

El código comienza importando las librerías necesarias:

import openai
import whisper
import yt_dlp
import sys
import os

A continuación, encontramos una función llamada descargar_youtube(ulr), la cual recibe una URL de YouTube como parámetro. Esta función nos permite descargar un video de YouTube y guardar el archivo con el nombre que el usuario elija. Para ello, se utiliza la librería yt_dlp. Veamos cómo funciona esta función:

def descargar_youtube(ulr):
    titulo = input("Ingresa el nuevo nombre de tu video a analizar: ")

    ydl_opts = {
        'format': 'best',
        'outtmpl': f'{titulo}.%(ext)s',
        'noplaylist': True,
        'download': False
    }

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])

    titulo = titulo + f".mp4"
    return titulo

En esta función, el usuario introduce un nuevo nombre para el video a analizar. Luego, se establecen las opciones de descarga del video utilizando el diccionario ydl_opts. Estas opciones especifican el formato de descarga, la plantilla de nombre del archivo, y otras configuraciones.

A continuación, se utiliza la instancia de YoutubeDL de yt_dlp para descargar el video con las opciones especificadas. El nombre del archivo se forma concatenando el nombre ingresado por el usuario y la extensión “.mp4”.

Una vez descargado el video, la función devuelve el nombre del archivo.

Después de la función descargar_youtube, encontramos un bloque de código que permite al usuario elegir entre analizar un video descargado o un video de YouTube:

print("¿Qué tipo de video desea analizar?")
print("1. Video descargado")
print("2. Video de YouTube")
opcion = int(input("Elija una opción: "))

if opcion == 1:
    archivo_video = input("Ingrese el nombre del video: ")
elif opcion == 2:
    url = input("Ingrese la URL de YouTube: ")
    archivo_video = descargar_youtube(url)
else:
    print("Opción no válida")
    sys.exit()

En este bloque, se muestra un menú para que el usuario elija el tipo de video que desea analizar. Dependiendo de la opción seleccionada, se solicita al usuario el nombre del video descargado o la URL de YouTube. Si se elige la opción 2, se llama a la función descargar_youtube para descargar el video y obtener su nombre de archivo.

Después, se utiliza la función os.path.splitext() para obtener el nombre del archivo sin extensión y se guarda en la variable nombre_archivo. Además, se crea una carpeta con el mismo nombre para almacenar los archivos generados a partir del video.

nombre_archivo = os.path.splitext(archivo_video)[0]
nombre_carpeta = nombre_archivo

if not os.path.exists(nombre_carpeta):
    os.makedirs(nombre_carpeta)

A continuación, se utiliza la herramienta de línea de comandos ffmpeg para extraer el audio del video y guardarlo en un archivo WAV:

archivo_audio = f"{nombre_carpeta}/{nombre_archivo}.wav"
os.system(f'ffmpeg -i "{archivo_video}" -vn "{archivo_audio}"')

Luego, se carga un modelo de reconocimiento de voz llamado “base” utilizando la librería whisper:

model = whisper.load_model("base")

Se utiliza el modelo para transcribir el audio del video:

result = model. Transcribe(archivo_audio)

La transcripción obtenida se guarda en un archivo de texto:

archivo_texto = f"{nombre_carpeta}/{nombre_archivo}.txt"

with open(archivo_texto, 'w') as f:
    f.write(result["text"])

A continuación, se muestra un menú de opciones para que el usuario decida qué hacer con la información del video transcrita:

opciones = {
    1: "Crea un resumen de este texto",
    2: "Crea un artículo original basado en este texto",
    3: "Crea un post para redes sociales basado en este texto",
    4: "Crea un correo basado en este texto",
    5: "Introduce un comando personalizado"
}

opcion = int(input("¿Qué desea hacer con la información del video?\n1. Crear un resumen\n2. Crear un artículo original\n3. Crear un post para redes sociales\n4. Crear un correo\n5. Introducir un comando personalizado\nElija una opción: "))

Después de obtener la opción seleccionada por el usuario, se verifica si la opción es válida y se procede a generar el contenido correspondiente utilizando la API de OpenAI:

openai.api_key = "TU API"

if opcion in opciones:
    if opcion == 5:
        prompt_personalizado = input("Introduzca el comando personalizado: ")
        prompt = prompt_personalizado + f"{result['text']}" 
    else:
        prompt = f"{opciones[opcion]}: '{result['text']}'" 

    modelo = "gpt-3.5-turbo"
    mensaje = [
        {"role":"system","content":"Eres un experto en redacción, resúmenes y creación de títulos."},
        {"role":"user","content":prompt}
    ] 

    response = openai.ChatCompletion.create(
        model = modelo,
        messages = mensaje,
        temperature = 0.8,
        max_tokens = 1024
    )

    respuesta = response["choices"][0]["message"]["content"]

else:
    print("Opción inválida.")
    sys.exit()

En este bloque, se establece la clave de API de OpenAI, se construye un prompt de texto basado en la opción seleccionada por el usuario y la transcripción del video. Luego, se configuran los parámetros del modelo de lenguaje, como la temperatura y el número máximo de tokens.

Se utiliza la función openai.ChatCompletion.create() para enviar el prompt al modelo y obtener la respuesta generada.

Finalmente, la respuesta generada se guarda en un archivo de texto y se muestra por pantalla:

with open(f"{nombre_carpeta}/{nombre_archivo}_articulo.txt", 'w') as f:
    f.write(respuesta)

print(f"Artículo generado guardado en {nombre_carpeta}/{nombre_archivo}_articulo.txt")
print(respuesta)

Así se vería todo el código completo:

import openai
import whisper
import yt_dlp
import sys
import os

# Función para descargar un video de YouTube y obtener su nombre de archivo
def descargar_youtube(url):
    titulo = input("Ingresa el nuevo nombre de tu video a analizar: ")

    ydl_opts = {
        'format': 'best',
        'outtmpl': f'{titulo}.%(ext)s',
        'noplaylist': True,
        'download': False
    }

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])

    titulo = titulo + f".mp4"
    return titulo

# Preguntar al usuario qué tipo de video desea analizar
print("¿Qué tipo de video desea analizar?")
print("1. Video descargado")
print("2. Video de YouTube")
opcion = int(input("Elija una opción: "))

if opcion == 1:
    archivo_video = input("Ingrese el nombre del video: ")
elif opcion == 2:
    url = input("Ingrese la URL de YouTube: ")
    archivo_video = descargar_youtube(url)
else:
    print("Opción no válida")
    sys.exit()

# Obtener el nombre del archivo sin extensión y crear una carpeta con el mismo nombre
nombre_archivo = os.path.splitext(archivo_video)[0]
nombre_carpeta = nombre_archivo

if not os.path.exists(nombre_carpeta):
    os.makedirs(nombre_carpeta)

# Extraer el audio del video y guardarlo como archivo WAV
archivo_audio = f"{nombre_carpeta}/{nombre_archivo}.wav"
os.system(f'ffmpeg -i "{archivo_video}" -vn "{archivo_audio}"')

# Cargar el modelo de reconocimiento de voz
model = whisper.load_model("base")

# Transcribir el audio del video
result = model.transcribe(archivo_audio)

# Guardar la transcripción en un archivo de texto
archivo_texto = f"{nombre_carpeta}/{nombre_archivo}.txt"
with open(archivo_texto, 'w') as f:
    f.write(result["text"])

# Menú de opciones para el contenido a generar
opciones = {
    1: "Crea un resumen de este texto",
    2: "Crea un artículo original basado en este texto",
    3: "Crea un post para redes sociales basado en este texto",
    4: "Crea un correo basado en este texto",
    5: "Introduce un comando personalizado"
}

opcion = int(input("¿Qué desea hacer con la información del video?\n1. Crear un resumen\n2. Crear un artículo original\n3. Crear un post para redes sociales\n4. Crear un correo\n5. Introducir un comando personalizado\nElija una opción: "))

# Establecer la clave de API de OpenAI
openai.api_key = "TU API"

if opcion in opciones:
    if opcion == 5:
        prompt_personalizado = input("Introduzca el comando personalizado: ")
        prompt = prompt_personalizado + f"{result['text']}" 
    else:
        prompt = f"{opciones[opcion]}: '{result['text']}'" 

    # Configurar el modelo de lenguaje
    modelo = "gpt-3.5-turbo"
    mensaje = [
        {"role":"system","content":"Eres un experto en redacción, resúmenes y creación de títulos."},
        {"role":"user","content":prompt}
    ] 

    # Generar la respuesta utilizando la API de OpenAI
    response = openai.ChatCompletion.create(
        model=modelo,
        messages=mensaje,
        temperature=0.8,
        max_tokens=1024
    )

    respuesta = response["choices"][0]["message"]["content"]
else:
    print("Opción inválida.")
    sys.exit()

# Guardar la respuesta generada en un archivo de texto
with open(f"{nombre_carpeta}/{nombre_archivo}_articulo.txt", 'w') as f:
    f.write(respuesta)

# Mostrar el archivo generado y la respuesta por pantalla
print(f"Artículo generado guardado en {nombre_carpeta}/{nombre_archivo}_articulo.txt")
print(respuesta)

¿No entiendes como usar el código de esta publicación?

El curso está desarrollado en el entorno de Linux y el proyecto se realiza utilizando el lenguaje de programación Python. Recomiendo tener conocimientos básicos en este sistema operativo y lenguaje de programación.

Si tienes una cuenta en Azul School, te sugiero que realices los siguientes cursos antes de comenzar:

O bien puedes seguir el curso que esta aquí en formado de texto dando clic aquí y si aun tienes dudas, puedes optar por tomar el Curso práctico: Explorando la inteligencia artificial y OpenAI con Python, donde se explica a detalle cada línea, esta en formato de video y cuenta con soporte para resolver todas tus dudas.

Demo del proyecto

Aquí te dejo un video que forma parte del curso original, para que puedas ver su funcionamiento:


¿Tienes un cometario sobre esto? Dímelo en Twitter o Facebook.