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:
commit
8e4bc8ad94
125 changed files with 25033 additions and 0 deletions
163
README.md
Normal file
163
README.md
Normal 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.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
```
|
||||
┌───────────────────────────┐
|
||||
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 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue