clap_listener
clap_listener
¶
Double-clap detector and optional microphone listener (welcome trigger).
Classes¶
ClapDetector
dataclass
¶
ClapDetector(
cfg: ClapConfig,
noise_floor: float = 0.0001,
last_logged_double: float = 0.0,
first_clap_time: float | None = None,
first_clap_peak: float = 0.0,
spike_armed: bool = True,
last_miss_reason: str | None = None,
claps_entendus: int = 0,
dernier_clap_a: float = 0.0,
blocs_ecoutes: int = 0,
amorce: list[float] = list(),
)
Stateful detector: feed RMS samples, receive double-clap events.
Piece
dataclass
¶
Ce qu'une pièce fait quand personne ne lui demande rien.
Attributes¶
niveau
instance-attribute
¶
Son niveau habituel — médiane, insensible aux évènements isolés.
dispersion
instance-attribute
¶
Sa respiration, en log : de combien elle s'écarte d'ordinaire.
blocs_bruyants
instance-attribute
¶
Combien de blocs ont dépassé six fois son niveau habituel.
haute
property
¶
Sa portée haute ordinaire — le plafond de ce qu'elle fait seule.
Trois dispersions, pas cinq : calibré sur la pièce réelle de Carlito, dont le maximum observé vaut deux dispersions au-dessus de la médiane. Cinq donnaient 0,040 pour une pièce qui n'a jamais dépassé 0,0124 — une marge inventée devient un seuil que les claps doivent franchir pour rien.
troublee
property
¶
Quelque chose est arrivé pendant que la pièce devait se taire.
Un COMPTAGE, pas un rapport. Un rapport entre le maximum et une statistique de la même fenêtre monte des deux côtés à la fois : dès que le transitoire dure quatre blocs, il définit lui-même la référence à laquelle on le compare, et la garde se tait précisément quand elle devrait parler. Un clap, attaque et réverbération, dure toujours plus que ça (démontré le 25 août 2026).
ClapListener
¶
ClapListener(
on_double_clap: Callable[[], None],
*,
cfg: ClapConfig | None = None,
once: bool = True,
device: int | None = None,
debug: bool = False,
)
Background mic loop that invokes a callback on double clap.
Source code in src/diapason/speech/clap_listener.py
Attributes¶
seuil
property
¶
Le seuil que ce fil applique VRAIMENT, à cet instant.
Le lire dans le fichier de réglage reviendrait à proclamer : un fil démarré avant une calibration garde l'ancien seuil jusqu'à ce qu'on le relance, et l'interface afficherait un chiffre auquel personne n'obéit. Zéro quand rien n'écoute — il n'y a alors pas de seuil.
fond_sonore
property
¶
Le fond sonore que ce fil a APPRIS de la pièce où il tourne.
Comparé au seuil, il dit d'un coup d'œil si la marge est confortable ou si la pièce est montée jusqu'à frôler le déclenchement.
dernier_echec
property
¶
Pourquoi le dernier pic n'a pas formé un double, s'il y a lieu.
Functions:¶
choose_input_device
¶
choose_input_device(
cfg: ClapConfig,
blocksize: int,
*,
override: str | None = None,
silent_rms: float = 0.0005,
probe_s: float = 0.5,
) -> int | None
Pick a working mic: override → default if loud → loudest input → default.
Source code in src/diapason/speech/clap_listener.py
charger_reglage_claps
¶
Le réglage de CETTE pièce — celui d'usine si rien n'est calibré.
Le min_rms calibré est conservé. Les écarts et la similarité, eux,
sont ceux d'usine à chaque lecture : un claps.json du 25 août 2026
gardait max_double_gap_s=0.80 et min_double_gap_s=0.04, et deux
bruits fortuits — ou l'attaque et la queue d'UN seul choc — ouvraient
la caméra (29 août 2026).
Source code in src/diapason/speech/clap_listener.py
niveau_ordinaire
¶
Le niveau habituel d'un fond sonore, et sa dispersion.
La médiane, pas un quantile haut ni un maximum : un transitoire ne doit pas pouvoir déplacer la statistique qui sert à le juger. Un maximum brut cède devant un seul bloc ; le quantile 0,95 cède devant quatre. La médiane demande d'en corrompre la moitié.
Le calcul se fait sur les logarithmes, parce qu'un niveau sonore se compare en RAPPORTS et non en écarts : entre 0,005 et 0,015 il y a le même chemin qu'entre 0,05 et 0,15.
Source code in src/diapason/speech/clap_listener.py
ecouter_la_piece
¶
ecouter_la_piece(
*,
cfg: ClapConfig | None = None,
device: int | None = None,
duree_s: float = 2.5,
oubli_initial_s: float = 0.6,
) -> Piece
Écouter une pièce se taire. Rien n'est enregistré : seuls des niveaux sonores sortent d'ici, jamais de son (§10).
Les premières fractions de seconde sont JETÉES : la mesure est déclenchée par un clic sur la machine qui tient le micro, et ce clic est un transitoire net.
Source code in src/diapason/speech/clap_listener.py
seuil_de_bouffee
¶
seuil_de_bouffee(piece: Piece) -> float
À partir de quel niveau un son mérite d'être regardé.
Dix fois le fond, au minimum : un clap vaut vingt à soixante fois le niveau habituel d'une pièce. Deux fois et demie laissait entrer une touche de clavier, qui devenait ensuite « le clap le plus faible » et tirait tout le réglage vers le bas.
Source code in src/diapason/speech/clap_listener.py
ecouter_les_claps
¶
ecouter_les_claps(
piece: Piece,
*,
cfg: ClapConfig | None = None,
device: int | None = None,
duree_s: float = 6.0,
oubli_initial_s: float = 0.25,
) -> Ecoute
Écouter quelqu'un claper, dans une pièce déjà mesurée.
Source code in src/diapason/speech/clap_listener.py
reglage_calibre
¶
reglage_calibre(
ecoute: Ecoute, *, base: ClapConfig | None = None
) -> ClapConfig
Un seuil posé entre DEUX mesures : la pièce, et les claps de son occupant.
Le seuil vise la moyenne géométrique — le milieu au sens de l'oreille, qui entend des rapports et non des différences.