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.
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.