← Todos los proyectos
2025 — presente · proyecto personal

CampusBot

Asistente de voz con IA para la Escola d'Enginyeria de la UAB

Robot guía físico que reconoce a quien tiene delante (por cara, voz o NIU), responde en castellano, catalán o inglés sobre el campus y el horario del día, y se gestiona desde un panel central con varias instancias.

~200 ms
hasta que empieza a sonar la respuesta (TTS en streaming)
3 idiomas
castellano, catalán e inglés
6 capas
api · voice · face · users · data · interface

El problema

Quien llega a la Escola d'Enginyeria no sabe dónde está cada aula ni qué clases hay hoy, y la información está repartida entre PDFs de horarios y páginas oficiales. La idea: un punto de información físico que reconozca a la persona y le conteste por voz, sin pantallas de menús.

Arquitectura

Backend en Python 3.13 con Flask y Flask-SocketIO, organizado en seis capas (api, voice, face, users, data, interface) con más de ocho funcionalidades independientes.

Varias instancias físicas coordinadas en modo maestro-esclavo por Socket.IO, con un panel de administración (Chart.js) que muestra horas pico, idiomas, consultas más frecuentes y feedback.

PWA instalable y una suite de pytest que trabaja sobre una base de datos aislada.

Reconocer a la persona

Reconocimiento facial con OpenCV YuNet + SFace (embeddings de 128 dimensiones en ONNX), sin TensorFlow ni PyTorch, para que funcione en hardware modesto.

Prueba de vida doble (diferencia de píxeles + flujo óptico Farneback) para rechazar fotos.

Identificación del hablante con Resemblyzer (embeddings de 256 dimensiones, similitud coseno ≥ 0,70) y reconocimiento de voz multilingüe con Whisper.

Responder con contexto

GPT-4o-mini con contexto del campus y un RAG propio basado en TF-IDF (sin dependencias externas) sobre las páginas oficiales de la UAB.

Un scraper de los PDFs de horarios con pdfplumber (celdas fusionadas, limpieza de ruido) los vuelca a SQLite (8 tablas), y el horario del día se inyecta automáticamente en el contexto.

Síntesis de voz en streaming PCM directo a PyAudio: el audio empieza a sonar a los ~200 ms, sin esperar al clip completo.

La cara del robot

Frontend 3D con Three.js y shaders GLSL: un cerebro procedural de unos 6.200 tetraedros instanciados con tres estados (reposo, escuchando, hablando) y UnrealBloomPass.

Tecnologías

Python 3.13FlaskFlask-SocketIOOpenAI (GPT-4o-mini, Whisper, TTS)OpenCVResemblyzerpdfplumberSQLiteThree.jsGLSLChart.jspytestPWA

Más proyectos