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](https://ai.miximages.com/miro.medium.com/v2/resize:fit:640/format:webp/1*ukEo9TFzwIKIHlmCwHfIcw.png)
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.
- ¿Cómo optimizar los ingresos utilizando la fijación dinámica de precios?
- ¡Conoce a nuestro nuevo tutor de IA!
- 5 libros gratuitos para dominar el aprendizaje automático
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:
- A menudo vienen con límites de uso que podrían implicar costos adicionales.
- 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.
- 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](https://ai.miximages.com/miro.medium.com/v2/resize:fit:640/format:webp/1*_fKdYMG_eR689ah7Xm3a4w.png)
Un Bosquejo de Solución
Las piezas en movimiento bajo el capó realizan las siguientes tareas:
- 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.
- 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.
- 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.
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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- El Orden Importa Cómo la Inteligencia Artificial Lucha con la Inversa
- Investigadores de Microsoft presentan Table-GPT Elevando modelos de lenguaje para destacar en la comprensión de tablas bidimensionales y tareas relacionadas.
- Solo usa LLMs si sabes cómo hacer la tarea por ti mismo/a
- ¿Cómo construir una aplicación de búsqueda multi-modal con Chroma?
- Explora las capacidades mejoradas de validación de datos de Pydantic V2
- Una guía universal para la ingeniería rápida el Marco de Andamios Contextuales (CSF)
- Las fronteras éticas de la IA generativa Introducción e importancia