feat(voice): leeres <voice></voice> = bewusst stumm (Steuerbefehl-Quittungen)

Bisher: tts_text = tts_text_preview or text — ein leeres <voice></voice> fiel
auf den vollen Text zurueck und wurde doch gesprochen. Jetzt: ein vorhandener
<voice>-Tag ist die EXPLIZITE TTS-Vorgabe (auch leer). Leeres <voice></voice>
= Bubble sichtbar, aber KEIN TTS. Nur ohne Tag Rueckfall auf vollen Text.

Motivation: Spotify-Steuerbefehle (next/pause/…) laufen jetzt ueber den
Fast-Path (<1s), aber die gesprochene Quittung klaute auf dem Handy den
Audio-Fokus -> Spotify duckte/pausierte und spielte (bei kurzem Text) nicht
weiter. Steuer-Skills koennen ihre Reply nun mit <voice></voice> stummschalten.
Generell nutzbar: ARIA kann jede Antwort bewusst stumm halten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 00:03:50 +02:00
co-authored by Claude Opus 4.8
parent b8c20390d7
commit 5cdd135169
+11 -2
View File
@@ -1326,9 +1326,18 @@ class ARIABridge:
or 1.0
)
tts_text = tts_text_preview or text
# Ein vorhandener <voice>-Tag ist die EXPLIZITE TTS-Vorgabe von ARIA —
# auch wenn er leer ist. Leeres <voice></voice> = bewusst stumm: die
# Bubble erscheint im Chat, aber es wird NICHTS gesprochen. Use-Case:
# Steuerbefehl-Quittungen (Spotify next/pause, Licht an) — dort darf die
# Sprachausgabe NICHT feuern, weil das TTS-Playback auf dem Handy den
# Audio-Fokus klaut, Spotify duckt/pausiert und (bei kurzem Text) nicht
# sauber weiterspielt. Nur OHNE Voice-Tag faellt es auf den vollen Text
# zurueck (normale Antwort ohne TTS-Annotation wird komplett gelesen).
has_voice_tag = "<voice>" in (text or "").lower()
tts_text = tts_text_preview if has_voice_tag else (tts_text_preview or text)
if not tts_text:
logger.info("[core] TTS-Text leer nach Cleanup — uebersprungen")
logger.info("[core] TTS-Text leer (bewusst stumm via <voice></voice> oder nach Cleanup) — uebersprungen")
return
try:
xtts_request_id = str(uuid.uuid4())