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
36
voz/pronuncia.py
Normal file
36
voz/pronuncia.py
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Reescribe siglas y tecnicismos a como se pronuncian, usando
|
||||
pronunciacion.json. Lo usa jarvis-voz.sh antes de mandar texto a Piper (y sirve
|
||||
para regenerar la cache con XTTS). Sustituye solo palabras completas.
|
||||
|
||||
python3 pronuncia.py "conéctate por SSH a la VPN"
|
||||
-> conéctate por ese ese hache a la uve pe ene
|
||||
"""
|
||||
import sys, os, json, re
|
||||
|
||||
BASE = os.path.dirname(os.path.abspath(__file__))
|
||||
DIC = os.path.join(BASE, "pronunciacion.json")
|
||||
|
||||
|
||||
def reescribe(texto, dic):
|
||||
# claves mas largas primero: evita que VLAN caiga en LAN, HTTPS en HTTP...
|
||||
for k in sorted(dic, key=len, reverse=True):
|
||||
# (?<!\w)..(?!\w) = limites de palabra unicode; IGNORECASE por si el
|
||||
# texto trae la sigla en minuscula
|
||||
texto = re.sub(rf"(?<!\w){re.escape(k)}(?!\w)", dic[k], texto,
|
||||
flags=re.IGNORECASE)
|
||||
return texto
|
||||
|
||||
|
||||
def main():
|
||||
texto = " ".join(sys.argv[1:])
|
||||
try:
|
||||
with open(DIC, encoding="utf-8") as f:
|
||||
dic = json.load(f)
|
||||
except Exception:
|
||||
dic = {}
|
||||
sys.stdout.write(reescribe(texto, dic))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Add table
Add a link
Reference in a new issue