Sistema Inteligente de Analisis Multimodal de Reuniones

Python, Whisper V3, scikit-image, Computer Vision, Multimodal AI, LLM, GPU Acceleration, Email Automation

Main project image

Sistema de procesamiento multimodal disenado para analizar grabaciones completas de reuniones mediante audio + video, extraer unicamente la informacion visual relevante y generar automaticamente un resumen estructurado de la reunion.

Visitar el proyecto ↗

Tabla de Contenidos

  1. Descripcion General
  2. Problema
  3. Solucion
  4. Arquitectura
  5. Stack Tecnologico
  6. Optimizacion
  7. Casos de Uso
  8. Desafios y Aprendizajes
  9. Reflexiones Finales

Descripcion General

Sistema de procesamiento multimodal disenado para analizar grabaciones completas de reuniones mediante audio + video, extraer unicamente la informacion visual relevante y generar automaticamente un resumen estructurado de la reunion.

El sistema combina transcripcion automatica mediante Whisper V3, procesamiento de video, analisis y seleccion inteligente de frames, procesamiento multimodal mediante modelos de lenguaje y automatizacion del envio del resultado por correo electronico.

El objetivo principal es convertir una grabacion de una reunion en un documento estructurado que permita conocer que ocurrio, que se discutio, que decisiones se tomaron y cuales fueron los puntos importantes, sin necesidad de revisar manualmente toda la grabacion.

Caracteristicas principales


Problema

Las reuniones virtuales generan una gran cantidad de informacion que normalmente queda almacenada unicamente como una grabacion.

Una reunion de una hora puede contener:

El problema es que no todos los frames del video contienen informacion util.

Por ejemplo:

Frame 001 → Presentacion
Frame 002 → Presentacion
Frame 003 → Presentacion
Frame 004 → Presentacion
Frame 005 → Presentacion
Frame 006 → Presentacion
Frame 007 → Nueva diapositiva
Frame 008 → Nueva diapositiva
Frame 009 → Nueva diapositiva

Enviar todos estos frames a un modelo multimodal seria innecesariamente costoso y consumiria una cantidad considerable de recursos.

Por esta razon, el sistema implementa una etapa especifica de seleccion de frames relevantes.


Solucion

El sistema divide el problema en diferentes etapas:

flowchart TB
    Grab["Grabación reunión"] --> Audio["Audio"]
    Grab --> Video["Video"]
    Audio --> Whisper["Whisper V3"]
    Video --> Extraccion["Extracción frames"]
    Whisper --> Transcr["Transcripción"]
    Extraccion --> Comparacion["Comparación"]
    Comparacion --> FramesOK["Frames relevantes"]
    Transcr --> Multi["Procesamiento<br/>multimodal"]
    FramesOK --> Multi
    Multi --> Resumen["Resumen<br/>estructurado"]
    Resumen --> Email["Email"]

La arquitectura busca reducir el volumen de informacion procesada antes de llegar al modelo encargado de generar el resumen.


Arquitectura

1. Ingesta de la grabacion

El sistema recibe una grabacion de una reunion.

La grabacion contiene dos fuentes principales de informacion:

Video
 ├── Audio
 └── Informacion visual

Ambas fuentes se procesan de manera independiente para posteriormente combinarlas.

2. Transcripcion mediante Whisper V3

Para convertir el contenido hablado en texto se utilizo Whisper V3.

Whisper permite transformar el audio de la reunion en una transcripcion que posteriormente puede ser procesada por el sistema de inteligencia artificial.

El flujo es:

Audio
  ↓
Whisper V3
  ↓
Transcripcion
  ↓
Segmentos temporales

Los segmentos temporales son especialmente importantes porque permiten relacionar lo que se esta diciendo con lo que aparece visualmente en pantalla.

3. Optimizacion de Whisper: CPU + GPU

Uno de los puntos importantes de la implementacion fue la optimizacion del uso de recursos de hardware.

El procesamiento no se ejecuto exclusivamente sobre GPU.

