Una guía completa para crear un asistente de IA para resumir videos de YouTube – Parte 1

Una guía completa para crear un asistente de IA que resuma vídeos de YouTube - Parte 1

Transcribir un vídeo de YouTube utilizando el modelo Whisper de OpenAI

Image generated by the author with Playground.ai

Este artículo es el primero de una serie de tres entradas de blog que explican paso a paso cómo construí un asistente de IA para resumir vídeos de YouTube. Comenzamos esta serie con instrucciones detalladas para capturar la transcripción de un vídeo de YouTube utilizando Whisper de OpenAI, un modelo de voz a texto de código abierto. En la próxima publicación, cubriremos los fundamentos de la sumarización de texto utilizando Langchain y daremos instrucciones detalladas para implementar un pipeline de sumarización basado en Falcon-7b-instruct, un LLM de código abierto ajustado para instrucciones. En la publicación final, veremos cómo demostrar un prototipo de solución utilizando Gradio y Hugging Face Spaces. A lo largo de estas publicaciones, evaluamos diferentes alternativas arquitectónicas para la implementación de cada paso.

Introducción

Imagínate esto: Estás buscando un vídeo que contenga información sobre un tema específico que te apasiona. Una rápida búsqueda en YouTube llena tu pantalla con miniaturas cautivadoras y títulos de vídeo intrigantes. La mayoría de las personas instintivamente se sumergirían en el desplazamiento, buscando la joya digna de hacer clic. Sin embargo, ¿con qué frecuencia te encuentras desplazándote por un vídeo, esperando que contenga la elusiva respuesta a tus preguntas candentes? Si eres como yo, este escenario se desarrolla con demasiada frecuencia, ¡y la experiencia no solo es una pérdida de tiempo sino también increíblemente molesta!

Motivado por esta frustración recurrente, me embarqué en un viaje para crear mi propio Asistente de IA personal. Este compañero inteligente revisa el contenido de los vídeos y resume eficientemente sus ideas y argumentos principales, ahorrándome tiempo y cordura.

En la creación de esta herramienta, utilicé el modelo de lenguaje Falcon large. Y aquí hay una analogía entretenida: al igual que un halcón que se eleva graciosamente a grandes altitudes, poseyendo al mismo tiempo la capacidad de acercarse a cualquier objeto de interés, nuestra herramienta impulsada por Falcon permite a los usuarios obtener una visión panorámica del contenido mientras exploran de manera fluida una transcripción completa y detallada! 🙂

Tal vez te preguntes, ‘¿Pero no hay servicios en línea que ya hagan esto?’ Y tendrías toda la razón. Sin embargo:

  1. A menudo vienen con límites de uso que podrían implicar costos adicionales.
  2. Me encontré deseando tener más control sobre los resúmenes generados, sin posibilidad de ajustar los parámetros según mis necesidades específicas.
  3. Como dice el refrán, ‘¡La alegría está en el camino!’

Así que tomé el asunto en mis propias manos y desarrollé una aplicación que toma la URL de un vídeo de YouTube como entrada y entrega un resumen conciso. ¡Bastante genial, ¿no?

A snapshot of the app’s user interface hosted on Hugging Face Spaces — Image by the author

Un Bosquejo de Solución

Las piezas en movimiento bajo el capó realizan las siguientes tareas:

  1. Obtener la transcripción de YouTube si está disponible. De lo contrario, transcribir el vídeo utilizando un modelo de voz a texto (Whisper de OpenAI) en Hugging Face.
  2. Resumir la transcripción utilizando un enfoque de map-reduce utilizando Langchain y un modelo de lenguaje grande ajustado para seguir instrucciones (Falcon-7b-instruct) en Hugging Face.
  3. Proporcionar una interfaz de usuario atractiva utilizando Gradio que permite al usuario interactuar de manera fluida con el modelo, generar y revisar el resumen junto con el vídeo.
