JARVIS: asistente de voz local para Linux

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.
This commit is contained in:
sito 2026-08-16 15:28:31 +02:00
commit 8e4bc8ad94
125 changed files with 25033 additions and 0 deletions

163
README.md Normal file
View file

@ -0,0 +1,163 @@
# JARVIS
Asistente de voz **100 % local** para Linux. Ni el micrófono, ni las
conversaciones, ni el modelo salen de la máquina. Sin cuentas, sin claves, sin
nube. Núcleo propio, escrito para caber en una tarjeta pequeña (NVIDIA T1200 de
4 GB) y hacer lo que se le pide por voz, en castellano.
![Linux](https://img.shields.io/badge/Linux-Debian%2012-A81D33?logo=debian&logoColor=white)
![GNOME](https://img.shields.io/badge/GNOME-X11-4A86CF?logo=gnome&logoColor=white)
![Python](https://img.shields.io/badge/Python-3.11-3776AB?logo=python&logoColor=white)
![Ollama](https://img.shields.io/badge/Ollama-qwen3.5%3A4b-000000?logo=ollama&logoColor=white)
![NVIDIA](https://img.shields.io/badge/CUDA-sm__75-76B900?logo=nvidia&logoColor=white)
![whisper.cpp](https://img.shields.io/badge/whisper.cpp-STT-555555)
![Piper](https://img.shields.io/badge/Piper-TTS-555555)
```
┌───────────────────────────┐
micrófono ─────>│ OÍDO whisper.cpp CUDA │ STT castellano
│ sm_75 · small/GPU │ ~930 ms régimen
└─────────────┬─────────────┘
v
apuntes propios ──> ┌───────────┐ ┌─────────────────────────┐
(RAG) │ SABER │─>│ CEREBRO ollama │
│ model2vec │ │ qwen3.5:4b · tool-call │
│ +híbrido │ │ + RAG pasivo Y agéntico │
└───────────┘ └─────────────┬───────────┘
v
┌───────────────┐ ┌──────────────────────┐
altavoz <───────────│ BOCA Piper │<─│ MANOS │
│ / voz clonada│ │ acciones + shell │
└───────────────┘ └──────────────────────┘
┌───────────┴───────────────────────────┐
│ CARA panel web · WebSocket · reactor │
└────────────────────────────────────────┘
todo en 127.0.0.1 · 0 llamadas a la nube
```
<!-- Captura del panel: añadir docs/panel.png y descomentar
![El panel](docs/panel.png)
-->
## El stack
| Capa | Pieza | Papel |
|---|---|---|
| Oír | whisper.cpp (CUDA, sm_75) | STT en castellano, en la GPU |
| Pensar | Ollama · `qwen3.5:4b` | el cerebro, con tool-calling |
| Saber | model2vec + búsqueda híbrida | RAG sobre los apuntes del usuario |
| Hablar | Piper (o voz clonada con XTTS) | TTS local |
| Cara | panel web · WebSocket · Canvas | el HUD, con el reactor y las métricas |
| Manos | catálogo de acciones + shell | lo que ejecuta en la máquina |
Todo corre en `127.0.0.1`. No hay ninguna llamada a la nube en el uso normal; lo
único que puede salir es una búsqueda web si el modelo decide usarla, y se avisa.
## Requisitos de hardware
Referencia (el equipo del autor):
| | |
|---|---|
| GPU | NVIDIA T1200, **4 GB VRAM**, Turing (sm_75) |
| RAM | 62 GB |
| SO | Debian 12, GNOME sobre X11, PipeWire |
La restricción que manda es la VRAM. El presupuesto, medido:
```
┌──────────────────────────────────┬──────────┬───────────────────────┐
│ COMPONENTE │ VRAM │ NOTA │
├──────────────────────────────────┼──────────┼───────────────────────┤
│ qwen3.5:4b (24/32 capas en GPU) │ 2177 MiB │ el cerebro │
│ whisper small (PICO de la trans- │ 839 MiB │ el pico, no el reposo:│
│ cripción) │ │ ahí estuvo el OOM │
│ ── suma ── │ 3016 MiB │ cabe, con margen justo│
└──────────────────────────────────┴──────────┴───────────────────────┘
```
Corre en menos con un modelo más pequeño; con más VRAM, sobra sitio.
## Instalación
Necesita, en la máquina: [Ollama](https://ollama.com), whisper.cpp compilado con
CUDA (ver [`config/README_whisper_gpu.md`](config/README_whisper_gpu.md)) y
[Piper](https://github.com/rhasspy/piper).
```bash
git clone https://gitea.laenre.net/hacklab/JARVIS.git
cd JARVIS
./install.sh # comprueba servicios, crea el venv y el modelo de Ollama
```
`install.sh` no descarga modelos pesados ni toca el sistema sin avisar: solo
prepara el entorno de Python y crea `qwen3.5:4b-jarvis` a partir del `Modelfile`.
Después:
```bash
./nucleo/saber/indexa.py # (opcional) indexa tus apuntes para el RAG
./nucleo/arranca.sh # el asistente y el panel, en 127.0.0.1
```
## Qué le puedes pedir
Habla en castellano, natural. **150 acciones** en el catálogo, agrupadas:
| Grupo | Nº | Ejemplos |
|---|---|---|
| sistema | 59 | "cuánto espacio queda", "la memoria", "la carga de CPU", "la temperatura" |
| firefox | 54 | "abre el Gmail", "abre YouTube", "abre el GitHub", "abre Maps" |
| ventanas | 12 | "manda la ventana a la izquierda", "maximiza", "centra la ventana" |
| ficheros | 11 | "busca un fichero llamado…", "lee el fichero…", "cuánto ocupa la carpeta…" |
| pentest | 8 | "escanea la red", "los puertos del host…", "resuelve el dominio…", "el whois de…" |
| oasis | 6 | "está corriendo Oasis", "cuántas conexiones tiene" |
Si lo que pides no está en el catálogo, el modelo lo resuelve con un **comando de
shell** (de solo lectura por defecto). Y si pregunta *cómo* se hace algo técnico,
puede **buscar en tus apuntes** (RAG) antes de responder, para dar el comando que
ya has probado en vez de inventarlo.
## Órdenes con root
Algunas acciones necesitan `sudo`. El manejo es explícito y con límites, no un
"root para siempre":
- La contraseña **nunca se escribe en disco**. Vive en memoria del proceso solo
si activas el permiso de sesión, y se pasa a `sudo -S` por la entrada estándar.
- El permiso de sesión **caduca a los 15 minutos** de la última orden, y también
al cerrar el panel.
- **Cada** orden con root muestra su comando exacto en un diálogo antes de
ejecutarlo. El permiso de sesión solo ahorra re-teclear la contraseña; nunca
salta el ver y aprobar. **La voz no puede autoaprobar root.**
Con el candado echado, el asistente no obedece órdenes que toquen el sistema:
las pide desbloquear primero.
## Privacidad
Es la premisa, y se verifica. Ver [PRIVACIDAD.md](PRIVACIDAD.md). Este
repositorio **no incluye** los apuntes indexados ni el diario de conversación:
son del usuario, y el `.gitignore` los bloquea.
## Estructura
```
nucleo/ el asistente (oido, cerebro, boca, manos, cara, saber)
config/ configuración: modelo, voz, whisper CUDA
voz/ clonado de voz con XTTS y caché de frases
entrena/ fine-tuning con QLoRA
install.sh el instalador
```
## Estado y limitaciones
Proyecto en desarrollo. Rugosidades conocidas: varios scripts de `config/` y
`voz/` asumen rutas absolutas del entorno del autor (`~/COFRE/...`) y habría que
hacerlas configurables; el fine-tuning de `entrena/` está pendiente de un ajuste
para modelos multimodales.
## Licencia
Por decidir por el autor. El núcleo es código propio, no derivado.