Se configuro Whisper para aprovechar GPU y CPU, utilizando las capacidades disponibles en la libreria de inferencia para distribuir y ajustar el uso de recursos.

Conceptualmente:

flowchart TB
    W["Whisper V3"] --> GPU["GPU"]
    W --> CPU["CPU"]
    GPU --> T["Transcripción"]
    CPU --> T

Durante las pruebas, el procesamiento mostro una utilizacion aproximada de:

La prioridad no fue unicamente aumentar el uso de GPU, sino encontrar un equilibrio entre velocidad de inferencia y utilizacion eficiente del hardware disponible.

La optimizacion se realizo principalmente mediante la configuracion de la libreria y sus parametros de ejecucion, en lugar de realizar optimizaciones algoritmicas de bajo nivel sobre el codigo del modelo.

4. Procesamiento del video

Mientras Whisper procesa el audio, el video se procesa de manera independiente.

El sistema extrae frames a intervalos determinados para obtener una representacion visual de la reunion. El procesamiento de imagenes se realiza utilizando scikit-image (skimage), una libreria de Python para procesamiento de imagenes que proporciona herramientas eficientes para analisis visual y comparacion de frames.

Video
  │
  ▼
Extraccion de frames
  │
  ├── Frame 1
  ├── Frame 2
  ├── Frame 3
  ├── ...
  └── Frame N

Sin embargo, almacenar y analizar todos los frames no es eficiente. Por eso se introduce una etapa de reduccion.

5. Seleccion inteligente de frames

Una reunion puede mantener la misma pantalla durante varios minutos.

Si todos los frames representan practicamente la misma informacion, procesarlos individualmente no aporta valor adicional.

El sistema compara los frames y determina cuales representan cambios suficientemente relevantes.

flowchart TB
    Orig["Frames originales<br/>(ej. 1000 frames)"] --> Comp["Comparación<br/>(SSIM + bordes)"]
    Comp --> Rel["Frames relevantes<br/>(ej. 150 frames)"]
    Rel --> Multi["Procesamiento multimodal"]

Esto reduce significativamente la cantidad de imagenes que posteriormente deben ser procesadas por el modelo multimodal.

6. Comparacion de frames con scikit-image

La comparacion tiene como objetivo detectar cambios visuales relevantes utilizando scikit-image (skimage).

El sistema utiliza varias tecnicas de procesamiento de imagenes:

Conversion a escala de grises:

from skimage import color

gray_frame = color.rgb2gray(frame)

Calculo de diferencia estructural (SSIM):

from skimage.metrics import structural_similarity as ssim

score = ssim(frame_a, frame_b)
if score < threshold:
    # Cambio significativo detectado
    relevant_frames.append(frame_b)

Deteccion de bordes y caracteristicas:

from skimage.feature import canny, corner_harris

edges = canny(gray_frame)
corners = corner_harris(gray_frame)

No todo cambio de frame implica informacion nueva. El umbral de SSIM se configura para ignorar cambios menores (animaciones de cursor, transiciones suaves) y conservar solo cambios estructurales significativos (nueva diapositiva, nuevo documento, cambio de aplicacion).

CasoFrame A → Frame BResultado
Cambio irrelevanteMisma diapositiva, misma información, misma interfazSe descarta
Cambio relevanteDiapositiva 1 → Diapositiva 2Se conserva

Otros ejemplos de informacion visual potencialmente relevante:

7. Procesamiento multimodal

Una vez obtenidos la transcripcion y los frames relevantes, ambas fuentes se combinan para generar una representacion mas completa de la reunion.

Esto permite evitar un problema comun de los sistemas basados unicamente en transcripcion.

Ejemplo:

Una persona puede decir: “Como pueden observar en esta grafica…”

La transcripcion por si sola no contiene la grafica. El frame correspondiente permite recuperar el contexto visual mencionado durante la conversacion.

flowchart TB
    A["Audio<br/>'Como pueden observar<br/>en esta gráfica…'"] --> C["Contexto completo"]
    I["Imagen<br/>(gráfica mostrada<br/>en la reunión)"] --> C