A high-level view of the solution architecture — Image by the author

Mientras implementaba cada paso, probé varias alternativas arquitectónicas. Por ejemplo, implementé cada paso en dos versiones: inferencia en local vs. inferencia en la nube. O, cuando se trata de alojar la aplicación, probé alojamiento en local vs. alojamiento en la nube en Hugging Face Spaces.

Si alguna de estas cosas despierta tu curiosidad, sígueme, hablemos y aprendamos juntos.

Antes de pasar a la siguiente sección, te sugeriría que eches un vistazo rápido al prototipo que está alojado en Hugging Face Spaces. Siéntete libre de probarlo y déjame saber en los comentarios cuál es tu primera impresión.

Paso 1: Capturar la transcripción del video de YouTube

Antes de poder resumir un video, necesitamos su transcripción en formato de texto. Si bien hay transcripciones disponibles para muchos videos de YouTube, es posible que te encuentres con algunos que no las tienen. Si la transcripción está disponible, simplemente la descargamos usando youtube_transcript_api y pytube:

from youtube_transcript_api import YouTubeTranscriptApiimport pytube# obtener la transcripción de YouTube def get_yt_transcript(url): text = '' vid_id = pytube.extract.video_id(url) temp = YouTubeTranscriptApi.get_transcript(vid_id) for t in temp: text+=t['text']+' ' return text

El código simplemente obtiene el ID del video de YouTube desde la URL y utiliza YouTubeTranscriptApi para obtener el objeto de la transcripción. El objeto de la transcripción es una lista de diccionarios, cada uno de ellos contiene el texto de la transcripción, la hora de inicio y la duración de su visualización en el video. La propiedad que buscamos aquí es solo el texto.

Pero ¿qué pasa si YouTube no tiene una transcripción para un video? Ahora las cosas se ponen más interesantes…

Transcribir usando Whisper

Para este propósito, utilicé el famoso modelo Whisper, un modelo de voz a texto de código abierto de OpenAI. Por ahora, no necesitamos preocuparnos demasiado por los detalles internos del modelo siempre y cuando sirva para nuestro propósito. Si bien hay muchos recursos en línea disponibles para eso, si veo interés en los comentarios, también puedo cubrir eso en una publicación de blog separada.

Antes de usar el modelo Whisper, necesitamos descargar el audio del video en un directorio local, lo cual se puede hacer con unas pocas líneas de código:

from pytube import YouTubeyt = YouTube(str(url))audio = yt.streams.filter(only_audio = True).first()out_file = audio.download(filename="audio.wav",output_path="./docs/youtube/")

Ahora estamos listos para usar Whisper para tomar directamente el archivo de audio como entrada y transcribirlo. Primero creamos un objeto de la canalización de Transformers que descargará el modelo de HuggingFace:

import transformerswhisper_asr = transformers.pipeline( "automatic-speech-recognition", model="openai/whisper-large", device_map= 'auto',)

Whisper viene en varias tamaños, desde tiny (con 39 millones de parámetros) hasta large (con 1.55 mil millones de parámetros). Utilicé el whisper-large para obtener la mejor calidad de los resultados. Una vez cargado y comenzado el procesamiento, en su punto máximo, ocupó 12 GB de mi memoria GPU de 16 GB, lo cual estaba bien. Pero puedes optar por utilizar las versiones más pequeñas si se ajustan a tu caso de uso.

Luego, debemos configurar los parámetros de configuración del modelo, incluido el idioma y la tarea:

whisper_asr.model.config.forced_decoder_ids = ( whisper_asr.tokenizer.get_decoder_prompt_ids( language="en", task="transcribe" ))

En este escenario, limité la canalización a transcribir solo videos en inglés. Sin embargo, también puedes utilizar el mismo modelo para transcribir docenas de otros idiomas. Para eso, primero tendrías que determinar el idioma del video antes de configurar la canalización de transcripción. Dejo eso como ejercicio para los lectores interesados.

