diff --git a/README.md b/README.md
index 450f21f..543b714 100644
--- a/README.md
+++ b/README.md
@@ -568,8 +568,7 @@ aria-data/
│ └── diag-state/ ← Diagnostic persistenter State
│
│ (im Shared Volume /shared/config/):
-│ ├── voice_config.json ← TTS-Einstellungen (Stimme, Speed, Engine)
-│ ├── highlight_triggers.json ← Highlight-Trigger Woerter
+│ ├── voice_config.json ← TTS-Einstellungen (Stimme, Speed, F5-TTS-Tuning)
│ └── chat_backup.jsonl ← Nachrichten-Backup (on-the-fly)
│
└── ssh/ ← SSH Keys fuer VM-Zugriff
@@ -816,7 +815,7 @@ docker exec aria-core ssh aria-wohnung hostname
- [x] SSH-Zugriff auf VM (aria-wohnung)
- [x] Diagnostic Web-UI + Einstellungen
- [x] Session-Verwaltung + Chat-History
-- [x] Stimmen-Einstellungen (Ramona/Thorsten, Speed, Highlight-Trigger) — durch XTTS v2 Voice Cloning ersetzt
+- [x] Stimmen-Einstellungen (frueher Piper Ramona/Thorsten, Highlight-Trigger) — durch XTTS, dann F5-TTS Voice Cloning ersetzt
- [x] Piper komplett entfernt — nur noch XTTS v2 als TTS (Gaming-PC)
- [x] Streaming TTS: PCM-Chunks direkt in AudioTrack, nahtlose Wiedergabe
- [x] TTS satzweise fuer lange Texte
diff --git a/aria-data/config/AGENT.md b/aria-data/config/AGENT.md
index 9db30ff..a00fe51 100644
--- a/aria-data/config/AGENT.md
+++ b/aria-data/config/AGENT.md
@@ -54,13 +54,6 @@ Fuer Web-Anfragen: **WebFetch** oder **Bash mit curl**. Niemals sagen "ich habe
## Stimme
-| Stimme | Modell | Wann |
-|--------|--------|------|
-| **Ramona** (weiblich) | `de_DE-ramona-low` | Alltag, Antworten, Gespraeche (Standard) |
-| **Thorsten** (maennlich, tief) | `de_DE-thorsten-high` | Epische Momente, Alarme, besondere Ereignisse |
-
-**Thorsten spricht bei:**
-- Build erfolgreich deployed
-- Ticket geloest / Aufgabe abgeschlossen
-- Kritischer Alarm (Server down, Sicherheitswarnung)
-- Wenn Stefan sagt "So soll es sein"
+TTS laeuft ueber F5-TTS (Voice Cloning, Gaming-PC). Stefan kann eigene
+Stimmen aus Audio-Samples klonen (Diagnostic → Stimmen → Stimme klonen)
+und in App + Diagnostic auswaehlen.
diff --git a/aria-data/config/BOOTSTRAP.md b/aria-data/config/BOOTSTRAP.md
index 7413e61..42f85e9 100644
--- a/aria-data/config/BOOTSTRAP.md
+++ b/aria-data/config/BOOTSTRAP.md
@@ -80,10 +80,8 @@ Wenn ein Tool nicht klappt, probiere die Alternative. Niemals sagen "ich habe ke
## Stimme
-| Stimme | Modell | Wann |
-|--------|--------|------|
-| **Ramona** (weiblich) | `de_DE-ramona-low` | Alltag, Antworten, Gespraeche (Standard) |
-| **Thorsten** (maennlich, tief) | `de_DE-thorsten-high` | Epische Momente, Alarme, besondere Ereignisse |
+TTS laeuft ueber F5-TTS auf der Gamebox (Voice Cloning). Stefan kann
+eigene Stimmen aus Audio-Samples klonen und in App/Diagnostic auswaehlen.
## Gedaechtnis (Memory)
@@ -147,4 +145,4 @@ Danach den Eintrag in `memory/MEMORY.md` (Index) verlinken.
### Netzwerk
- **aria-net:** Internes Docker-Netz (proxy, aria-core)
- **RVS:** Rendezvous-Server im Rechenzentrum — Relay fuer die Android-App
-- **Bridge:** Voice Bridge (Whisper STT + Piper TTS) — teilt Netzwerk mit aria-core
+- **Bridge:** Voice Bridge (orchestriert STT/TTS via Gamebox-Bridges) — teilt Netzwerk mit aria-core
diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py
index 8a27753..c16d55d 100644
--- a/bridge/aria_bridge.py
+++ b/bridge/aria_bridge.py
@@ -1,17 +1,13 @@
"""
ARIA Voice Bridge — Hauptmodul.
-Verbindet die Android App (via RVS) mit ARIA-Core und bietet
-lokale Spracheingabe (Wake-Word + Whisper STT) und Sprachausgabe (Piper TTS).
+Verbindet die Android App (via RVS) mit ARIA-Core. Spracheingabe laeuft
+ueber die whisper-bridge (Gamebox, faster-whisper auf CUDA), Sprachausgabe
+ueber die f5tts-bridge (Voice Cloning, satzweises PCM-Streaming).
Nachrichtenfluss:
App → RVS → Bridge → aria-core
- aria-core → Bridge → RVS → App
- → Lautsprecher (TTS)
-
-Stimmen:
- - Ramona (de_DE-ramona-low) — Alltag, Gespraeche
- - Thorsten (de_DE-thorsten-high) — epische Momente, Alarme
+ aria-core → Bridge → f5tts-bridge → PCM → RVS → App
"""
from __future__ import annotations
@@ -493,7 +489,7 @@ class ARIABridge:
self.current_mode = self._load_persisted_mode()
self.running = False
- # Komponenten (TTS: immer XTTS remote, Piper wurde entfernt)
+ # Komponenten (TTS: F5-TTS remote auf der Gamebox, lokales TTS wurde entfernt)
self.tts_enabled = True
self.xtts_voice = ""
self._f5tts_config: dict = {}
diff --git a/diagnostic/index.html b/diagnostic/index.html
index 021a116..7bc82ce 100644
--- a/diagnostic/index.html
+++ b/diagnostic/index.html
@@ -665,24 +665,6 @@
-
-
-
Highlight-Trigger
-
- Woerter die automatisch die Highlight-Stimme (Thorsten) ausloesen.
- Eines pro Zeile. Aenderungen werden in der Bridge gespeichert.
-
-
-
-
-
-
-
-
-
-
-
Tool-Berechtigungen
@@ -956,14 +938,6 @@
return;
}
- if (msg.type === 'trigger_list') {
- const textarea = document.getElementById('highlight-triggers');
- textarea.value = (msg.triggers || []).join('\n');
- document.getElementById('trigger-status').textContent = msg.triggers.length + ' Trigger geladen';
- document.getElementById('trigger-status').style.color = '#8888AA';
- return;
- }
-
if (msg.type === 'service_status') {
updateServiceStatus(msg.payload || {});
return;
@@ -1958,20 +1932,6 @@
}
}
- // ── Highlight-Trigger ────────────────────────
- function loadHighlightTriggers() {
- send({ action: 'get_triggers' });
- }
- function saveHighlightTriggers() {
- const text = document.getElementById('highlight-triggers').value;
- const triggers = text.split('\n').map(t => t.trim()).filter(t => t.length > 0);
- send({ action: 'save_triggers', triggers });
- document.getElementById('trigger-status').textContent = 'Gespeichert (' + triggers.length + ' Trigger)';
- document.getElementById('trigger-status').style.color = '#34C759';
- }
- // Beim Tab-Wechsel zu Einstellungen: Trigger laden
- const origSwitchMainTab = typeof switchMainTab === 'function' ? switchMainTab : null;
-
// ── Modus-Wechsel ────────────────────────────
// Kanonische IDs (matchen bridge/modes.py canonical_id + android ModeSelector)
const MODE_LABELS = { normal: 'Normal', nicht_stoeren: 'Nicht stoeren', fluester: 'Fluestern', hangar: 'Hangar', gaming: 'Gaming' };
@@ -2456,9 +2416,8 @@
document.querySelectorAll('.main-nav-btn').forEach(b => {
if (b.textContent.trim().toLowerCase().includes(tab === 'main' ? 'main' : 'einstellung')) b.classList.add('active');
});
- // Einstellungen: Config + Trigger + QR laden
+ // Einstellungen: Config + QR laden
if (tab === 'settings') {
- loadHighlightTriggers();
send({ action: 'get_voice_config' });
loadRuntimeConfig();
loadOnboardingQR();
diff --git a/diagnostic/server.js b/diagnostic/server.js
index 50b7485..5be17b1 100644
--- a/diagnostic/server.js
+++ b/diagnostic/server.js
@@ -1475,10 +1475,6 @@ wss.on("connection", (ws) => {
} catch {}
sendToRVS_raw({ type: "config", payload: voiceConfig, timestamp: Date.now() });
log("info", "server", `Voice-Config gespeichert: xttsVoice=${voiceConfig.xttsVoice || "default"}, whisper=${voiceConfig.whisperModel || "-"}`);
- } else if (msg.action === "get_triggers") {
- handleGetTriggers(ws);
- } else if (msg.action === "save_triggers") {
- handleSaveTriggers(ws, msg.triggers || []);
} else if (msg.action === "test_tts") {
handleTestTTS(ws, msg.text || "Test");
} else if (msg.action === "preview_voice") {
@@ -1629,31 +1625,6 @@ function handleGetVoiceConfig(clientWs) {
}
}
-// ── Highlight-Trigger (legacy UI — wird nicht mehr ausgewertet seit Piper raus) ─
-const TRIGGERS_FILE = "/shared/config/highlight_triggers.json";
-
-async function handleGetTriggers(clientWs) {
- try {
- const triggers = fs.existsSync(TRIGGERS_FILE)
- ? JSON.parse(fs.readFileSync(TRIGGERS_FILE, "utf-8"))
- : [];
- clientWs.send(JSON.stringify({ type: "trigger_list", triggers }));
- } catch (err) {
- clientWs.send(JSON.stringify({ type: "trigger_list", triggers: [], error: err.message }));
- }
-}
-
-async function handleSaveTriggers(clientWs, triggers) {
- try {
- fs.mkdirSync("/shared/config", { recursive: true });
- fs.writeFileSync(TRIGGERS_FILE, JSON.stringify(triggers, null, 2));
- log("info", "server", `${triggers.length} Highlight-Trigger gespeichert`);
- clientWs.send(JSON.stringify({ type: "trigger_list", triggers }));
- } catch (err) {
- log("error", "server", `Trigger speichern fehlgeschlagen: ${err.message}`);
- }
-}
-
// ── TTS Diagnose (XTTS) ───────────────────────────────
// ── Voice Preview ────────────────────────────────────────
// Sammelt audio_pcm Chunks einer Preview-Anfrage, baut am Ende eine WAV
diff --git a/issue.md b/issue.md
index 4ffb53b..845fb88 100644
--- a/issue.md
+++ b/issue.md
@@ -44,7 +44,7 @@
- [x] Chat-Suche in der App (Lupe in Statusleiste)
- [x] Abbrechen-Button im Diagnostic Chat
- [x] Stimmen-Einstellungen (Ramona/Thorsten, Speed pro Stimme — durch XTTS/F5-TTS ersetzt)
-- [x] Highlight-Trigger konfigurierbar in Diagnostic
+- [x] Highlight-Trigger konfigurierbar in Diagnostic (spaeter komplett entfernt — war Piper-Relikt)
- [x] XTTS v2 Integration (Gaming-PC, GPU, Voice Cloning) — durch F5-TTS ersetzt
- [x] XTTS Voice Cloning (Audio-Samples hochladen, eigene Stimme)
- [x] TTS Engine waehlbar (Piper/XTTS) — Piper raus, XTTS raus, jetzt nur F5-TTS