Просмотр исходного кода

Fix: Audio-Ducking Flow fuer Follow-Up Conversations

Vorher: conversation_started → Duck → TTS war leise
Jetzt:  recording_started → Duck, recording_complete → Restore

Flow: Wakeword → Duck → Recording → Restore → TTS (LAUT!)
     → Follow-Up → Recording → Duck → Restore → TTS (LAUT!)

conversation_started Event entfernt da es zu frueh feuerte
und die TTS-Ausgabe leise machte. Stattdessen wird nur bei
tatsaechlicher Aufnahme (recording_started) geduckt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
patrick 2 месяцев назад
Родитель
Сommit
e2933632c2
1 измененных файлов с 24 добавлено и 5 удалено
  1. 24 5
      plugins/audio_ducking/main.py

+ 24 - 5
plugins/audio_ducking/main.py

@@ -85,23 +85,42 @@ class AudioDuckingPlugin(TrixyPlugin):
         self._ducked = False
 
     # === Events ===
+    #
+    # Ducking-Flow:
+    #   Wakeword erkannt → DUCK (Musik/Audio leiser)
+    #   Recording laeuft → bleibt leise (Mikrofon hoert)
+    #   Recording fertig → RESTORE (Musik/Audio normal)
+    #   STT/NLP/Handler  → normale Lautstaerke
+    #   TTS Ausgabe       → normale Lautstaerke (Trixy spricht laut!)
+    #   Follow-Up aktiv   → Nutzer spricht → DUCK → Recording → RESTORE
+    #
+    # Wichtig: KEIN Duck bei conversation_started — das wuerde
+    # die TTS-Ausgabe leise machen. Nur bei tatsaechlicher
+    # Audio-Aufnahme (Wakeword/Follow-Up) wird geduckt.
 
     @TrixyEvent(["wakeword_detected"], priority=EventPriority.HIGHEST)
     async def on_wakeword(self, event_name: str, event_data) -> None:
+        """Wakeword erkannt → Lautstaerke runter fuer Mikrofonaufnahme."""
         await self._duck_volume()
 
     @TrixyEvent(["wakeword_manual_trigger"], priority=EventPriority.HIGHEST)
     async def on_manual_trigger(self, event_name: str, event_data) -> None:
         await self._duck_volume()
 
-    @TrixyEvent(["recording_complete"])
+    @TrixyEvent(["recording_started"], priority=EventPriority.HIGHEST)
+    async def on_recording_started(self, event_name: str, event_data) -> None:
+        """Aufnahme gestartet (auch bei Follow-Up) → Duck."""
+        await self._duck_volume()
+
+    @TrixyEvent(["recording_complete", "recording_stopped"])
     async def on_recording_complete(self, event_name: str, event_data) -> None:
-        await self._restore_volume()
+        """Aufnahme beendet → Lautstaerke sofort wiederherstellen.
 
-    @TrixyEvent(["conversation_started"])
-    async def on_conversation_started(self, event_name: str, event_data) -> None:
-        await self._duck_volume()
+        So ist die TTS-Ausgabe auf normaler Lautstaerke.
+        """
+        await self._restore_volume()
 
     @TrixyEvent(["conversation_ended"])
     async def on_conversation_ended(self, event_name: str, event_data) -> None:
+        """Sicherheits-Restore falls noch geduckt."""
         await self._restore_volume()