feat(transcription): v0.4.0 with structured json, inline editing and deletion
- Backend: Switched prompt to JSON output for structured data
- Backend: Added PUT /chunks/{id} endpoint for persistence
- Backend: Fixed app.py imports and initialization logic
- Frontend: Complete rewrite for Unified View (flattened chunks)
- Frontend: Added Inline Editing (Text/Speaker) and Row Deletion
- Docs: Updated TRANSCRIPTION_TOOL.md with v0.4 features
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# Meeting Assistant (Transcription Tool)
|
||||
|
||||
**Version:** 0.1.0
|
||||
**Status:** Beta (Core Functionality)
|
||||
**Version:** 0.4.0
|
||||
**Status:** Beta (Functional with Editing)
|
||||
|
||||
Der **Meeting Assistant** ist ein lokaler Micro-Service zur Transkription und Analyse von Audio-Dateien (Meetings, Calls, Interviews). Er kombiniert die Datensicherheit einer lokalen Datenhaltung mit der Leistungsfähigkeit von Googles **Gemini 2.0 Flash** Modell für kostengünstige, hochqualitative Speech-to-Text Umwandlung.
|
||||
|
||||
@@ -15,15 +15,15 @@ Der Service folgt dem "Sidecar"-Pattern im Docker-Stack und ist vollständig in
|
||||
* **Backend:** FastAPI (Python) unter `/tr/api/`.
|
||||
* **Processing:**
|
||||
* **FFmpeg:** Zerlegt große Audio-Dateien (> 2 Stunden) in verarbeitbare 30-Minuten-Chunks.
|
||||
* **Gemini 2.0 Flash:** Führt die eigentliche Transkription durch (via `google-genai` SDK).
|
||||
* **SQLite:** Speichert Metadaten, Status und Ergebnisse.
|
||||
* **Storage:** Lokales Docker-Volume für Audio-Uploads (werden nach Verarbeitung *nicht* gelöscht, um Re-Analysen zu ermöglichen).
|
||||
* **Gemini 2.0 Flash:** Führt die Transkription durch und liefert strukturiertes JSON (Sprecher, Zeitstempel, Text).
|
||||
* **SQLite:** Speichert Metadaten, Status und die bearbeitbaren JSON-Segmente.
|
||||
* **Storage:** Lokales Docker-Volume für Audio-Uploads.
|
||||
|
||||
### Datenfluss
|
||||
1. **Upload:** User lädt MP3 hoch -> Speicherung in `/app/uploads_audio`.
|
||||
2. **Chunking:** Backend startet Background-Task -> FFmpeg erstellt Segmente in `/app/uploads_audio/chunks/{id}/`.
|
||||
3. **Transkription:** Loop über alle Chunks -> Upload zu Gemini File API -> Generierung -> Löschung aus Gemini Cloud -> Speicherung in DB.
|
||||
4. **Assemblierung:** (Geplant für v0.2) Zusammenfügen der Text-Fragmente.
|
||||
2. **Chunking:** Backend startet Background-Task -> FFmpeg erstellt Segmente.
|
||||
3. **Transkription:** Loop über Chunks -> Upload zu Gemini -> JSON-Extraktion -> Offset-Berechnung -> DB-Speicherung.
|
||||
4. **Assemblierung:** Das Frontend lädt alle Chunks eines Meetings und stellt sie als eine durchgehende Liste dar.
|
||||
|
||||
---
|
||||
|
||||
@@ -34,8 +34,10 @@ Basis-URL: `/tr/api`
|
||||
| Methode | Pfad | Beschreibung |
|
||||
| :--- | :--- | :--- |
|
||||
| `GET` | `/meetings` | Liste aller Meetings inkl. Status. |
|
||||
| `POST` | `/upload` | Upload einer Audio-Datei (`multipart/form-data`). Startet Prozess. |
|
||||
| `GET` | `/health` | Status-Check. |
|
||||
| `POST` | `/upload` | Upload einer Audio-Datei (`multipart/form-data`). |
|
||||
| `GET` | `/meetings/{id}` | Lädt Meeting-Details inklusive aller Text-Chunks (JSON). |
|
||||
| `DELETE` | `/meetings/{id}` | Löscht ein Meeting inkl. Dateien komplett. |
|
||||
| `PUT` | `/chunks/{id}` | Aktualisiert den Inhalt (Text/Sprecher) eines spezifischen 30-Min-Chunks. |
|
||||
|
||||
---
|
||||
|
||||
@@ -45,38 +47,39 @@ Datei: `transcripts.db`
|
||||
|
||||
### `meetings`
|
||||
* `id`: PK
|
||||
* `title`: Dateiname (z.B. "Jours_Fixe_Januar.mp3")
|
||||
* `status`: `UPLOADED` -> `SPLITTING` -> `TRANSCRIBING` -> `COMPLETED`
|
||||
* `duration_seconds`: Gesamtlänge
|
||||
* `file_path`: Lokaler Pfad
|
||||
* `title`, `status`, `duration_seconds`, `file_path`.
|
||||
|
||||
### `transcript_chunks`
|
||||
* `id`: PK
|
||||
* `meeting_id`: FK
|
||||
* `chunk_index`: 0, 1, 2...
|
||||
* `raw_text`: Das rohe Transkript von Gemini.
|
||||
* `raw_text`: Backup des rohen Gemini-Outputs.
|
||||
* `json_content`: **JSON** (Editierbar). Struktur: `[{ "time": "MM:SS", "absolute_seconds": 120, "speaker": "A", "text": "..." }]`
|
||||
|
||||
---
|
||||
|
||||
## 4. Konfiguration & Limits
|
||||
## 4. Features & Bedienung
|
||||
|
||||
* **Max Upload Size:** 500 MB (konfiguriert in Nginx).
|
||||
* **Chunk Size:** 30 Minuten (1800 Sekunden).
|
||||
* **Modell:** `gemini-2.0-flash` (Temperatur 0.1 für Faktentreue).
|
||||
* **Kosten:** Gemini 2.0 Flash ist extrem günstig (Audio-Input), aber beachten Sie die API-Limits bei sehr vielen parallelen Uploads.
|
||||
### Transkription
|
||||
* Upload von MP3/WAV Dateien (bis 500MB).
|
||||
* Automatische Erkennung von Sprechern (Speaker A, Speaker B).
|
||||
|
||||
### Editor-Modus (v0.4)
|
||||
* **Inline Editing:** Klicken Sie auf einen Sprechernamen oder Text, um ihn direkt zu bearbeiten. Änderungen werden sofort gespeichert.
|
||||
* **Zeilen Löschen:** Fahren Sie mit der Maus über eine Zeile und klicken Sie auf das rote "X", um irrelevante Teile (z.B. Smalltalk) zu entfernen.
|
||||
* **Sprecher-Aliasing (Ansicht):** Klicken Sie auf den blauen Sprechernamen ("Speaker A"), um ihn für die *aktuelle Sitzung* umzubenennen (z.B. in "Thomas"). *Hinweis: Dies ändert aktuell nur die Ansicht, nicht die Datenbank für alle Zeilen.*
|
||||
|
||||
---
|
||||
|
||||
## 5. Roadmap / Next Steps
|
||||
|
||||
* **v0.2:** Frontend-Detailansicht mit Volltext-Anzeige.
|
||||
* **v0.3:** Sprecher-Identifikation (Mapping "Speaker A" -> "Thomas").
|
||||
* **v0.4:** "Meeting Notes" Generator (Zusammenfassung via LLM).
|
||||
* **v0.5: Global Rename:** Button "Alle 'Speaker A' dauerhaft in DB umbenennen".
|
||||
* **v0.6: AI Analysis:** "Erstelle Meeting Notes" Button basierend auf dem korrigierten Transkript.
|
||||
* **v0.7:** Export als Word/PDF.
|
||||
|
||||
---
|
||||
|
||||
## 6. Troubleshooting
|
||||
|
||||
* **Upload bricht ab:** Prüfen Sie, ob die Datei > 500MB ist oder der Nginx-Timeout (1800s) greift.
|
||||
* **Status bleibt bei "TRANSCRIBING":** Prüfen Sie die Docker-Logs (`docker logs transcription-app`). Evtl. ist der API-Key ungültig oder das Quota erschöpft.
|
||||
* **FFmpeg Fehler:** Stellen Sie sicher, dass das Eingangsformat valide ist (MP3, WAV, M4A werden meist unterstützt).
|
||||
* **Legacy Format:** Bei Dateien, die vor v0.3 hochgeladen wurden, erscheint ein Warnhinweis. Bitte neu hochladen, um die Editier-Funktionen zu nutzen.
|
||||
* **Upload bricht ab:** Prüfen Sie die Dateigröße (< 500MB).
|
||||
Reference in New Issue
Block a user