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.
46 lines
2.3 KiB
Bash
Executable file
46 lines
2.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Envoltorio: el whisper-server de Newelle, pero el nuestro compilado con CUDA.
|
|
# Newelle lo invoca por flatpak-spawn --host esperando 'whisper-server' en el
|
|
# PATH; aqui se fija el entorno de CUDA (que el binario necesita para ver las
|
|
# libs) y se pasa a nuestra version con GPU. Los argumentos (-m, --port, -l...)
|
|
# los pone Newelle y se reenvian tal cual.
|
|
#
|
|
# Copia versionada: ~/COFRE/CODERS/JARVIS/config/whisper-server-envoltorio.sh
|
|
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:-}
|
|
|
|
BINARIO="$HOME/COFRE/CODERS/JARVIS/voz/whisper-cuda/whisper.cpp/build/bin/whisper-server"
|
|
REGISTRO="$HOME/COFRE/CODERS/JARVIS/voz/whisper-arranques.log"
|
|
|
|
# Cuanta VRAM libre exigimos para arrancar en GPU. El modelo small ocupa 757 MiB
|
|
# en reposo pero llega a 839 en el pico de una transcripcion: pedir solo lo que
|
|
# ocupa al cargar es justo el error que hacia que cargase bien y muriese al
|
|
# hablarle, con un "Error recognizing file with server" que no explicaba nada.
|
|
# 950 deja holgura para el pico y para el contexto de CUDA.
|
|
MINIMO_MIB=${JARVIS_WHISPER_MIN_VRAM:-950}
|
|
|
|
# Barrer el servidor anterior antes de levantar el nuestro.
|
|
#
|
|
# Newelle lo lanza por flatpak-spawn --host, asi que el proceso vive FUERA del
|
|
# sandbox y no se entera de que la app se cerro: cada vez que se reinicia
|
|
# JARVIS queda un whisper-server huerfano agarrado a 757 MiB de la tarjeta.
|
|
# Dos o tres reinicios y ya no cabe el modelo del asistente, con el sintoma
|
|
# repartido —a veces va, a veces no— segun cuantos hubiera quedado sueltos.
|
|
#
|
|
# Se comparan PIDs y no patrones: un `pkill -f whisper-server` desde aqui se
|
|
# mataria a si mismo, que este script tiene ese nombre.
|
|
for otro in $(pgrep -x whisper-server 2>/dev/null); do
|
|
[ "$otro" = "$$" ] && continue
|
|
kill "$otro" 2>/dev/null
|
|
done
|
|
|
|
libre=$(nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits 2>/dev/null | head -1)
|
|
|
|
if [ -n "$libre" ] && [ "$libre" -lt "$MINIMO_MIB" ] 2>/dev/null; then
|
|
# Sin sitio: mejor transcribir en procesador que abortar. Es mas lento, pero
|
|
# responde; abortar deja la app muda y sin decir por que.
|
|
echo "$(date '+%F %T') GPU con solo ${libre} MiB libres (<${MINIMO_MIB}): al procesador" >> "$REGISTRO"
|
|
exec "$BINARIO" --no-gpu "$@"
|
|
fi
|
|
|
|
echo "$(date '+%F %T') GPU con ${libre:-?} MiB libres: en tarjeta" >> "$REGISTRO"
|
|
exec "$BINARIO" "$@"
|