Namen nachtraeglich in fertige Zusammenfassung uebernehmen
speaker_labels speichert das Label jedes Clusters im LLM-Text; relabelAnalysis() ersetzt beim Umbenennen wortgenau in summary/todos/transcript_clean und baut die Teilnehmerliste neu. #74: keine 'Sprecher N' mehr.
This commit is contained in:
@@ -111,6 +111,36 @@ GUI rendert mit `white-space: pre-line` (style.css) → Bullets und Absätze sic
|
||||
Feld/eigene Liste. **Teilnehmer kommen NICHT vom LLM**, sondern aus der Diarization (Kap. 04) — das LLM
|
||||
hatte alle im Gespräch *erwähnten* Namen als Teilnehmer gelistet (11 statt 3 bei Aufnahme #69).
|
||||
|
||||
## Namen nachträglich in eine fertige Analyse übernehmen (seit 2026-07-27)
|
||||
|
||||
Die Zusammenfassung entsteht aus einem Dialog, in dem jeder Sprecher ein **Label** trägt: seinen Namen,
|
||||
falls beim Analysezeitpunkt bekannt, sonst „Sprecher N". Wer erst DANACH benannt wird (Sprecher-Popover,
|
||||
Namensmarker), stand vorher weiter als „Sprecher 5" im fertigen Text — und eine Neu-Analyse kostet auf
|
||||
diesem Board ~20–30 min.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["analyzeRecording()"] --> B["buildBasis() vergibt Labels<br/>{speaker_09: 'Sprecher 5'}"]
|
||||
B --> C[("recordings.speaker_labels")]
|
||||
B --> D["LLM: Zusammenfassung/Todos<br/>mit genau diesen Labels"]
|
||||
E["Sprecher umbenennen<br/>(Popover / Marker)"] --> F["relabelAnalysis()"]
|
||||
C --> F
|
||||
F --> G["Whole-Word-Ersetzung in<br/>summary · todos · transcript_clean"]
|
||||
F --> H["Teilnehmerliste NEU gebaut<br/>(Reihenfolge des ersten Auftretens)"]
|
||||
F --> C
|
||||
```
|
||||
|
||||
- `speaker_labels` (JSON, pro Aufnahme) hält genau das Label, das jeder Cluster im LLM-Text hatte —
|
||||
deshalb ist die Ersetzung eindeutig und braucht keine erneute Analyse (Sekunden statt Minuten).
|
||||
- Nach der Ersetzung wird das gespeicherte Label auf den Namen gesetzt, damit ein zweites Umbenennen
|
||||
wieder funktioniert.
|
||||
- **Teilnehmerliste** wird neu aufgebaut statt ersetzt (String-Swap ließ Sprecher stehen, die im Text nie
|
||||
vorkamen, und konnte Namen doppeln).
|
||||
- **Mehrdeutige Labels werden übersprungen:** trug dasselbe Label zwei Cluster (die Stimm-Erkennung hatte
|
||||
„Fabio" einmal auf zwei Cluster gelegt), lässt sich im Text nicht entscheiden, wer gemeint war — dann
|
||||
bleibt der Text unangetastet. Sauber wird das erst durch „Analyse neu (nur KI)" mit korrekten Namen.
|
||||
- GUI: Umbenennen → Toast „Name in Zusammenfassung übernommen", Detailansicht lädt neu.
|
||||
|
||||
## Robustheit gegen Gemma-Marotten (alle real aufgetreten)
|
||||
|
||||
| Marotte | Gegenmaßnahme |
|
||||
|
||||
@@ -3,6 +3,28 @@
|
||||
Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum,
|
||||
Was, Warum, betroffene Dateien/Backups).
|
||||
|
||||
## 2026-07-27 (2) — Namen nachträglich in die fertige Zusammenfassung übernehmen
|
||||
|
||||
- **Problem (Nutzer):** alle 20 Sprecher von #74 benannt, in der Zusammenfassung stand trotzdem weiter
|
||||
„Sprecher 5" statt Katharina. Grund: der Text entsteht mit den Labels, die beim Analysezeitpunkt galten;
|
||||
spätere Namen ändern nur `speaker_names`. Zusätzlich zählte `buildBasis()` „Sprecher N" nur über die
|
||||
UNBENANNTEN Sprecher, die Teilnehmerliste und die Spur-Beschriftung dagegen über alle → dieselbe Nummer
|
||||
meinte in Text und GUI verschiedene Personen.
|
||||
- **Fix:** neue Spalte `recordings.speaker_labels` (JSON) speichert das Label jedes Clusters im LLM-Text;
|
||||
`relabelAnalysis()` (server.js) ersetzt beim Umbenennen wortgenau in `summary`, `todos` und
|
||||
`transcript_clean`, baut die Teilnehmerliste aus der Diarization neu auf und schreibt das Label auf den
|
||||
neuen Namen fort. Aufgerufen aus `POST /recordings/:id/speaker` und aus `applyMarkers()`.
|
||||
Mehrdeutige Labels (ein Label auf zwei Clustern) werden bewusst NICHT ersetzt. Teilnehmerliste der
|
||||
Analyse nutzt jetzt dieselben Labels wie der Dialogtext.
|
||||
- **#74 nachgezogen:** Label-Karte des alten Laufs rekonstruiert (Namen zum Analysezeitpunkt:
|
||||
Kai/Fabio/Fabio) und angewandt → **0 „Sprecher N" mehr in Summary und Todos**, Teilnehmerliste = die 20
|
||||
echten Namen in Reihenfolge des ersten Auftretens. Rest: „Fabio" steht an 10 Stellen, davon einige
|
||||
eigentlich Nico (die Stimm-ID hatte damals zwei Cluster „Fabio" genannt) — sauber nur per
|
||||
„Analyse neu (nur KI)".
|
||||
- **Dateien:** `server.js` (buildBasis liefert Labels, relabelAnalysis), `db.js`
|
||||
(`speaker_labels`, `setSpeakerLabels`/`getSpeakerLabels`), `web/src/main.js` (Toast).
|
||||
Bundle `index-TOCXxq47.js`.
|
||||
|
||||
## 2026-07-27 — Diarization v2 (Fenster-Clustering, gelernte Schwelle) + Live-Namensmarker
|
||||
|
||||
- **Problem:** #74 (33-min-Weekly, 22 Teilnehmer + ein Kind) automatisch neu analysiert → **44 Sprecher**,
|
||||
|
||||
Reference in New Issue
Block a user