Le menu Sons refonctionne, et le transcripteur porte son nom francais
This commit is contained in:
parent
dcec1e61d0
commit
7661cbce36
2
app.py
2
app.py
@ -123,7 +123,7 @@ class ZonzaApp(NSObject):
|
|||||||
def _warmup_async(self):
|
def _warmup_async(self):
|
||||||
def run():
|
def run():
|
||||||
try:
|
try:
|
||||||
self.controller.transcriber.warmup()
|
self.controller.transcripteur.warmup()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[erreur] warmup modèle : {e}")
|
print(f"[erreur] warmup modèle : {e}")
|
||||||
threading.Thread(target=run, daemon=True).start()
|
threading.Thread(target=run, daemon=True).start()
|
||||||
|
|||||||
@ -34,7 +34,7 @@ class ZonzaController:
|
|||||||
lambda fn: threading.Thread(target=fn, daemon=True).start()
|
lambda fn: threading.Thread(target=fn, daemon=True).start()
|
||||||
)
|
)
|
||||||
self.recorder = Recorder(config["sample_rate"], on_block=self._on_audio_block)
|
self.recorder = Recorder(config["sample_rate"], on_block=self._on_audio_block)
|
||||||
self.transcriber = transcripteur
|
self.transcripteur = transcripteur
|
||||||
self.systeme = systeme
|
self.systeme = systeme
|
||||||
self.recording = False
|
self.recording = False
|
||||||
self._lock = threading.Lock()
|
self._lock = threading.Lock()
|
||||||
@ -43,6 +43,16 @@ class ZonzaController:
|
|||||||
self._blocs_recus = 0 # compteur pour détecter un micro muet
|
self._blocs_recus = 0 # compteur pour détecter un micro muet
|
||||||
self._veille_silence = None
|
self._veille_silence = None
|
||||||
|
|
||||||
|
def _jouer_son(self, nom):
|
||||||
|
"""Joue un son, sauf si l'utilisateur les a coupés par le menu.
|
||||||
|
|
||||||
|
La décision vit ICI et non dans la couche système : celle-ci doit rester
|
||||||
|
bête, sinon chaque nouvelle plateforme devra repenser à ce garde-fou.
|
||||||
|
"""
|
||||||
|
if not self.config["sounds"]:
|
||||||
|
return
|
||||||
|
self.systeme.jouer_son(nom)
|
||||||
|
|
||||||
def _on_audio_block(self, block):
|
def _on_audio_block(self, block):
|
||||||
# thread audio : RMS brut → mise en forme (gain + courbe) → lissage attack/release
|
# thread audio : RMS brut → mise en forme (gain + courbe) → lissage attack/release
|
||||||
# → push vers la fenêtre (thread-safe). Le lissage évite les saccades : montée
|
# → push vers la fenêtre (thread-safe). Le lissage évite les saccades : montée
|
||||||
@ -69,7 +79,7 @@ class ZonzaController:
|
|||||||
self.recording = True
|
self.recording = True
|
||||||
self.pulse.show()
|
self.pulse.show()
|
||||||
self.pulse.set_status("Je vous écoute…")
|
self.pulse.set_status("Je vous écoute…")
|
||||||
self.systeme.jouer_son("start")
|
self._jouer_son("start")
|
||||||
self.on_state("recording")
|
self.on_state("recording")
|
||||||
self._arm_safety_timer()
|
self._arm_safety_timer()
|
||||||
self._armer_veille_silence()
|
self._armer_veille_silence()
|
||||||
@ -89,7 +99,7 @@ class ZonzaController:
|
|||||||
if not entree_audio_muette(self._blocs_recus, self.recording):
|
if not entree_audio_muette(self._blocs_recus, self.recording):
|
||||||
return
|
return
|
||||||
print("[micro] aucun son reçu — le micro est probablement pris par une autre application")
|
print("[micro] aucun son reçu — le micro est probablement pris par une autre application")
|
||||||
self.systeme.jouer_son("error")
|
self._jouer_son("error")
|
||||||
self.run_on_main(lambda: self.pulse.set_status("Aucun son — micro pris ailleurs ?"))
|
self.run_on_main(lambda: self.pulse.set_status("Aucun son — micro pris ailleurs ?"))
|
||||||
|
|
||||||
def _ouvrir_flux(self):
|
def _ouvrir_flux(self):
|
||||||
@ -98,7 +108,7 @@ class ZonzaController:
|
|||||||
self.recorder.start()
|
self.recorder.start()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[erreur] démarrage enregistrement : {e}")
|
print(f"[erreur] démarrage enregistrement : {e}")
|
||||||
self.systeme.jouer_son("error")
|
self._jouer_son("error")
|
||||||
self.recording = False
|
self.recording = False
|
||||||
self._cancel_safety_timer()
|
self._cancel_safety_timer()
|
||||||
self.run_on_main(self.pulse.hide)
|
self.run_on_main(self.pulse.hide)
|
||||||
@ -144,11 +154,11 @@ class ZonzaController:
|
|||||||
principal (2026-08-21)."""
|
principal (2026-08-21)."""
|
||||||
try:
|
try:
|
||||||
audio = self.recorder.stop()
|
audio = self.recorder.stop()
|
||||||
self.systeme.jouer_son("done")
|
self._jouer_son("done")
|
||||||
if not is_long_enough(len(audio), self.config["sample_rate"],
|
if not is_long_enough(len(audio), self.config["sample_rate"],
|
||||||
self.config["min_duration_s"]):
|
self.config["min_duration_s"]):
|
||||||
return
|
return
|
||||||
text = self.transcriber.transcrire(audio)
|
text = self.transcripteur.transcrire(audio)
|
||||||
if not text:
|
if not text:
|
||||||
return
|
return
|
||||||
print(f"[texte] {text}")
|
print(f"[texte] {text}")
|
||||||
@ -156,10 +166,10 @@ class ZonzaController:
|
|||||||
inject_text(text, self.systeme)
|
inject_text(text, self.systeme)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[erreur] collage échoué ({e}) — texte dans le presse-papier, fais Cmd+V")
|
print(f"[erreur] collage échoué ({e}) — texte dans le presse-papier, fais Cmd+V")
|
||||||
self.systeme.jouer_son("error")
|
self._jouer_son("error")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[erreur] arrêt ou transcription : {e}")
|
print(f"[erreur] arrêt ou transcription : {e}")
|
||||||
self.systeme.jouer_son("error")
|
self._jouer_son("error")
|
||||||
finally:
|
finally:
|
||||||
self.run_on_main(self.pulse.hide)
|
self.run_on_main(self.pulse.hide)
|
||||||
self.on_state("idle")
|
self.on_state("idle")
|
||||||
|
|||||||
@ -65,9 +65,10 @@ class FauxSysteme:
|
|||||||
def acquerir_verrou_instance(self, chemin): return object()
|
def acquerir_verrou_instance(self, chemin): return object()
|
||||||
|
|
||||||
|
|
||||||
def _ctrl(recorder, taches=None):
|
def _ctrl(recorder, taches=None, config=None):
|
||||||
pulse = FauxPulse()
|
pulse = FauxPulse()
|
||||||
c = ZonzaController(CONFIG, pulse, FauxTranscripteur(), FauxSysteme(), lancer_tache=taches)
|
systeme = FauxSysteme()
|
||||||
|
c = ZonzaController(config or CONFIG, pulse, FauxTranscripteur(), systeme, lancer_tache=taches)
|
||||||
c.recorder = recorder
|
c.recorder = recorder
|
||||||
return c, pulse
|
return c, pulse
|
||||||
|
|
||||||
@ -125,3 +126,24 @@ def test_un_enregistrement_trop_court_referme_aussi():
|
|||||||
for t in differees:
|
for t in differees:
|
||||||
t()
|
t()
|
||||||
assert not pulse.visible
|
assert not pulse.visible
|
||||||
|
|
||||||
|
|
||||||
|
def test_le_menu_sons_joue_un_son_quand_actives():
|
||||||
|
differees = []
|
||||||
|
c, pulse = _ctrl(FauxRecorder(np.ones(16000, dtype="float32") * 0.1), taches=differees.append)
|
||||||
|
c.toggle(); c.toggle()
|
||||||
|
for t in differees:
|
||||||
|
t()
|
||||||
|
assert c.systeme.sons, "un cycle demarrage/arret doit produire au moins un son"
|
||||||
|
|
||||||
|
|
||||||
|
def test_le_menu_sons_coupe_le_son_quand_desactive():
|
||||||
|
differees = []
|
||||||
|
config = dict(CONFIG, sounds=False)
|
||||||
|
c, pulse = _ctrl(
|
||||||
|
FauxRecorder(np.ones(16000, dtype="float32") * 0.1), taches=differees.append, config=config
|
||||||
|
)
|
||||||
|
c.toggle(); c.toggle()
|
||||||
|
for t in differees:
|
||||||
|
t()
|
||||||
|
assert c.systeme.sons == [], "sounds=False doit couper tous les sons"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user