#!/usr/bin/env python3
"""Endurece la escucha para que no se dispare con ruido de fuera.

    flatpak run --command=python3 io.github.qwersyk.Newelle//master \
        ~/COFRE/CODERS/JARVIS/config/set_ruido.py [--suave]

NO es reconocimiento de hablante: Newelle no distingue quien habla, no hay
nada de eso en el codigo. Esto solo sube el liston de que se considera voz.
Para que responda unicamente a una persona haria falta un modelo de huella
vocal (ECAPA, Resemblyzer) delante del STT, que es otro proyecto.

Las tres capas, de menos a mas efectiva:

  1. la palabra clave, que ya filtra casi todo
  2. estos umbrales
  3. supresion de ruido en PipeWire (RNNoise), antes de que el audio llegue
     a la app; esa vale para todo el sistema y no cuesta CPU a Newelle

Valores por defecto de Newelle: energia 300, VAD 1.
"""
import sys

from gi.repository import Gio

SCHEMA = "io.github.qwersyk.Newelle"

# vad-aggressiveness va de 0 a 3: cuanto descarta lo que no suena a voz.
DURO = {
    "wakeword-energy-threshold": 800,   # por debajo de esto ni escucha
    "wakeword-vad-aggressiveness": 3,
}
SUAVE = {
    "wakeword-energy-threshold": 500,
    "wakeword-vad-aggressiveness": 2,
}


def main():
    perfil = SUAVE if "--suave" in sys.argv else DURO
    settings = Gio.Settings.new(SCHEMA)

    print("antes:")
    for clave in perfil:
        print(f"  {clave} = {settings.get_int(clave)}")

    for clave, valor in perfil.items():
        settings.set_int(clave, valor)
    Gio.Settings.sync()

    print("despues:")
    for clave in perfil:
        print(f"  {clave} = {settings.get_int(clave)}")

    ok = all(settings.get_int(c) == v for c, v in perfil.items())
    print("verificado" if ok else "FALLO: no quedo como se pidio")
    return 0 if ok else 1


if __name__ == "__main__":
    sys.exit(main())
