JARVIS/verde/escucha_transcribe.py
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

49 lines
1.5 KiB
Python
Executable file

#!/usr/bin/env python3
"""Transcribe un WAV a texto con faster-whisper local. Nada sale de la maquina.
escucha_transcribe.py fichero.wav
Es la mitad "oido" del puente de voz del verde: el TUI de Hermes no tiene micro,
asi que grabamos aparte (escucha-verde.sh) y transcribimos aqui, en local, con el
mismo faster-whisper 'small' en espanol que usa el STT de Hermes. En CPU a
proposito: el 4B ocupa la tarjeta y el margen de VRAM es de 223 MiB; whisper en
CPU tarda un par de segundos mas y no arriesga un out-of-memory.
"""
import os
import sys
MODELO = os.environ.get("VERDE_WHISPER_MODELO", "small")
IDIOMA = os.environ.get("VERDE_WHISPER_IDIOMA", "es")
_modelo = None
def carga():
global _modelo
if _modelo is None:
from faster_whisper import WhisperModel
# int8 en CPU: rapido y sin tocar la VRAM del modelo del agente.
_modelo = WhisperModel(MODELO, device="cpu", compute_type="int8")
return _modelo
def transcribe(ruta_wav):
m = carga()
segmentos, _ = m.transcribe(
ruta_wav, language=IDIOMA,
vad_filter=True, # el silencio no llega a whisper
vad_parameters={"min_silence_duration_ms": 500},
)
return " ".join(s.text.strip() for s in segmentos).strip()
def main():
if len(sys.argv) < 2 or not os.path.exists(sys.argv[1]):
print("uso: escucha_transcribe.py fichero.wav", file=sys.stderr)
return 2
print(transcribe(sys.argv[1]))
return 0
if __name__ == "__main__":
sys.exit(main())