chore: Highlight-Trigger raus + letzte Piper-Reste aufgeraeumt
Highlight-Trigger: - diagnostic/index.html: Settings-Sektion + Trigger-Liste-Handler raus - diagnostic/server.js: get_triggers / save_triggers Action-Handler + TRIGGERS_FILE Konstante + handleGetTriggers/handleSaveTriggers Funktionen weg - README.md: highlight_triggers.json aus dem Datenverzeichnis-Diagram entfernt Die Auswertung war seit Piper-Removal eh tot — die Datei wurde nur noch geschrieben aber nirgends gelesen. Piper-Reste: - bridge/aria_bridge.py: Modul-Docstring auf F5-TTS aktualisiert, Ramona/Thorsten-Erwaehnungen raus, Inline-Kommentar zu "Komponenten TTS" gefixt - aria-data/config/AGENT.md: Stimmen-Tabelle (Ramona/Thorsten) durch Hinweis auf F5-TTS Voice-Cloning ersetzt - aria-data/config/BOOTSTRAP.md: gleiche Tabelle weg, Bridge-Beschreibung auf "orchestriert STT/TTS via Gamebox-Bridges" geaendert Erledigt-Eintraege in issue.md + README markiert (historisch erhalten). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -568,8 +568,7 @@ aria-data/
|
|||||||
│ └── diag-state/ ← Diagnostic persistenter State
|
│ └── diag-state/ ← Diagnostic persistenter State
|
||||||
│
|
│
|
||||||
│ (im Shared Volume /shared/config/):
|
│ (im Shared Volume /shared/config/):
|
||||||
│ ├── voice_config.json ← TTS-Einstellungen (Stimme, Speed, Engine)
|
│ ├── voice_config.json ← TTS-Einstellungen (Stimme, Speed, F5-TTS-Tuning)
|
||||||
│ ├── highlight_triggers.json ← Highlight-Trigger Woerter
|
|
||||||
│ └── chat_backup.jsonl ← Nachrichten-Backup (on-the-fly)
|
│ └── chat_backup.jsonl ← Nachrichten-Backup (on-the-fly)
|
||||||
│
|
│
|
||||||
└── ssh/ ← SSH Keys fuer VM-Zugriff
|
└── 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] SSH-Zugriff auf VM (aria-wohnung)
|
||||||
- [x] Diagnostic Web-UI + Einstellungen
|
- [x] Diagnostic Web-UI + Einstellungen
|
||||||
- [x] Session-Verwaltung + Chat-History
|
- [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] Piper komplett entfernt — nur noch XTTS v2 als TTS (Gaming-PC)
|
||||||
- [x] Streaming TTS: PCM-Chunks direkt in AudioTrack, nahtlose Wiedergabe
|
- [x] Streaming TTS: PCM-Chunks direkt in AudioTrack, nahtlose Wiedergabe
|
||||||
- [x] TTS satzweise fuer lange Texte
|
- [x] TTS satzweise fuer lange Texte
|
||||||
|
|||||||
@@ -54,13 +54,6 @@ Fuer Web-Anfragen: **WebFetch** oder **Bash mit curl**. Niemals sagen "ich habe
|
|||||||
|
|
||||||
## Stimme
|
## Stimme
|
||||||
|
|
||||||
| Stimme | Modell | Wann |
|
TTS laeuft ueber F5-TTS (Voice Cloning, Gaming-PC). Stefan kann eigene
|
||||||
|--------|--------|------|
|
Stimmen aus Audio-Samples klonen (Diagnostic → Stimmen → Stimme klonen)
|
||||||
| **Ramona** (weiblich) | `de_DE-ramona-low` | Alltag, Antworten, Gespraeche (Standard) |
|
und in App + Diagnostic auswaehlen.
|
||||||
| **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"
|
|
||||||
|
|||||||
@@ -80,10 +80,8 @@ Wenn ein Tool nicht klappt, probiere die Alternative. Niemals sagen "ich habe ke
|
|||||||
|
|
||||||
## Stimme
|
## Stimme
|
||||||
|
|
||||||
| Stimme | Modell | Wann |
|
TTS laeuft ueber F5-TTS auf der Gamebox (Voice Cloning). Stefan kann
|
||||||
|--------|--------|------|
|
eigene Stimmen aus Audio-Samples klonen und in App/Diagnostic auswaehlen.
|
||||||
| **Ramona** (weiblich) | `de_DE-ramona-low` | Alltag, Antworten, Gespraeche (Standard) |
|
|
||||||
| **Thorsten** (maennlich, tief) | `de_DE-thorsten-high` | Epische Momente, Alarme, besondere Ereignisse |
|
|
||||||
|
|
||||||
## Gedaechtnis (Memory)
|
## Gedaechtnis (Memory)
|
||||||
|
|
||||||
@@ -147,4 +145,4 @@ Danach den Eintrag in `memory/MEMORY.md` (Index) verlinken.
|
|||||||
### Netzwerk
|
### Netzwerk
|
||||||
- **aria-net:** Internes Docker-Netz (proxy, aria-core)
|
- **aria-net:** Internes Docker-Netz (proxy, aria-core)
|
||||||
- **RVS:** Rendezvous-Server im Rechenzentrum — Relay fuer die Android-App
|
- **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
|
||||||
|
|||||||
@@ -1,17 +1,13 @@
|
|||||||
"""
|
"""
|
||||||
ARIA Voice Bridge — Hauptmodul.
|
ARIA Voice Bridge — Hauptmodul.
|
||||||
|
|
||||||
Verbindet die Android App (via RVS) mit ARIA-Core und bietet
|
Verbindet die Android App (via RVS) mit ARIA-Core. Spracheingabe laeuft
|
||||||
lokale Spracheingabe (Wake-Word + Whisper STT) und Sprachausgabe (Piper TTS).
|
ueber die whisper-bridge (Gamebox, faster-whisper auf CUDA), Sprachausgabe
|
||||||
|
ueber die f5tts-bridge (Voice Cloning, satzweises PCM-Streaming).
|
||||||
|
|
||||||
Nachrichtenfluss:
|
Nachrichtenfluss:
|
||||||
App → RVS → Bridge → aria-core
|
App → RVS → Bridge → aria-core
|
||||||
aria-core → Bridge → RVS → App
|
aria-core → Bridge → f5tts-bridge → PCM → RVS → App
|
||||||
→ Lautsprecher (TTS)
|
|
||||||
|
|
||||||
Stimmen:
|
|
||||||
- Ramona (de_DE-ramona-low) — Alltag, Gespraeche
|
|
||||||
- Thorsten (de_DE-thorsten-high) — epische Momente, Alarme
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
@@ -493,7 +489,7 @@ class ARIABridge:
|
|||||||
self.current_mode = self._load_persisted_mode()
|
self.current_mode = self._load_persisted_mode()
|
||||||
self.running = False
|
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.tts_enabled = True
|
||||||
self.xtts_voice = ""
|
self.xtts_voice = ""
|
||||||
self._f5tts_config: dict = {}
|
self._f5tts_config: dict = {}
|
||||||
|
|||||||
+1
-42
@@ -665,24 +665,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Highlight-Trigger -->
|
|
||||||
<div class="settings-section">
|
|
||||||
<h2>Highlight-Trigger</h2>
|
|
||||||
<div style="font-size:11px;color:#8888AA;margin-bottom:8px;">
|
|
||||||
Woerter die automatisch die Highlight-Stimme (Thorsten) ausloesen.
|
|
||||||
Eines pro Zeile. Aenderungen werden in der Bridge gespeichert.
|
|
||||||
</div>
|
|
||||||
<div class="card" style="max-width:500px;">
|
|
||||||
<textarea id="highlight-triggers" rows="8" style="width:100%;box-sizing:border-box;background:#1E1E2E;border:1px solid #2A2A3E;border-radius:6px;padding:8px;color:#fff;font-size:13px;font-family:monospace;resize:vertical;"
|
|
||||||
placeholder="Lade..."></textarea>
|
|
||||||
<div style="display:flex;gap:8px;margin-top:8px;">
|
|
||||||
<button class="btn" onclick="saveHighlightTriggers()" style="flex:1;">Speichern</button>
|
|
||||||
<button class="btn secondary" onclick="loadHighlightTriggers()" style="flex:1;">Neu laden</button>
|
|
||||||
</div>
|
|
||||||
<div id="trigger-status" style="font-size:11px;color:#555570;margin-top:6px;"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tool-Berechtigungen -->
|
<!-- Tool-Berechtigungen -->
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h2>Tool-Berechtigungen</h2>
|
<h2>Tool-Berechtigungen</h2>
|
||||||
@@ -956,14 +938,6 @@
|
|||||||
return;
|
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') {
|
if (msg.type === 'service_status') {
|
||||||
updateServiceStatus(msg.payload || {});
|
updateServiceStatus(msg.payload || {});
|
||||||
return;
|
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 ────────────────────────────
|
// ── Modus-Wechsel ────────────────────────────
|
||||||
// Kanonische IDs (matchen bridge/modes.py canonical_id + android ModeSelector)
|
// 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' };
|
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 => {
|
document.querySelectorAll('.main-nav-btn').forEach(b => {
|
||||||
if (b.textContent.trim().toLowerCase().includes(tab === 'main' ? 'main' : 'einstellung')) b.classList.add('active');
|
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') {
|
if (tab === 'settings') {
|
||||||
loadHighlightTriggers();
|
|
||||||
send({ action: 'get_voice_config' });
|
send({ action: 'get_voice_config' });
|
||||||
loadRuntimeConfig();
|
loadRuntimeConfig();
|
||||||
loadOnboardingQR();
|
loadOnboardingQR();
|
||||||
|
|||||||
@@ -1475,10 +1475,6 @@ wss.on("connection", (ws) => {
|
|||||||
} catch {}
|
} catch {}
|
||||||
sendToRVS_raw({ type: "config", payload: voiceConfig, timestamp: Date.now() });
|
sendToRVS_raw({ type: "config", payload: voiceConfig, timestamp: Date.now() });
|
||||||
log("info", "server", `Voice-Config gespeichert: xttsVoice=${voiceConfig.xttsVoice || "default"}, whisper=${voiceConfig.whisperModel || "-"}`);
|
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") {
|
} else if (msg.action === "test_tts") {
|
||||||
handleTestTTS(ws, msg.text || "Test");
|
handleTestTTS(ws, msg.text || "Test");
|
||||||
} else if (msg.action === "preview_voice") {
|
} 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) ───────────────────────────────
|
// ── TTS Diagnose (XTTS) ───────────────────────────────
|
||||||
// ── Voice Preview ────────────────────────────────────────
|
// ── Voice Preview ────────────────────────────────────────
|
||||||
// Sammelt audio_pcm Chunks einer Preview-Anfrage, baut am Ende eine WAV
|
// Sammelt audio_pcm Chunks einer Preview-Anfrage, baut am Ende eine WAV
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
- [x] Chat-Suche in der App (Lupe in Statusleiste)
|
- [x] Chat-Suche in der App (Lupe in Statusleiste)
|
||||||
- [x] Abbrechen-Button im Diagnostic Chat
|
- [x] Abbrechen-Button im Diagnostic Chat
|
||||||
- [x] Stimmen-Einstellungen (Ramona/Thorsten, Speed pro Stimme — durch XTTS/F5-TTS ersetzt)
|
- [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 v2 Integration (Gaming-PC, GPU, Voice Cloning) — durch F5-TTS ersetzt
|
||||||
- [x] XTTS Voice Cloning (Audio-Samples hochladen, eigene Stimme)
|
- [x] XTTS Voice Cloning (Audio-Samples hochladen, eigene Stimme)
|
||||||
- [x] TTS Engine waehlbar (Piper/XTTS) — Piper raus, XTTS raus, jetzt nur F5-TTS
|
- [x] TTS Engine waehlbar (Piper/XTTS) — Piper raus, XTTS raus, jetzt nur F5-TTS
|
||||||
|
|||||||
Reference in New Issue
Block a user