Finalmente, llamamos al modelo para inferencia:

temp = whisper_asr(out_file,chunk_length_s=20)text = temp['text']

Pero ¿cuál es el argumento chunk_length_s? El modelo Whisper está diseñado para consumir archivos de audio con una duración máxima de 30 segundos. Por lo tanto, el archivo debe dividirse en trozos antes de ser alimentado al modelo. Chunk_length_s simplemente controla la longitud de estos trozos.

Poniéndolo todo junto, el código se verá así:

from pytube import YouTubeimport transformersimport torch# transcribe el vídeo de YouTubedef transcribe_yt_vid(url):    # descargar el audio del vídeo de YouTube    save_dir="./docs/youtube/"    yt = YouTube(str(url))    audio = yt.streams.filter(only_audio = True).first()    out_file = audio.download(filename="audio.wav",                              output_path = save_dir)    # definir un pipeline de reconocimiento automático del habla usando `openai/whisper-large`    whisper_asr = transformers.pipeline(        "automatic-speech-recognition",        model="openai/whisper-large",        device_map= 'auto',    )    # configurar los parámetros del modelo    whisper_asr.model.config.forced_decoder_ids = (        whisper_asr.tokenizer.get_decoder_prompt_ids(            language="en",            task="transcribe"        )    )    # invocar el modelo Whisper    temp = whisper_asr(out_file,chunk_length_s=20)    text = temp['text']       # podemos hacer esto al final para liberar la memoria de GPU    del(whisper_asr)    torch.cuda.empty_cache()       return text

¡OK, ¡Brillante! Pero espera! ¿Y si no tengo suficiente potencia informática localmente y quiero enviar la inferencia a la nube?

Inferencia utilizando las API de HuggingFace Hub

La buena noticia es que HuggingFace permite la inferencia en su nube utilizando las API de HuggingFace Hub.

Así es como funcionaría:

from HuggingFace_hub import InferenceClient# Inicializar el cliente para el modelo Whisperclient = InferenceClient(model="openai/whisper-large", token="xxxxxxxxxxx")

Sólo sería necesario pasar un argumento de token que se puede obtener de HuggingFace de forma gratuita.

Ahora, ¡aquí me encontré con un problema! El API de inferencia truncó el resultado por alguna razón. No pude saber de los recursos en línea si este es un comportamiento esperado o simplemente una limitación debido al uso del servicio gratuito. De cualquier manera, una solución temporal es dividir el audio en trozos antes de enviarlos a través del API de inferencia. Esto se puede hacer utilizando librosa para cargar el archivo de audio como una matriz numpy, luego dividiéndolo en trozos con una longitud que no se vea truncada por el API (para mí, 20 segundos funcionaron bien), y finalmente, guardando cada trozo en un archivo que luego se envía a través del API para la inferencia:

import librosaimport soundfile as sfx, sr = librosa.load(out_file, sr=None)t=20 # duración del fragmento de audio en segundos# Esto da a x como archivo de audio en una matriz numpy y sr como tasa de muestreo original# El audio debe dividirse en trozos de 20 segundos ya que la llamada al API trunca la respuestatext = ''for i in range(0, (len(x)//(t * sr)) +1):    y = x[t * sr * i: t * sr *(i+1)]    split_path = save_dir+"audio_split.wav"    sf.write(split_path, y, sr)    text += client.automatic_speech_recognition(split_path)

Con esta solución temporal, pude transcribir vídeos más largos utilizando el API, también. Pero ten en cuenta que la suscripción gratuita limita la velocidad de la inferencia. Esto significa que si invocas el API demasiadas veces en un corto período de tiempo, podrías obtener un error. La buena noticia es que el límite se restablece cada hora, por lo que no tendrás que esperar mucho tiempo antes de poder probar tu código de nuevo. Pero esto también significa que es posible que no puedas utilizar esta solución temporal para vídeos que sean demasiado largos.