8. Contexto temporal

Otro componente importante es mantener la relacion temporal entre el audio y las imagenes.

flowchart TB
    T1["00:12:35<br/>'Vamos a revisar<br/>los resultados…'"] --> F["00:12:40<br/>Frame relevante<br/>(gráfica de resultados)"]
    F --> T2["00:13:05<br/>'Como pueden observar…'"]

Esto permite que el sistema no solamente conozca que aparecio en pantalla, sino tambien cuando aparecio y que se estaba hablando en ese momento.

9. Generacion del resumen

Despues de procesar la informacion, el sistema genera un resumen estructurado de la reunion.

El resultado puede incluir informacion como:

flowchart TB
    R["Resumen de la reunión"] --> O["Objetivo"]
    R --> T["Temas tratados"]
    R --> P["Puntos importantes"]
    R --> D["Decisiones tomadas"]
    R --> Prob["Problemas identificados"]
    R --> Res["Resultados"]
    R --> Acc["Acciones pendientes"]
    R --> Resp["Responsables"]
    R --> Con["Conclusiones"]

El objetivo no es simplemente resumir la transcripcion. El sistema intenta construir una representacion de lo que realmente ocurrio durante la reunion, utilizando tanto informacion hablada como visual.

10. Envio automatico por correo

Una vez generado el resumen, el sistema automatiza la entrega del resultado.

flowchart TB
    G["Resumen generado"] --> P["Preparación del documento"]
    P --> S["Servicio de correo"]
    S --> U["Usuario"]

El usuario recibe el resultado sin necesidad de revisar manualmente la grabacion.

Diagrama de Arquitectura

Diagrama de arquitectura del sistema


Flujo completo

flowchart TB
    RG["Reunión grabada"] --> Sep["Separar datos"]
    Sep --> AU["Audio"]
    Sep --> VI["Video"]
    AU --> W["Whisper V3"]
    VI --> E["Extraer frames"]
    W --> TR["Transcripción"]
    E --> CO["Comparar"]
    CO --> FOK["Frames relevantes"]
    TR --> MM["Procesamiento<br/>multimodal"]
    FOK --> MM
    MM --> GR["Generación resumen"]
    GR --> ER["Estructuración reporte"]
    ER --> EM["Envío email"]

Stack Tecnologico

ComponenteFuncion
PythonLenguaje principal del sistema
Whisper V3Transcripcion del audio
scikit-imageProcesamiento y comparacion de imagenes (SSIM, deteccion de bordes, escala de grises)
GPUAceleracion de inferencia
CPUProcesamiento complementario
Procesamiento de videoObtencion de frames
Computer VisionComparacion de imagenes y eliminacion de frames redundantes
Modelo multimodalComprension de audio + informacion visual
LLMGeneracion del resumen
EmailDistribucion automatica del resultado

Optimizacion

Optimizacion del modelo

En lugar de modificar internamente el modelo, se utilizaron las capacidades de configuracion de la libreria para controlar como se ejecutaba la inferencia.

flowchart TB
    HW["Hardware disponible"] --> CPU["CPU"]
    HW --> GPU["GPU"]
    CPU --> W["Whisper"]
    GPU --> W
    W --> V["Alta velocidad"]

Optimizacion del procesamiento visual

La segunda optimizacion importante fue reducir la cantidad de frames.

Sin filtrado:

flowchart TB
    A["1000 frames"] --> B["1000 imágenes procesadas"]

Con seleccion:

flowchart TB
    F["1000 frames"] --> C["Comparación"]
    C --> R["150 frames relevantes"]
    R --> M["Procesamiento multimodal"]

Esta estrategia reduce:


Ventajas del enfoque

Frente a una solucion basada unicamente en Whisper

Whisper puede proporcionar una excelente transcripcion, pero no puede conocer directamente toda la informacion que aparece en pantalla.

Whisper:

Persona: “Este es el resultado que obtuvimos.”

Sistema multimodal:

Persona: “Se presenta una grafica mostrando…”

El segundo enfoque proporciona mayor contexto.

