JARVIS/verde/voz-verde.sh
sito 1e3e5ca20d carril verde (Hermes Agent): documentacion, panel, voz local y RAG
Rama JARVIS-GREEN, independiente de master (el nucleo naranja queda intacto).

- README propio del carril verde con diagrama de arquitectura y capturas del panel.
- verde/: arranque, panel web, puente de voz (escucha local con faster-whisper +
  habla con la voz del naranja), pruebas (07 voz, 08 escucha), config y notas.
- Integracion RAG: nucleo/saber/busca_cli.py + skill buscar-en-apuntes, para que
  el agente consulte el mismo indice que el nucleo.
- Todo local (127.0.0.1); sin datos personales (rutas y modelo de GPU scrubeados).
2026-08-18 11:26:42 +02:00

51 lines
2.5 KiB
Bash
Executable file

#!/usr/bin/env bash
# Adaptador entre el TTS por comando de Hermes y la voz que ya usa el naranja.
#
# voz-verde.sh <salida.wav> <fichero-con-el-texto>
#
# ── Por que existe este fichero ─────────────────────────────────────────────
#
# Hermes tiene un proveedor de TTS por comando (`type: command`) que NO esta
# documentado en su web pero si en el codigo: tools/tts_tool.py, el bloque
# "Custom command providers". Eso es lo que permite que el verde hable con la
# MISMA voz que el naranja en vez de con la que Piper se descargue por su
# cuenta — y sin esa igualdad, comparar los dos carriles no diria nada.
#
# Las interfaces no encajan directamente y por eso hay adaptador:
#
# jarvis-piper.sh espera <salida.wav> <texto como argumento>
# Hermes entrega {output_path} y {input_path}, un FICHERO con el texto
#
# Hermes ejecuta con shell=True, asi que un "$(cat ...)" en la plantilla habria
# funcionado. No se hace por dos motivos: _run_command_tts llama a
# hermes_subprocess_env(inherit_credentials=False), que LIMPIA el entorno, de
# modo que JARVIS_PIPER_VOZ y JARVIS_PIPER_TONO no llegarian; y una plantilla
# con comillas anidadas dentro de un YAML es justo el sitio donde un fallo no
# se ve hasta que suena mal.
#
# ── Que voz, y por que esta ────────────────────────────────────────────────
#
# davefx a tono 1.0, que es lo que tiene puesto el naranja HOY en
# nucleo/boca/voz.py (POR_DEFECTO = "davefx", JARVIS_PIPER_TONO = "1.0").
#
# OJO: el README describe sharvard + 0.86 = 106 Hz como "la puesta". Eso era el
# JARVIS sobre Newelle. El nucleo cambio a davefx "porque se eligio a oido". El
# verde copia al NUCLEO, que es contra quien se va a comparar, no al README.
set -uo pipefail
RAIZ=$(cd -P "$(dirname "${BASH_SOURCE[0]:-$0}")/.." && pwd)
SALIDA=${1:-}
ENTRADA=${2:-}
[ -n "$SALIDA" ] || { echo "falta el fichero de salida" >&2; exit 1; }
[ -f "$ENTRADA" ] || { echo "no esta el fichero de texto: $ENTRADA" >&2; exit 1; }
TEXTO=$(cat "$ENTRADA")
[ -n "$TEXTO" ] || { echo "el fichero de texto esta vacio" >&2; exit 1; }
# Las variables se ponen aqui porque Hermes limpia el entorno antes de llamar.
export JARVIS_PIPER_VOZ=${JARVIS_PIPER_VOZ:-es_ES-davefx-medium}
export JARVIS_PIPER_TONO=${JARVIS_PIPER_TONO:-1.0}
exec "$RAIZ/config/jarvis-piper.sh" "$SALIDA" "$TEXTO"