Arreglado el boton PARAR y repaso de portabilidad

PARAR no pausaba de verdad: el HUD estaba entero para el estado "parado"
pero el backend nunca mandaba el campo "parar" en el evento controles, asi
que el boton no alternaba ni pausaba la escucha. Ahora pausa (el bucle de
escucha descarta el audio en pausa) y alterna a "reanudar".

Portabilidad (para que encaje en otros portatiles y torres, no solo en el
equipo del autor):
- microfono: pw-record / parec / arecord (PipeWire, PulseAudio o ALSA)
- whisper: binario del build local o del PATH; modelos por
  JARVIS_WHISPER_MODELOS o busqueda en varios sitios; CUDA en
  LD_LIBRARY_PATH solo si existe
- README: la tabla de portabilidad refleja audio y whisper
This commit is contained in:
sito 2026-08-16 16:06:43 +02:00
parent 55e967b940
commit a0b9afe2f9
5 changed files with 102 additions and 23 deletions

View file

@ -26,6 +26,7 @@ con tres agujeros, y aqui se cierran los tres:
"""
import collections
import os
import shutil
import signal
import struct
import subprocess
@ -50,13 +51,31 @@ MAXIMO_S = 25.0
def _grabador(fuente=None):
"""La orden para capturar crudo a la salida estandar."""
if fuente:
pw = ["pw-record", "--target", fuente]
else:
pw = ["pw-record"]
return pw + ["--rate", str(FRECUENCIA), "--channels", str(CANALES),
"--format", "s16", "-"]
"""La orden para capturar crudo (s16 mono) a la salida estandar.
Se prueba pw-record (PipeWire), parec (PulseAudio) y arecord (ALSA), en ese
orden, la primera que exista en el sistema. Asi el microfono funciona en
cualquier Linux una torre con PulseAudio, un equipo con solo ALSA y no
solo donde hay PipeWire. Los tres sacan el mismo crudo (s16 little-endian,
mono, 16 kHz) por la salida estandar, que es lo que lee el detector."""
r, c = str(FRECUENCIA), str(CANALES)
if shutil.which("pw-record"):
cmd = ["pw-record", "--rate", r, "--channels", c, "--format", "s16"]
if fuente:
cmd += ["--target", fuente]
return cmd + ["-"]
if shutil.which("parec"):
cmd = ["parec", "--rate=" + r, "--channels=" + c, "--format=s16le"]
if fuente:
cmd += ["-d", fuente]
return cmd
if shutil.which("arecord"):
cmd = ["arecord", "-q", "-r", r, "-c", c, "-f", "S16_LE", "-t", "raw"]
if fuente:
cmd += ["-D", fuente]
return cmd
# ninguno instalado: se devuelve pw-record para que el fallo sea claro
return ["pw-record", "--rate", r, "--channels", c, "--format", "s16", "-"]
class Captura: