Asistente de voz en el navegador. Un orbe minimalista, wake word, respuestas en streaming y TTS natural. Pensado para pantallas táctiles, kioscos y despliegues web.
Toca el orbe · di «Lea» · habla · escucha la respuesta
Lea es una interfaz solo voz: sin chat, sin teclado, sin ruido visual. El orbe cambia de color según el estado:
| Estado | Orbe | Qué ocurre |
|---|---|---|
| Idle | Azul profundo, respirando | Escucha la wake word o espera un toque |
| Listening | Azul brillante + ondas | Captura tu frase |
| Thinking | Morado girando | Consulta a OpenClaw |
| Speaking | Verde con ondas | Responde con TTS en streaming |
| Error | Rojo | Mensaje breve y vuelve a idle |
Barge-in: toca el orbe mientras responde o piensa para interrumpir y escuchar de nuevo.
Seguimiento: al terminar de hablar, Lea sigue escuchando unos segundos — no hace falta volver a decir «Lea».
Despedida: «adiós», «gracias Lea», «hasta luego», «chao» → vuelve a reposo.
- React 18 + Vite 5 + Tailwind CSS
- Web Speech API + VAD (Silero ONNX en el cliente)
- OpenClaw como backend conversacional (SSE streaming)
- OpenAI para STT/TTS (configurable)
- Docker + nginx para producción con proxy seguro a OpenClaw, STT y TTS
git clone https://github.com/grisbope/lea.git
cd lea
cp .env.example .env # edita PIN, claves y URLs
npm install
npm run devAbre http://localhost:5173. En producción necesitas HTTPS para micrófono y reconocimiento de voz.
npm run build
npm run previewCopia .env.example → .env y ajusta:
| Variable | Descripción |
|---|---|
VITE_OPENCLAW_URL |
URL del gateway (/openclaw detrás de nginx, o URL absoluta en dev) |
VITE_OPENCLAW_KEY |
Bearer token del gateway |
VITE_OPENCLAW_MODEL |
Agente OpenClaw (p. ej. openclaw/main) |
LOGIN_PIN |
PIN de acceso (solo servidor, no va al JS) |
AUTH_SECRET |
Secreto para firmar la cookie HttpOnly |
VITE_LANG |
Locale de voz (es-ES) |
VITE_FOLLOWUP_MS |
Ventana (ms) para seguir hablando sin repetir «Lea» |
VITE_OPENAI_* |
Modelos de STT/TTS de OpenAI |
En Docker, nginx inyecta la autenticación hacia OpenClaw y expone
/stt/y/tts/como proxy same-origin hacia OpenAI. En Vercel o dev directo, configuraVITE_OPENCLAW_URLyVITE_OPENCLAW_KEYapuntando a tu gateway.
- Importa el repo en vercel.com.
- Framework preset: Vite.
- Añade las variables
VITE_*en el panel de Environment Variables. - Deploy.
El vercel.json incluido enruta la SPA y sirve los assets de VAD.
docker build -t lea .
docker run -p 8080:80 \
-e OPENCLAW_UPSTREAM=http://openclaw:18789 \
-e OPENCLAW_KEY=tu-clave \
-e OPENAI_API_KEY=tu-clave-openai \
lea- URL de inicio → tu deploy HTTPS
- Permisos: micrófono siempre, autoplay permitido
- Pantalla siempre encendida, fullscreen
- Primer toque activa el micrófono (política del navegador)
src/
App.jsx # Máquina de estados de voz
components/
Orb.jsx # Orbe animado
Login.jsx # Pantalla PIN
lib/
speech.js # Reconocimiento + VAD
tts.js # Cola TTS por frases
openclaw.js # Streaming SSE
wakeword.js # Detección de activación
intent.js # Despedidas y filtro de eco
auth.js # Sesión local con PIN
public/vad/ # Modelos ONNX (Silero + ORT)
MIT — ver LICENSE.
Hecho para conversaciones cortas, naturales y sin fricción.