El resultado final puede verse así:

from pytube import YouTubefrom huggingface_hub import InferenceClient# transcribe el vídeo utilizando el API de Hugging Face Hubdef transcribe_yt_vid_api(url):    # descargar el audio del vídeo de YouTube    yt = YouTube(str(url))    audio = yt.streams.filter(only_audio = True).first()    out_file = audio.download(filename="audio.wav",                              output_path = save_dir)       # Inicializar el cliente para el modelo Whisper    client = InferenceClient(model="openai/whisper-large",                       token=os.environ["HUGGINGFACEHUB_API_TOKEN"])    import librosa    import soundfile as sf    text = ''    t=20 # longitud del trozo de audio en segundos    x, sr = librosa.load(out_file, sr=None)    # Esto da a x como archivo de audio en una matriz numpy y sr como tasa de muestreo original    # El audio necesita dividirse en trozos de 20 segundos ya que la llamada al API trunca la respuesta    for i in range(0, (len(x)//(t * sr)) +1):        y = x[t * sr * i: t * sr *(i+1)]        split_path = save_dir+"audio_split.wav"        sf.write(split_path, y, sr)        text += client.automatic_speech_recognition(split_path)    return text

Poniéndolo todo junto

Ahora para combinar los dos enfoques en una función, podemos hacer algo como esto:

def transcribe_youtube_video(url, force_transcribe=False,use_api=False):       yt = YouTube(str(url))    text = ''    # obtener la transcripción de YouTube si está disponible    try:        text = get_yt_transcript(url)    except:        print('La transcripción no estaba disponible, transcribiendo ahora ...')        pass       # transcribe el video si YouTube no proporcionó una transcripción    # o si desea forzar la transcripción de todos modos    if text == '' or force_transcribe:        if use_api:            text = transcribe_yt_vid_api(url)        else:            text = transcribe_yt_vid(url)       return yt.title, text

Conclusión

Resumamos lo que hemos cubierto a lo largo de esta publicación. Creamos tres funciones diferentes para capturar la transcripción de un video de YouTube: la primera la descarga directamente de YouTube, la segunda la transcribe utilizando el modelo de Whisper de OpenAI localmente y la tercera lo hace a través de llamadas a la API de Hugging Face Hub. Vale la pena mencionar que la implementación en entornos de producción sería un poco más compleja. Dependiendo del rendimiento de inferencia y la cantidad de recursos requeridos, el modelo puede ser enviado a un punto final. Hugging Face proporciona servicios de punto final de inferencia, donde el modelo se implementa en una infraestructura dedicada y escalable automáticamente. Dejamos esa discusión para otro momento.

En la siguiente publicación, te guiaré a través de los pasos para tomar la transcripción y resumirla utilizando Langchain y Falcon-7b-instruct en HuggingFace.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Permite un entrenamiento más rápido con la biblioteca de paralelismo de datos de Amazon SageMaker

El entrenamiento de modelos de lenguaje de gran tamaño (LLM, por sus siglas en inglés) se ha vuelto cada vez más popu...

Inteligencia Artificial

El Bucle de Retroalimentación de la IA Manteniendo la Calidad de Producción del Modelo en la Era del Contenido Generado por IA

Explora cómo el bucle de retroalimentación de IA puede ayudar a mantener la calidad del modelo, mejorar la eficiencia...

Inteligencia Artificial

Esta Investigación de IA Explica los Rasgos de Personalidad Sintéticos en los Modelos de Lenguaje de Gran Escala (LLMs)

La personalidad de un individuo consiste en una combinación única de cualidades, características y formas de pensar. ...

Inteligencia Artificial

Conoce AnyLoc El último método universal para el reconocimiento visual de lugares (VPR)

A medida que el campo de la Inteligencia Artificial avanza constantemente, ha encontrado su camino en numerosos casos...