Asistente para linux
Find a file
sito 3c94c1f375 docs: captura del panel, video de ejemplo y documentacion del RAG
- docs/panel.png y docs/demo.webm: el panel en funcionamiento (telemetria,
  reactor, catalogo de acciones y las metricas de rendimiento).
- docs/rag.md: el metodo del RAG, el pipeline de enriquecimiento y los
  resultados medidos (hit@1 48->82%, hit@5 77->95%), incluido el resultado
  negativo de que un embedder transformer no compensa. El indice NO se
  publica: contiene los apuntes del usuario.
- hud.js: datos de ejemplo de la seccion de rendimiento para el modo demo.
2026-08-16 15:45:02 +02:00
config JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
docs docs: captura del panel, video de ejemplo y documentacion del RAG 2026-08-16 15:45:02 +02:00
entrena JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
nucleo docs: captura del panel, video de ejemplo y documentacion del RAG 2026-08-16 15:45:02 +02:00
voz JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
.gitignore JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
AGENTS.md JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
install.sh JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
jarvis-icon.svg JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
jarvis-launcher.sh JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
preview_reactor.py JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
PRIVACIDAD.md JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00
README.md docs: captura del panel, video de ejemplo y documentacion del RAG 2026-08-16 15:45:02 +02:00
requirements.txt JARVIS: asistente de voz local para Linux 2026-08-16 15:34:37 +02:00

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 GNOME Python Ollama NVIDIA whisper.cpp Piper

                        ┌───────────────────────────┐
        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

El panel de JARVIS

El panel: telemetría del sistema, el reactor, lo que oye y hace, el catálogo de acciones, y las métricas de rendimiento del propio asistente. Hay un vídeo de ejemplo (47 s) en docs/.

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, whisper.cpp compilado con CUDA (ver config/README_whisper_gpu.md) y Piper.

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:

./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 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. El método, el pipeline y los resultados medidos están en docs/rag.md.

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