Nucleo propio: oye con whisper.cpp, piensa con un modelo de Ollama, habla con Piper, y hace RAG sobre los apuntes del usuario. 100% local, sin cuentas ni claves. Escrito bajo una restriccion dura, 4 GB de VRAM: el cerebro y whisper comparten tarjeta y solo caben porque estan dimensionados para ello. El RAG usa embeddings estaticos con busqueda hibrida; la voz clonada se sirve de una cache de frases. Incluye instalador (install.sh), requisitos, y documentacion del stack, del manejo de root y de las acciones. Los apuntes indexados y el diario NO se incluyen: son privados y el .gitignore los bloquea.
2 KiB
2 KiB
Privacidad
La premisa del proyecto es que nada sale de la máquina. No es un eslogan: se verifica, y este documento dice qué es local, qué podría salir y qué se ha dejado deliberadamente fuera de este repositorio.
Qué es local
| Pieza | Dónde corre |
|---|---|
| Cerebro (modelo) | Ollama en 127.0.0.1:11434 |
| Escucha (STT) | whisper.cpp, en la propia máquina |
| Voz (TTS) | Piper / XTTS, en la propia máquina |
| Memoria de conversación | ficheros locales |
| RAG | índice local sobre apuntes locales |
Ninguna de estas piezas necesita una cuenta ni una clave. El asistente funciona con la máquina desconectada de internet.
Qué puede salir, y no es un fallo
- La búsqueda web, solo si el modelo decide usarla para una pregunta que lo pide. Es una herramienta que se invoca, no una fuga de fondo, y se avisa.
Fuera de eso, no hay tráfico saliente durante el uso normal.
Qué NO está en este repositorio, a propósito
Este código es público; los datos del usuario no. El .gitignore bloquea, y
nunca se deben añadir:
nucleo/datos/saber.jsonly sus derivados (cosecha.jsonl,sintesis.jsonl): contienen el TEXTO de los apuntes indexados. Publicarlos publicaría los apuntes.nucleo/datos/diario.jsonl: es lo que el usuario le ha dicho al asistente por voz.voz/ref/y las cachés de audio: la voz de referencia y las frases sintetizadas son personales.- Entornos, modelos y datasets: se reconstruyen; no son código.
Lo único de nucleo/datos/ que sí va es acciones.json (el catálogo de lo que
el asistente sabe hacer) y su generador: definen capacidades, no datos.
Cómo comprobarlo
- Que nada nuestro escuche fuera de loopback:
ss -ltnp | grep -vE '127\.0\.0\.1|\[::1\]' - Que el cerebro apunta a local: revisar el endpoint en
nucleo/cerebro/. - Que no hay claves en el repo: no hay ningún fichero de credenciales; el
manejador de sudo (
nucleo/manos/sudo_root.py) guarda la contraseña solo en memoria durante la sesión y la borra al terminar.