Voice-to-SQL Dashboard

FastAPI Python Groq Llama 3.3 70B Text-to-SQL SQLite Web Speech API Vanilla JS
Voice-to-SQL Dashboard

Voice-to-SQL Dashboard: pregúntale a tus datos en lenguaje natural

Consultar una base de datos exige saber SQL, y eso deja fuera a la mayoría de la gente que necesita los datos. Este proyecto elimina esa barrera: escribes —o dices en voz alta— una pregunta de negocio ("¿cuáles son los 5 productos más vendidos?", "¿cuántos clientes han hecho churn este año?") y el sistema la traduce a SQL, la ejecuta sobre una base de datos de ejemplo y te devuelve la tabla de resultados en menos de un segundo, mostrando además el SQL exacto que ha generado.

Cómo funciona

El pipeline tiene cuatro pasos, sin magia oculta:

  • Voz → texto (en el navegador). Si usas el micrófono, la transcripción la hace la Web Speech API nativa del navegador en español (es-ES). El servidor nunca recibe audio ni paga por servicios de transcripción.
  • Texto → SQL (Groq + Llama 3.3 70B). La pregunta se envía al LLM junto con el esquema exacto de la base de datos. El modelo devuelve una consulta SQL en dialecto SQLite.
  • Validación de seguridad. Antes de tocar la base de datos, el SQL pasa por un sanitizador que solo deja pasar lo que es seguro.
  • Ejecución y respuesta. La consulta se ejecuta sobre SQLite y se devuelven las filas, las columnas y el propio SQL, para total transparencia.

Seguridad: la parte difícil

Dejar que un LLM genere SQL que se ejecuta contra tu base de datos es peligroso si no se controla. Por eso el sanitizador solo permite consultas de lectura: acepta SELECT y WITH, y rechaza cualquier INSERT, UPDATE, DELETE, DROP, ALTER, PRAGMA o varias sentencias encadenadas con punto y coma. Además impone un tope de 100 filas por respuesta. El usuario nunca puede modificar ni borrar datos a través del modelo.

La base de datos de ejemplo

Para que la demo sea realista, la base SQLite simula el back-office de una empresa SaaS: 200 clientes (con país, sector, plan y estado de churn), 8 productos (planes y add-ons con su precio mensual) y 5.000 ventas del último año con su contribución al MRR. Eso permite preguntas analíticas de verdad: ingresos por país, MRR por plan, tasa de churn o productos más vendidos.

Stack

Backend en FastAPI (Python), LLM vía Groq (Llama 3.3 70B, con fallback a un modelo más ligero ante saturación), persistencia en SQLite y un frontend de una sola página en Vanilla JS que usa la Web Speech API y muestra el SQL junto a la tabla de resultados. Sin frameworks pesados y sin servicios de pago para la voz.

Es una demo: la base de datos es sintética y de solo lectura. La misma arquitectura, apuntando a una base de datos real con los permisos adecuados, es la base de un asistente analítico interno.

Resultados

< 1 s
de la pregunta al resultado
(generación SQL + consulta)
SELECT-only
solo lectura — sanitización de seguridad
5.000
ventas en la base de datos demo
(200 clientes · 8 planes)
0 €
coste de voz: Web Speech API nativa

Comparativa de mercado

Solución Coste mensual Modelo de cobro Datos propios Personalización
Voice-to-SQL Dashboard Self-hosted Solo el coste de la API del LLM ✅ Tu propia base de datos ✅ Total (código propio)
BI tradicional (Power BI, Looker) Licencia por usuario Suscripción mensual ⚠️ Requiere construir dashboards
Asistentes NL→SQL en SaaS Por consulta o asiento Suscripción ⚠️ Tus datos salen a un tercero ⚠️ Limitada

Precios de referencia públicos. Pueden variar según plan y negociación.

Funcionalidades implementadas

  • 🎙 Voz sin coste de backend. La transcripción ocurre en el navegador con la Web Speech API; el servidor nunca procesa audio ni paga por transcripción.
  • 🛡 Seguro por diseño. Solo se permiten consultas SELECT/WITH. Se bloquean INSERT, UPDATE, DELETE, DROP y sentencias múltiples, con un tope de 100 filas por respuesta.
  • Respuesta inmediata. Groq genera el SQL en milisegundos y SQLite lo ejecuta en local: de la pregunta a la tabla en menos de un segundo.
  • 🔍 Totalmente transparente. Cada respuesta muestra el SQL exacto que se ha generado y ejecutado. Nada de cajas negras: ves qué consultó el modelo.
Try Live Demo View Code