feat(voice): Wake-Word per Befehl wieder anschalten (Gegenstück zu wake_off)

"Wake-Word an" / "mach das Ohr an" / "hör wieder zu" / "wach auf" → App startet
den Listener wieder. Geht per Text-Nachricht ODER manuellem Aufnahme-Button —
beide laufen unabhängig vom Wake-Word-Listener, also funktioniert das Wieder-An
auch wenn das Ohr gerade taub ist (nur nicht per "Computer", das hört ja nicht).

Symmetrisch zu wake_off: Detektor _user_wants_wake_on → wake_on durch ChatOut →
Bridge → App löst wakeWordService.start() + setWakeWordActive(true) aus. An/Aus
kollidieren nicht (12 Fälle getestet). Damit: Ohr per Befehl ein UND aus, plus
weiterhin der Ohr-Button.

Fix nebenbei: gerades " in den Reply-Strings (hätte den Brain-Start gecrasht) →
einfache Anführungszeichen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 20:33:16 +02:00
co-authored by Claude Opus 4.8
parent 93401d42d1
commit 41714f7cf1
4 changed files with 59 additions and 5 deletions
+4 -1
View File
@@ -677,8 +677,10 @@ class ChatOut(BaseModel):
# naechste Eingabe als Antwort weiter, statt sie als neuen Auftrag anzustellen.
awaiting_reply: bool = False
# Der User hat per Sprache "Wake-Word aus" gesagt → die App stoppt den
# Wake-Word-Listener komplett (Mikro frei). Wieder-An nur ueber App-Button.
# Wake-Word-Listener komplett (Mikro frei).
wake_off: bool = False
# "Wake-Word an" per Befehl (Text/Aufnahme-Button) → App startet den Listener.
wake_on: bool = False
# Echo der project_id die dieser Turn hatte. Bridge nutzt sie damit die
# ausgehende Chat-Bubble sauber getaggt in der richtigen Thread-Bahn der
# UI landet.
@@ -789,6 +791,7 @@ async def chat(body: ChatIn, background: BackgroundTasks):
converse=converse,
awaiting_reply=awaiting_reply,
wake_off=(answered_by == "wake-off"),
wake_on=(answered_by == "wake-on"),
)
finally:
_project_pending[pid] = [