Ventajas frente a analizar todos los frames

Analizar cada frame seria una estrategia costosa y redundante.

flowchart TB
    MF["Muchos frames"] --> F["Filtrado"]
    F --> PF["Pocos frames relevantes"]
    PF --> MM["Modelo multimodal"]

Esto permite concentrar los recursos de computo en informacion que tiene mayor probabilidad de aportar valor.


Casos de Uso

Reuniones empresariales

Generar automaticamente un resumen despues de una reunion.

Reuniones tecnicas

Capturar informacion visual como codigo, diagramas, arquitectura, metricas y dashboards.

Clases y conferencias

Generar un resumen utilizando tanto la explicacion del profesor como las diapositivas.

Presentaciones

Relacionar la informacion hablada con las graficas y documentos mostrados.

Reuniones de equipos

Extraer decisiones, tareas, problemas, responsables y proximos pasos.


Estructura del Proyecto

meeting-analyzer/
├── src/
│   ├── audio/
│   │   ├── transcription.py
│   │   └── whisper.py
│   ├── video/
│   │   ├── frame_extractor.py
│   │   └── frame_comparator.py
│   ├── multimodal/
│   │   └── analyzer.py
│   ├── summary/
│   │   └── generator.py
│   ├── email/
│   │   └── sender.py
│   └── pipeline.py
├── tests/
├── requirements.txt
├── .env.example
└── README.md

Requisitos de hardware

El sistema puede ejecutarse utilizando CPU, pero el procesamiento de Whisper se beneficia considerablemente de una GPU compatible.

CPU: Permite ejecutar todo el pipeline, aunque el tiempo de procesamiento puede aumentar dependiendo del tamano de la grabacion.

GPU: Recomendada para inferencia de Whisper, procesamiento acelerado y reduccion del tiempo total del pipeline.

La configuracion hibrida CPU/GPU permite aprovechar mejor equipos con suficiente capacidad de computo.


Desafios y Aprendizajes

1. Speech-to-Text de alta calidad

Implementar Whisper V3 con configuracion optima para diferentes tipos de audio, acentos y calidades de grabacion.

2. Seleccion inteligente de frames

Desarrollar un algoritmo eficiente para comparar frames y detectar cambios visuales relevantes sin perder informacion importante.

3. Procesamiento multimodal

Combinar efectivamente la transcripcion con el contexto visual para generar resumenes mas completos y precisos.

4. Optimizacion de recursos

Balancear el uso de GPU y CPU para maximizar la velocidad de inferencia sin saturar el hardware disponible.

5. Contexto temporal

Mantener la relacion temporal entre el audio y las imagenes para que el sistema sepa que se estaba hablando cuando aparecio cada elemento visual.

6. Generacion de resumenes estructurados

Utilizar LLMs para transformar informacion no estructurada en documentos bien organizados con secciones claras.


Reflexiones Finales

  1. El valor del contexto multimodal: Este proyecto no se limita a realizar una transcripcion. Su principal caracteristica es la recuperacion selectiva de contexto multimodal, combinando audio y video para una comprension mas completa.

  2. La importancia de la seleccion inteligente: Enviar todos los frames a un modelo seria innecesariamente costoso. La seleccion previa permite concentrar los recursos en informacion que realmente aporta valor.

  3. Optimizacion practica: La optimizacion se realizo principalmente mediante configuracion de librerias y parametros de ejecucion, demostrando que no siempre se necesitan optimizaciones algoritmicas de bajo nivel.

  4. Pipeline automatizado: El sistema convierte una grabacion en un documento estructurado sin intervencion manual, desde la ingesta hasta la entrega por email.

  5. Aprendizajes tecnicos: Durante el desarrollo se trabajaron conceptos de Speech-to-Text, Computer Vision, modelos multimodales, LLMs, inferencia con GPU, procesamiento hibrido CPU/GPU, optimizacion de recursos y automatizacion.


Posibles mejoras


Sistema construido con Python, Whisper V3, Computer Vision, modelos multimodales y automatizacion de email.