diff --git a/BEDIENUNGSANLEITUNG.md b/BEDIENUNGSANLEITUNG.md index 4dcbe39..b2782da 100644 --- a/BEDIENUNGSANLEITUNG.md +++ b/BEDIENUNGSANLEITUNG.md @@ -16,14 +16,15 @@ ist. Eine knappe technische Übersicht steht in der [README](README.md). 7. [Schritt 3: Korrigieren](#7-schritt-3-korrigieren) 8. [Schritt 4: Ergebnis prüfen](#8-schritt-4-ergebnis-prüfen) 9. [Schritt 5: Nachbessern und erneut laufen lassen](#9-schritt-5-nachbessern-und-erneut-laufen-lassen) -10. [Nur Ausschnitte bearbeiten (Zeitauswahl)](#10-nur-ausschnitte-bearbeiten-zeitauswahl) -11. [Englische Beiträge](#11-englische-beiträge) -12. [Dateien, die entstehen](#12-dateien-die-entstehen) -13. [Zwischenstände, Abbruch und Fortsetzen](#13-zwischenstände-abbruch-und-fortsetzen) -14. [Ein anderes Sprachmodell verwenden](#14-ein-anderes-sprachmodell-verwenden) -15. [Fehlermeldungen und Lösungen](#15-fehlermeldungen-und-lösungen) -16. [Tipps und häufige Fragen](#16-tipps-und-häufige-fragen) -17. [Kurzreferenz aller Befehle](#17-kurzreferenz-aller-befehle) +10. [Schritt 6: Abschließen und aufräumen](#10-schritt-6-abschließen-und-aufräumen) +11. [Nur Ausschnitte bearbeiten (Zeitauswahl)](#11-nur-ausschnitte-bearbeiten-zeitauswahl) +12. [Englische Beiträge](#12-englische-beiträge) +13. [Dateien, die entstehen](#13-dateien-die-entstehen) +14. [Zwischenstände, Abbruch und Fortsetzen](#14-zwischenstände-abbruch-und-fortsetzen) +15. [Ein anderes Sprachmodell verwenden](#15-ein-anderes-sprachmodell-verwenden) +16. [Fehlermeldungen und Lösungen](#16-fehlermeldungen-und-lösungen) +17. [Tipps und häufige Fragen](#17-tipps-und-häufige-fragen) +18. [Kurzreferenz aller Befehle](#18-kurzreferenz-aller-befehle) --- @@ -57,9 +58,15 @@ Die Werkzeuge im Überblick: | `vtt2txt.py` | Untertiteldatei (`.vtt`) → Rohtext | | `glossar_vorschlag.py` | Entwurf für ein Glossar (vermutete Hörfehler bei Namen und Begriffen) | | `aenderungen.py` | Änderungsbericht für vorhandene Dateien erstellen | +| `abschliessen.py` | fertige Abschrift mit Quellenangabe nach `fertig/`, Arbeitsordner aufräumen | -Für den Normalfall braucht man nur `abschrift_korrigieren.py`, für bessere -Ergebnisse zusätzlich ein Glossar. +Für den Normalfall braucht man nur `abschrift_korrigieren.py` und am Ende +`abschliessen.py`, für bessere Ergebnisse zusätzlich ein Glossar. + +**Wo die Dateien liegen:** Jedes Video bekommt einen eigenen Arbeitsordner +`abschriften//`, in dem alles zu diesem Video entsteht. Ist die Abschrift +fertig, bleibt nur die Ergebnisdatei in `fertig/`. Gemeinsame Glossare liegen in +`glossare/`. Details in [Abschnitt 13](#13-dateien-die-entstehen). --- @@ -95,7 +102,7 @@ Environment="OLLAMA_NUM_PARALLEL=1" Mit `OLLAMA_NUM_PARALLEL=4` landet ein Drittel des Modells auf der CPU, und ein Lauf dauert etwa zwölfmal so lange. Mit weniger Grafikspeicher hilft ein kleineres -Modell (siehe [Abschnitt 14](#14-ein-anderes-sprachmodell-verwenden)), auf Kosten +Modell (siehe [Abschnitt 15](#15-ein-anderes-sprachmodell-verwenden)), auf Kosten der Qualität. ### 2.3 Prüfen, ob alles bereit ist @@ -117,6 +124,10 @@ Lassen sich die Programme nicht mit `./…` starten („Keine Berechtigung“), ausführbar machen: `chmod +x *.py`. Alternativ immer `python3 programm.py …` aufrufen. +**Immer im Programmordner arbeiten.** Die Ordner `abschriften/`, `fertig/` und +`glossare/` werden relativ zum aktuellen Verzeichnis angelegt bzw. gesucht. Wer die +Programme aus einem anderen Verzeichnis startet, bekommt dort eigene, leere Ordner. + --- ## 3. Schnellstart @@ -133,16 +144,25 @@ URLs die Shell. Das Programm 1. lädt die Untertitel in der Originalsprache des Videos, -2. speichert den Rohtext, z. B. `GGBLahnstein_Prof_Gabriele_Krone-Schmalz_Respekt_geht_anders_2026-07-30.txt`, -3. korrigiert ihn abschnittsweise und gliedert ihn in Absätze, -4. schreibt das Ergebnis nach `…_2026-07-30.korrigiert.txt` -5. und den Änderungsbericht nach `…_2026-07-30.aenderungen.html`. +2. legt den Arbeitsordner an, z. B. + `abschriften/GGBLahnstein_Prof_Gabriele_Krone-Schmalz_Respekt_geht_anders_2026-07-30/` + (kurz `abschriften//`), +3. speichert dort den Rohtext `.txt` und die Quellenangabe `.quelle.json` + (Titel, Kanal, Datum, URL), +4. korrigiert den Text abschnittsweise und gliedert ihn in Absätze, +5. schreibt das Ergebnis nach `.korrigiert.txt` +6. und den Änderungsbericht nach `.aenderungen.html`. Eine einstündige Rede braucht mit `qwen3:32b` auf einer RTX 3090 etwa 6–8 Minuten. Danach den Bericht im Browser öffnen und die Liste **„Zu prüfen“** -durchgehen (siehe [Abschnitt 8](#8-schritt-4-ergebnis-prüfen)). +durchgehen (siehe [Abschnitt 8](#8-schritt-4-ergebnis-prüfen)). Ist alles erledigt: -Mit eigenem Dateinamen: +```bash +./abschliessen.py abschriften/ +# → fertig/.txt mit Quellenkopf; der Arbeitsordner wird nach Rückfrage gelöscht +``` + +Mit eigenem Dateinamen (ohne Arbeitsordner): ```bash ./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.korrigiert.txt @@ -155,8 +175,10 @@ und einem passenden Glossar. Ein Lauf dauert etwa zwei bis drei Minuten und zeig Ergebnisse, auch den Änderungsbericht: ```bash -./abschrift_korrigieren.py -i tests/daten/beispiel.de.txt -g tests/daten/beispiel.glossar.txt -o beispiel.korrigiert.txt -# → beispiel.korrigiert.txt, beispiel.aenderungen.html +./abschrift_korrigieren.py -i tests/daten/beispiel.de.txt -g tests/daten/beispiel.glossar.txt \ + -o abschriften/beispiel/beispiel.korrigiert.txt +# → abschriften/beispiel/: beispiel.korrigiert.txt, beispiel.aenderungen.html +./abschliessen.py abschriften/beispiel # Abschluss ausprobieren ``` --- @@ -168,22 +190,28 @@ besonders bei vielen Namen, lohnt dieser Ablauf: ```text YouTube-URL - │ Schritt 1: extract_text.py → rede.txt (Rohtext) + │ Schritt 1: extract_text.py → abschriften//.txt (Rohtext) ▼ Rohtext ansehen - │ Schritt 2: glossar_vorschlag.py → rede.glossar.entwurf.txt - │ prüfen, übernehmen → glossare/rede.glossar.txt + │ Schritt 2: glossar_vorschlag.py → .glossar.entwurf.txt + │ prüfen, übernehmen → .glossar.txt (Video-Glossar) + │ bzw. glossare/.glossar.txt ▼ - │ Schritt 3: abschrift_korrigieren.py → rede.korrigiert.txt - │ rede.aenderungen.html + │ Schritt 3: abschrift_korrigieren.py → .korrigiert.txt + │ .aenderungen.html ▼ - │ Schritt 4: Bericht prüfen („Zu prüfen“) + │ Schritt 4: Bericht prüfen („Zu prüfen“), Text von Hand nacharbeiten ▼ │ Schritt 5: Glossar ergänzen, erneut laufen lassen - ▼ (nur Geändertes wird neu berechnet) + │ (nur Geändertes wird neu berechnet) + ▼ + │ Schritt 6: abschliessen.py → fertig/.txt, Arbeitsordner gelöscht + ▼ fertige Abschrift ``` +Alle Dateien eines Videos liegen bis zum Abschluss in `abschriften//`. + --- ## 5. Schritt 1: Rohtext holen @@ -191,7 +219,8 @@ fertige Abschrift ### 5.1 Von YouTube: `extract_text.py` ```bash -./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o rede.txt +./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' +# → abschriften//.txt und .quelle.json ``` Das Programm zeigt Titel, gewählte Untertitelspur und Ziel an: @@ -201,8 +230,10 @@ Video: Prof. Gabriele Krone-Schmalz – Respekt geht anders – … Lade automatische Untertitel „de-orig“ … ``` -Ohne `-o` entsteht ein Name aus Kanal, Titel und Datum (siehe -[Abschnitt 12.2](#122-standard-dateinamen)). +Ohne `-o` entsteht ein Name aus Kanal, Titel und Datum, und die Datei kommt in den +Arbeitsordner `abschriften//` (siehe [Abschnitt 13.2](#132-standard-dateinamen)). +Mit `-o rede.txt` landet sie dort, wo man will; die Quellenangabe `rede.quelle.json` +entsteht daneben. **Welche Untertitel werden genommen?** @@ -223,16 +254,19 @@ versteht `abschrift_korrigieren.py`. Soll die Original-Untertiteldatei (`.vtt`, mit Zeitstempeln) erhalten bleiben: ```bash -./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d untertitel -# → untertitel/Lahnstein.de-orig.vtt -./vtt2txt.py -i untertitel/Lahnstein.de-orig.vtt -# → untertitel/Lahnstein.de-orig.txt +./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein +# → abschriften/Lahnstein/Lahnstein.de-orig.vtt (+ Lahnstein.quelle.json) +./vtt2txt.py -i abschriften/Lahnstein/Lahnstein.de-orig.vtt +# → abschriften/Lahnstein/Lahnstein.de-orig.txt ``` +`-n` bestimmt den Namen von Datei und Arbeitsordner; mit `-d` wählt man ein anderes +Zielverzeichnis. + Achtung: `yt_untertitel.py` nimmt ohne `-l` Deutsch (`de`), nicht die Originalsprache. Für englische Videos `-l en` angeben. -Die `.vtt`-Datei braucht man für die [Zeitauswahl](#10-nur-ausschnitte-bearbeiten-zeitauswahl) +Die `.vtt`-Datei braucht man für die [Zeitauswahl](#11-nur-ausschnitte-bearbeiten-zeitauswahl) mit vorhandenen Dateien. `abschrift_korrigieren.py` nimmt sie auch direkt, der Zwischenschritt über `vtt2txt.py` ist dann nur nötig, um den Rohtext anzusehen oder ein Glossar daraus zu erstellen. @@ -293,33 +327,43 @@ Regeln für feste Ersetzungen: die Ersetzungen ohne Treffer. Bei einem Glossar für genau diesen Beitrag deutet „ohne Treffer“ auf einen Tippfehler. -### 6.2 Mehrere Glossare kombinieren +### 6.2 Gemeinsame Glossare und Video-Glossare Bewährt hat sich ein **gemeinsames Glossar** pro Redner oder Kanal (wiederkehrende -Namen und Hörfehler) plus eines **je Beitrag**: +Namen und Hörfehler) plus ein **Video-Glossar** je Beitrag: + +| Art | Ablage | Verwendung | +|---|---|---| +| gemeinsames Glossar | `glossare/krone-schmalz.glossar.txt` | mit `-g` angeben | +| Video-Glossar | `abschriften//.glossar.txt`, heißt wie sein Ordner | **automatisch** | ```bash -./abschrift_korrigieren.py -i rede.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt +./abschrift_korrigieren.py -i abschriften//.txt -g glossare/krone-schmalz.glossar.txt +# Glossar glossare/krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen +# Glossar abschriften//.glossar.txt (Video-Glossar, automatisch): … ``` -Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen zuerst greifen. +Das Video-Glossar wird nach den mit `-g` angegebenen angewendet; so greifen die +gemeinsamen Ersetzungen zuerst. Dasselbe gilt für `glossar_vorschlag.py` und +`aenderungen.py`. Beim Abschluss nennt `abschliessen.py` die Einträge des +Video-Glossars, die noch in keinem gemeinsamen Glossar stehen. Was auch in anderen +Videos vorkommen wird (Namen, Orte), gehört dann ins gemeinsame Glossar; der Rest +verschwindet mit dem Arbeitsordner. -**Ablage:** Glossare gehören ins Verzeichnis `glossare/` im Programmordner, z. B. -`glossare/krone-schmalz.glossar.txt` und `glossare/ramstein.glossar.txt`. Sie -enthalten Namen realer Personen und Hörfehler realer Beiträge und werden deshalb -nicht ins Git-Repository übernommen: `glossare/` und jede Datei `*.glossar.txt` sind -über `.gitignore` ausgeschlossen und bleiben nur auf dem eigenen Rechner. Das ist -gewollt; Glossare deshalb gesondert sichern. Einzige Ausnahme ist das kleine, -leicht nachvollziehbare Glossar zur erfundenen Beispielrede in -`tests/daten/beispiel.glossar.txt`, das sich gut als Vorlage eignet. +**Glossare bleiben lokal.** Sie enthalten Namen realer Personen und Hörfehler realer +Beiträge und werden deshalb nicht ins Git-Repository übernommen (`glossare/`, +`abschriften/` und `*.glossar.txt` stehen in `.gitignore`). `glossare/` deshalb +gesondert sichern (siehe [Abschnitt 17](#17-tipps-und-häufige-fragen)). Als Vorlage +eignet sich das kleine Glossar zur erfundenen Beispielrede in +`tests/daten/beispiel.glossar.txt`. ### 6.3 Entwurf vom Modell: `glossar_vorschlag.py` Statt den ganzen Rohtext zu lesen, kann das Modell einen ersten Entwurf liefern: ```bash -./glossar_vorschlag.py -i rede.txt -g glossare/krone-schmalz.glossar.txt -# → rede.glossar.entwurf.txt +./glossar_vorschlag.py -i abschriften//.txt -g glossare/krone-schmalz.glossar.txt +# → abschriften//.glossar.entwurf.txt ``` Das Modell sucht abschnittsweise vermutete Hörfehler: Namen, Orte, Fremdwörter, @@ -346,8 +390,8 @@ irrt sich oft (im Beispiel ist „Deckmäntelchen“ richtig). Eine falsche fest Ersetzung verdirbt den Text unbemerkt. Deshalb: 1. Jeden Eintrag prüfen, im Zweifel im Rohtext oder Video nachsehen. -2. Brauchbare Zeilen ohne `# ? ` ins Glossar des Beitrags (oder ins gemeinsame) - kopieren. +2. Brauchbare Zeilen ohne `# ? ` ins Video-Glossar + `abschriften//.glossar.txt` (oder ins gemeinsame) kopieren. 3. Unsichere Namen lieber als **Begriff** (ohne `=>`) aufnehmen. Nach einem Korrekturlauf kann der Entwurf zusätzlich die Wörter auflisten, die das @@ -355,7 +399,8 @@ Modell geändert hat. Das zeigt Hörfehler, die man als feste Ersetzung absicher möchte, und Fehlgriffe des Modells: ```bash -./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt +./glossar_vorschlag.py -i abschriften//.txt -k abschriften//.korrigiert.txt \ + -g glossare/krone-schmalz.glossar.txt ``` Diese Einträge stehen in einem eigenen Abschnitt mit ihrer Anzahl, z. B. @@ -367,11 +412,12 @@ entfernen. ## 7. Schritt 3: Korrigieren ```bash -./abschrift_korrigieren.py -i rede.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt +./abschrift_korrigieren.py -i abschriften//.txt -g glossare/krone-schmalz.glossar.txt ``` -Statt `-i rede.txt` geht auch `-i rede.de.vtt` (Untertiteldatei) oder -`-u URL` (direkt von YouTube). +Statt des Rohtexts geht auch die Untertiteldatei (`-i …/.de-orig.vtt`) oder +`-u URL` (direkt von YouTube). Das Ergebnis entsteht neben der Eingabe, also im +Arbeitsordner; das Video-Glossar dort wird automatisch verwendet. ### 7.1 Was das Programm tut @@ -401,7 +447,7 @@ Ein gekürztes Beispiel mit Erläuterungen: Modell: qwen3:32b Sprache des Beitrags: de Glossar glossare/krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen -Glossar glossare/ramstein.glossar.txt: 2 Begriffe, 15 feste Ersetzungen +Glossar abschriften//.glossar.txt (Video-Glossar, automatisch): 2 Begriffe, 15 feste Ersetzungen Ersetzt 2× „Willly Brand“ → „Willy Brandt“ ← feste Ersetzungen mit Treffern Ersetzt 6× „Rammstein“ → „Ramstein“ 13 Ersetzung(en) ohne Treffer: „Hostelchik“, … ← bei gemeinsamen Glossaren normal @@ -565,13 +611,60 @@ vorhandene Datei als von Hand geändert. --- -## 10. Nur Ausschnitte bearbeiten (Zeitauswahl) +## 10. Schritt 6: Abschließen und aufräumen + +Ist der Text geprüft und nachgearbeitet, wird das Video abgeschlossen. Danach zählt +nur noch die Ergebnisdatei; Rohtext, Bericht, Zwischenstände und Video-Glossar +werden nicht mehr gebraucht. + +```bash +./abschliessen.py abschriften/ +``` + +Was dabei passiert: + +1. **Prüfen:** Gibt es noch `[prüfen: …]`-Marken im Text oder eine ungeklärte + `.neu.korrigiert.txt` (siehe [Abschnitt 9](#9-schritt-5-nachbessern-und-erneut-laufen-lassen)), + bricht das Programm ab und nennt die Stellen. Erst klären, dann erneut aufrufen. + Mit `--trotzdem` wird auch mit offenen Marken abgeschlossen. +2. **Übernehmen:** Jedes Ergebnis kommt nach `fertig/`, bei Ausschnitten jedes + einzeln, mit einem Quellenkopf: + + ```text + Titel: Prof. Gabriele Krone-Schmalz – Respekt geht anders + Kanal: GGBLahnstein + Datum: 2026-07-30 + Quelle: https://www.youtube.com/watch?v=rm6lADgf6GQ + Abgeschlossen: 2026-10-11 + + Vielen Dank. Liebe Gäste, … + ``` + + Die Angaben stammen aus `.quelle.json`, die beim Download entsteht. Fehlt + sie (z. B. bei einer eigenen `.vtt`), nennt der Kopf nur die Datei. Eine Datei in + `fertig/` mit anderem Text wird nie überschrieben. +3. **Glossar sichten:** Einträge des Video-Glossars, die in keinem Glossar unter + `glossare/` stehen, werden aufgelistet. Brauchbares jetzt ins gemeinsame Glossar + übernehmen. +4. **Aufräumen:** Der Inhalt des Arbeitsordners wird angezeigt, dann kommt die Frage + `Arbeitsordner … löschen? [j/N]`. Nur `j` löscht. Wer „n“ antwortet, kann + `abschliessen.py` später erneut aufrufen; die Datei in `fertig/` wird dann als + bereits übernommen erkannt. Mit `--ja` wird ohne Frage gelöscht. + +**Schutz vor Versehen:** Nie gelöscht werden Ordner, die andere Dateien enthalten als +die, die das Programm selbst anlegt (`.txt`, `.vtt`, `.html`, `.json`, `*.parts/`), +außerdem das Aufrufverzeichnis und alles in `testdaten/`, `glossare/`, `tests/` und +`fertig/`. Das Programm nennt dann den Grund, und der Ordner bleibt stehen. + +--- + +## 11. Nur Ausschnitte bearbeiten (Zeitauswahl) Mit `-z` wird nur ein Teil des Videos bearbeitet. Das geht mit `-u` (YouTube) und mit `.vtt`-Dateien, nicht mit reinem Text (der hat keine Zeitstempel). Dieselbe Option kennen `extract_text.py` und `vtt2txt.py`. -### 10.1 Zeitangaben +### 11.1 Zeitangaben | Angabe | Bedeutung | |---|---| @@ -584,7 +677,7 @@ Option kennen `extract_text.py` und `vtt2txt.py`. > Reicht ein Bereich über das Ende des Videos hinaus, weist das Programm darauf hin > und nennt die Länge der Untertitel. -### 10.2 Bereiche +### 11.2 Bereiche | Aufruf | Bearbeitet | |---|---| @@ -601,7 +694,7 @@ und werden nach der Zeit sortiert. Beispiel: ./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=…' -z 00:05-00:06 00:25 ``` -### 10.3 Was dabei herauskommt +### 11.3 Was dabei herauskommt Alle Bereiche landen in **einer** Datei, jeder mit einer Überschrift, die seine tatsächlichen Zeiten nennt: @@ -625,7 +718,7 @@ Also, wenn ihr Programme baut mit Claude Code, … --- -## 11. Englische Beiträge +## 12. Englische Beiträge Mit `-u` erkennt das Programm die Sprache des Videos selbst. Bei Dateien die Sprache angeben: @@ -646,28 +739,44 @@ Andere Sprachen lehnt das Programm mit einer Meldung ab. --- -## 12. Dateien, die entstehen +## 13. Dateien, die entstehen -### 12.1 Übersicht +### 13.1 Übersicht -Beispiel für `-i rede.txt` bzw. `-o rede.korrigiert.txt`: +Im Programmordner entstehen diese Verzeichnisse. Alle bleiben nur auf dem eigenen +Rechner, keines geht ins Git-Repository: + +```text +glossare/ gemeinsame Glossare je Sprecher oder Kanal +abschriften// Arbeitsordner, einer je Video +fertig/ abgeschlossene Abschriften, je eine Datei +testdaten// nur für Entwickler: echte Reden für Regressionstests +``` + +Im Arbeitsordner `abschriften//`: | Datei | Inhalt | Wird überschrieben? | |---|---|---| -| `rede.txt` | Rohtext (bei `-u` automatisch gespeichert) | nie, wenn sie schon mit anderem Inhalt existiert (dann Warnung) | -| `rede.korrigiert.txt` | korrigierte Abschrift | ja, außer sie wurde von Hand geändert (dann `rede.neu.korrigiert.txt`, siehe [Abschnitt 9](#9-schritt-5-nachbessern-und-erneut-laufen-lassen)) | -| `rede.aenderungen.html` | Änderungsbericht | ja, bei jedem Lauf | -| `rede.korrigiert.parts/` | Zwischenstände | wird ergänzt; darf jederzeit gelöscht werden | -| `rede.glossar.entwurf.txt` | Glossar-Entwurf von `glossar_vorschlag.py` | ja | -| `rede.glossar.entwurf.parts/` | Zwischenstände des Entwurfs | wird ergänzt | +| `.txt` | Rohtext (bei `-u` automatisch gespeichert) | nie, wenn sie schon mit anderem Inhalt existiert (dann Warnung) | +| `.quelle.json` | Titel, Kanal, Datum, URL (beim Download) | ja, beim nächsten Download | +| `.glossar.txt` | Video-Glossar (legt man selbst an) | nie | +| `.korrigiert.txt` | korrigierte Abschrift | ja, außer sie wurde von Hand geändert (dann `.neu.korrigiert.txt`, siehe [Abschnitt 9](#9-schritt-5-nachbessern-und-erneut-laufen-lassen)) | +| `.aenderungen.html` | Änderungsbericht | ja, bei jedem Lauf | +| `.korrigiert.parts/` | Zwischenstände | wird ergänzt; darf jederzeit gelöscht werden | +| `.glossar.entwurf.txt` | Glossar-Entwurf von `glossar_vorschlag.py` | ja | +| `.glossar.entwurf.parts/` | Zwischenstände des Entwurfs | wird ergänzt | -Ohne `-o` liegt das Ergebnis neben der Eingabedatei. Bei `-u` ohne `-o` im -aktuellen Verzeichnis. Fehlende Verzeichnisse in `-o` werden angelegt. +Ausschnitte (`-z`) desselben Videos landen im selben Ordner, mit den Bereichen im +Namen. Mit `abschliessen.py` kommt jedes Ergebnis als `fertig/.txt` heraus, und +der Arbeitsordner wird gelöscht ([Abschnitt 10](#10-schritt-6-abschließen-und-aufräumen)). -### 12.2 Standard-Dateinamen +Mit `-i` liegt das Ergebnis neben der Eingabedatei; mit `-o` dort, wo man will +(fehlende Verzeichnisse werden angelegt). -Ohne `-o` (bzw. `-n` bei `yt_untertitel.py`) entsteht der Name aus **Kanal, Titel -und Hochladedatum**: +### 13.2 Standard-Dateinamen + +Ohne `-o` (bzw. `-n` bei `yt_untertitel.py`) entsteht der Name des Arbeitsordners +und der Dateien aus **Kanal, Titel und Hochladedatum**: | Video | Name | |---|---| @@ -680,7 +789,7 @@ denselben Namen. --- -## 13. Zwischenstände, Abbruch und Fortsetzen +## 14. Zwischenstände, Abbruch und Fortsetzen Jeder fertig korrigierte Abschnitt, jede Absatzgliederung und jede Entscheidung beim Verbinden kurzer Absätze wird sofort in `.parts/` gespeichert. @@ -691,11 +800,12 @@ beim Verbinden kurzer Absätze wird sofort in `.parts/` gespeichert. - Ändern sich Modell, Anweisung, Glossar oder der Text eines Abschnitts, wird genau dieser Teil neu berechnet; alte Zwischenstände stören nicht. - Der Ordner `*.parts/` darf jederzeit gelöscht werden; dann wird alles neu - berechnet. + berechnet. Er wächst mit jeder Modell- oder Glossaränderung, weil alte Fassungen + liegen bleiben. Beim Abschluss verschwindet er mit dem Arbeitsordner. --- -## 14. Ein anderes Sprachmodell verwenden +## 15. Ein anderes Sprachmodell verwenden ```bash ollama pull qwen3:14b @@ -713,7 +823,7 @@ Weitere Einstellungen (Abschnittsgröße, Absatzlängen, Schwellen) sind in der --- -## 15. Fehlermeldungen und Lösungen +## 16. Fehlermeldungen und Lösungen | Meldung | Ursache und Lösung | |---|---| @@ -725,7 +835,7 @@ Weitere Einstellungen (Abschnittsgröße, Absatzlängen, Schwellen) sind in der | `Keine Untertitel in „de“ (weder manuell noch automatisch in Originalsprache).` | Das Video hat keine passende Spur. Die Meldung listet die vorhandenen Sprachen; ggf. mit `-l` eine davon wählen. Ist das Video z. B. englisch, `-l en` angeben. | | `Der Beitrag ist auf „fr“; unterstützt: de, en (-l).` | Nur Deutsch und Englisch werden korrigiert. | | `-z braucht Zeitstempel: nur mit .vtt-Eingabe oder -u.` | Zeitauswahl geht nicht mit `.txt`. Die `.vtt`-Datei oder `-u URL` verwenden. | -| `-z/--zeitraeume: …` | Zeitangabe ungültig oder Bereiche überschneiden sich, siehe [Abschnitt 10](#10-nur-ausschnitte-bearbeiten-zeitauswahl). | +| `-z/--zeitraeume: …` | Zeitangabe ungültig oder Bereiche überschneiden sich, siehe [Abschnitt 11](#11-nur-ausschnitte-bearbeiten-zeitauswahl). | | `Die Eingabedatei enthält im gewählten Zeitraum keinen Text.` | Im Bereich gibt es keine Untertitel. Zeiten prüfen (`05:00` = 5 Stunden!). | | `Die Eingabedatei ist leer.` | Datei prüfen. | | `Ausgabedatei darf nicht die Eingabedatei sein.` | Mit `-o` einen anderen Namen wählen. | @@ -738,12 +848,16 @@ Weitere Einstellungen (Abschnittsgröße, Absatzlängen, Schwellen) sind in der | `Hinweis: keine Wortliste für „de“ (Paket wngerman); …` | `sudo apt install wngerman` (für Englisch `wamerican`). Ohne Wortliste fehlt im Bericht nur der Grund „gültiges Wort ersetzt“. | | `Hinweis: keine Untertitel im Bereich …` | Einer von mehreren Bereichen ist leer und wird übersprungen. In Klammern steht, wo die Untertitel enden. | | `Hinweis: Bereich Anfang – 05:00:00 reicht über das Ende der Untertitel hinaus (…)` | Der Bereich endet nach dem Video. Meist war Minute statt Stunde gemeint: `05:00` ist Stunde 5, Minute 5 ist `00:05`. Bearbeitet wird trotzdem, bis zum Ende des Videos. | +| `Noch offene Prüfmarken. Erst klären, oder mit --trotzdem abschließen.` | `abschliessen.py`: Im Text stehen noch `[prüfen: …]`-Marken (die Zeilen werden genannt). Auflösen und erneut aufrufen. | +| `Ungeklärter Konflikt: .neu.korrigiert.txt …` | `abschliessen.py`: Erst die eigenen Änderungen übertragen bzw. entscheiden, welche Fassung gilt, und die `.neu`-Datei löschen. | +| `Gibt es schon in fertig mit anderem Text: …` | In `fertig/` liegt schon eine Abschrift dieses Namens mit anderem Inhalt. Sie wird nie überschrieben: umbenennen oder entfernen, dann erneut aufrufen. | +| `Arbeitsordner … bleibt erhalten: Fremde Datei: …` | Im Arbeitsordner liegt eine Datei, die das Programm nicht selbst anlegt (z. B. Notizen). Die fertige Abschrift ist trotzdem in `fertig/`; den Ordner selbst aufräumen. | | `Keine Berechtigung` beim Start mit `./…` | `chmod +x *.py` oder `python3 programm.py …` aufrufen. | | Lauf ist extrem langsam | Das Modell passt nicht in den Grafikspeicher. `OLLAMA_NUM_PARALLEL=1` setzen (siehe [Abschnitt 2.2](#22-grafikkarte)), andere Programme mit Grafikspeicherbedarf schließen oder ein kleineres Modell wählen. Prüfen mit `ollama ps` (Spalte PROCESSOR sollte „100% GPU“ zeigen). | --- -## 16. Tipps und häufige Fragen +## 17. Tipps und häufige Fragen **Wie bekomme ich die besten Ergebnisse?** Mit einem guten Glossar. Das Modell kennt viele Namen nicht oder schreibt sie @@ -777,17 +891,28 @@ for url in 'https://www.youtube.com/watch?v=AAA' 'https://www.youtube.com/watch? done ``` +**Wie sichere ich meine Daten?** +Wertvoll sind auf Dauer nur `glossare/` (gewachsenes Wissen über Namen und Hörfehler) +und `fertig/` (die Ergebnisse). Beide sind bewusst nicht im öffentlichen +Git-Repository. Am einfachsten ist ein zweites, **privates** Git-Repository nur für +diese beiden Ordner, oder man nimmt sie ins normale Backup auf. `abschriften/` muss +nicht gesichert werden; was dort liegt, ist entweder in Arbeit oder lässt sich neu +erzeugen. + +**Welche Videos sind noch in Arbeit?** +Alle, die einen Ordner in `abschriften/` haben: `ls abschriften/`. + **Wo sind die Absätze?** In `*.korrigiert.txt` trennt eine Leerzeile die Absätze. Viele Textprogramme übernehmen das beim Einfügen direkt. **Kann ich das Ergebnis weiterverarbeiten (Word, LibreOffice)?** -Die `.korrigiert.txt` ist reiner UTF-8-Text und lässt sich überall öffnen oder -einfügen. +Die Dateien in `fertig/` (und die `.korrigiert.txt`) sind reiner UTF-8-Text und +lassen sich überall öffnen oder einfügen. --- -## 17. Kurzreferenz aller Befehle +## 18. Kurzreferenz aller Befehle ### `abschrift_korrigieren.py` @@ -795,7 +920,7 @@ einfügen. |---|---| | `-i DATEI` | Eingabe: Rohtext (`.txt`) oder Untertitel (`.vtt`) | | `-u URL` | statt `-i`: YouTube-Video laden und korrigieren | -| `-o DATEI` | Ausgabedatei (Standard: `.korrigiert.txt` bzw. `__.korrigiert.txt`) | +| `-o DATEI` | Ausgabedatei (Standard: `.korrigiert.txt`, mit `-u` `abschriften//.korrigiert.txt`) | | `-g DATEI` | Glossar, mehrfach möglich (Reihenfolge zählt) | | `-l SPRACHE` | `de` oder `en` (Standard: `de`, mit `-u` die Originalsprache) | | `-m MODELL` | Ollama-Modell (Standard: `qwen3:32b`) | @@ -809,7 +934,7 @@ einfügen. | Option | Bedeutung | |---|---| | `-u URL` | YouTube-URL (Pflicht) | -| `-o DATEI` | Ausgabedatei (Standard: `__.txt`) | +| `-o DATEI` | Ausgabedatei (Standard: `abschriften//.txt`) | | `-l SPRACHE` | Sprache der Untertitel (Standard: Originalsprache) | | `-f` | Fließtext mit 80 Zeichen pro Zeile | | `-z BEREICH …`, `--exakt` | Zeitauswahl wie oben | @@ -819,9 +944,9 @@ einfügen. | Option | Bedeutung | |---|---| | `-u URL` | YouTube-URL (Pflicht) | -| `-n NAME` | Dateiname ohne Endung (Standard: `__`) | +| `-n NAME` | Name von Datei und Arbeitsordner (Standard: `__`) | | `-l SPRACHE` | Sprache (Standard: `de`) | -| `-d VERZEICHNIS` | Zielverzeichnis (Standard: aktuelles) | +| `-d VERZEICHNIS` | Zielverzeichnis (Standard: `abschriften//`) | ### `vtt2txt.py` @@ -851,4 +976,16 @@ einfügen. | `-g DATEI` | Glossare der Korrektur, mehrfach möglich | | `-l SPRACHE` | Sprache für die Wortliste (Standard: `de`) | +### `abschliessen.py` + +| Option | Bedeutung | +|---|---| +| `ORDNER` | Arbeitsordner, z. B. `abschriften/` (Pflicht) | +| `--ziel VERZEICHNIS` | für fertige Abschriften (Standard: `fertig`) | +| `--glossare VERZEICHNIS` | gemeinsame Glossare für den Glossar-Hinweis (Standard: `glossare`) | +| `--ja` | Arbeitsordner ohne Rückfrage löschen | +| `--trotzdem` | auch mit offenen Prüfmarken abschließen | + +Das Video-Glossar `abschriften//.glossar.txt` verwenden +`abschrift_korrigieren.py`, `glossar_vorschlag.py` und `aenderungen.py` automatisch. Jedes Programm zeigt mit `--help` seine Optionen. diff --git a/README.md b/README.md index 275b0fb..1946d0c 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Die Werkzeuge sind einzeln oder hintereinander nutzbar: | `abschrift_korrigieren.py` | Rohabschrift (oder VTT direkt) mit dem Sprachmodell korrigieren | | `aenderungen.py` | Änderungsbericht: was hat das Modell gegenüber dem Rohtext geändert? | | `glossar_vorschlag.py` | Glossar-Entwurf: vermutete Hörfehler bei Namen und Begriffen | +| `abschliessen.py` | fertige Abschrift mit Quellenangabe nach `fertig/`, Arbeitsordner löschen | ## Voraussetzungen @@ -41,26 +42,31 @@ der Lauf wird etwa 12-mal langsamer. ## Aufruf -Von der YouTube-URL zum korrigierten Text in einem Befehl: +Von der YouTube-URL zum korrigierten Text in einem Befehl, dann abschließen: ```bash -./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.korrigiert.txt -# → lahnstein.korrigiert.txt, lahnstein.txt (Rohtext), lahnstein.aenderungen.html +./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -g glossare/krone-schmalz.glossar.txt +# → abschriften//: .txt (Rohtext), .quelle.json, +# .korrigiert.txt, .aenderungen.html, .korrigiert.parts/ +./abschliessen.py abschriften/ # → fertig/.txt, Arbeitsordner nach Rückfrage gelöscht ``` +`` ist `__`, siehe [Dateiablage](#dateiablage). + Oder in zwei Schritten, um den Rohtext vorher anzusehen: ```bash -./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.txt -./abschrift_korrigieren.py -i lahnstein.txt # → lahnstein.korrigiert.txt +./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' # → abschriften//.txt +./abschrift_korrigieren.py -i abschriften//.txt # Ergebnis im selben Ordner ``` Dasselbe in Einzelschritten, wenn die VTT-Datei erhalten bleiben soll: ```bash -./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d untertitel -./vtt2txt.py -i untertitel/Lahnstein.de-orig.vtt -./abschrift_korrigieren.py -i untertitel/Lahnstein.de-orig.txt +./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein +# → abschriften/Lahnstein/Lahnstein.de-orig.vtt +./vtt2txt.py -i abschriften/Lahnstein/Lahnstein.de-orig.vtt +./abschrift_korrigieren.py -i abschriften/Lahnstein/Lahnstein.de-orig.txt ``` Der Schritt über `vtt2txt.py` ist optional: `abschrift_korrigieren.py` nimmt auch die @@ -75,7 +81,7 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei ```bash ./extract_text.py -u 'https://www.youtube.com/watch?v=0LmCveTM788' -# → John_Mearsheimer_Offensive_Realism_Episode_1_Origins_of_the_War_In_Ukraine_2026-07-30.txt +# → abschriften/John_Mearsheimer_…_2026-07-30/John_Mearsheimer_…_2026-07-30.txt (+ .quelle.json) ./extract_text.py -u URL -l de -o texte/rede.txt # Sprache und Ziel ./extract_text.py -u URL -f -o rede.txt # lesbarer Fließtext ./extract_text.py -u URL -z 0:03:17-0:05:25 # nur ein Ausschnitt @@ -87,7 +93,7 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei |---|---| | `-u`, `--url` | YouTube-URL, Pflicht | | `-l`, `--lang` | Sprache; Standard: Sprache des Original-Audios (`-orig`) | -| `-o`, `--output` | Ausgabedatei (Verzeichnisse werden angelegt, vorhandene Datei überschrieben); Standard: `__.txt`, siehe unten | +| `-o`, `--output` | Ausgabedatei (Verzeichnisse werden angelegt, vorhandene Datei überschrieben); Standard: `abschriften//.txt`, siehe unten | | `-z`, `--zeitraeume` | nur Untertitel in diesen Bereichen, siehe [Zeitauswahl](#zeitauswahl--z) | | `--exakt` | genau an den Zeiten schneiden statt an Satzgrenzen | | `-f`, `--fliesstext` | Fließtext, auf 80 Zeichen umbrochen (Wörter werden nie getrennt), statt der kurzen Untertitelzeilen; beides versteht `abschrift_korrigieren.py` | @@ -95,7 +101,8 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei ### Standard-Dateinamen für YouTube-Videos Ohne `-o` bzw. `-n` bilden `extract_text.py`, `yt_untertitel.py` und -`abschrift_korrigieren.py -u` den Namen aus Kanal, Titel und Hochladedatum: +`abschrift_korrigieren.py -u` den Namen aus Kanal, Titel und Hochladedatum und +schreiben in den Arbeitsordner `abschriften//`: | Video | Name | |---|---| @@ -108,8 +115,11 @@ Wörter werden mit `_` verbunden. Bindestriche und Punkte im Wort bleiben Video-ID. Mit `-z` kommen die Bereiche dazu, z. B. `…_2026-07-30_00-03-17_bis_00-05-25` (`-z A`: `_ab_…`, `-z 0-B` bzw. `-z -B`: `_bis_…`; mehrere Bereiche mit `+` verbunden: `…_00-05-00_bis_00-06-00+ab_00-25-00`). -Gleiches Video ergibt immer denselben Namen; eine vorhandene Datei wird -überschrieben (ein mit `-u` gespeicherter, abweichender Rohtext aber nie). +Gleiches Video ergibt immer denselben Namen und denselben Ordner, Ausschnitte +eines Videos landen also beisammen. Eine vorhandene Datei wird überschrieben (ein mit +`-u` gespeicherter, abweichender Rohtext und eine von Hand geänderte Korrektur aber +nie). Neben dem Rohtext entsteht `.quelle.json` mit Titel, Kanal, Datum und +URL; daraus macht `abschliessen.py` den Quellenkopf. ### Untertitel herunterladen: `yt_untertitel.py` @@ -130,7 +140,8 @@ gehören zur Synchronisation und werden nicht genommen. Sprachen werden auch mit Region gefunden: `-l en` findet manuelle Untertitel `en-US`. ```bash -./yt_untertitel.py -u URL # → __.de-orig.vtt +./yt_untertitel.py -u URL # → abschriften//.de-orig.vtt +./yt_untertitel.py -u URL -n Lahnstein # → abschriften/Lahnstein/Lahnstein.de-orig.vtt ./yt_untertitel.py -u URL -n Lahnstein -d untertitel # → untertitel/Lahnstein.de-orig.vtt ``` @@ -139,7 +150,7 @@ Region gefunden: `-l en` findet manuelle Untertitel `en-US`. | `-u`, `--url` | YouTube-URL, Pflicht | | `-n`, `--name` | Dateiname ohne Endung; Standard: `__` | | `-l`, `--lang` | Sprache; Standard: `de` | -| `-d`, `--dir` | Zielverzeichnis (wird angelegt); Standard: aktuelles Verzeichnis | +| `-d`, `--dir` | Zielverzeichnis (wird angelegt); Standard: Arbeitsordner `abschriften//` | Eine vorhandene Datei gleichen Namens wird überschrieben. @@ -232,7 +243,7 @@ werden trotzdem umgewandelt; der Exit-Code ist dann 1. ./abschrift_korrigieren.py -i rede.txt -g glossare/rede.glossar.txt # mit Glossar ./abschrift_korrigieren.py -i rede.txt -g glossare/allgemein.glossar.txt -g glossare/rede.glossar.txt # kombiniert ./abschrift_korrigieren.py -i rede.de.vtt # VTT direkt → rede.de.korrigiert.txt -./abschrift_korrigieren.py -u URL # YouTube → __.korrigiert.txt +./abschrift_korrigieren.py -u URL # YouTube → abschriften//.korrigiert.txt ./abschrift_korrigieren.py -i talk.txt -l en # englischer Beitrag ./abschrift_korrigieren.py -u URL -z 0:03:17-0:05:25 # nur ein Ausschnitt des Videos ./abschrift_korrigieren.py -u URL -z 00:05-00:06 00:25 # mehrere Bereiche, eine Datei @@ -243,10 +254,10 @@ werden trotzdem umgewandelt; der Exit-Code ist dann 1. | `-i`, `--input` | Eingabedatei: Rohabschrift (`.txt`) oder Untertitel (`.vtt`, wird wie mit `vtt2txt.py` umgewandelt) | | `-u`, `--url` | statt `-i`: YouTube-URL; Untertitel wie bei `extract_text.py`. Der Rohtext wird neben der Ausgabe gespeichert (`rede.korrigiert.txt` → `rede.txt`, sonst `.roh.txt`), eine vorhandene, abweichende Datei aber nie überschrieben | | `-l`, `--lang` | Sprache des Beitrags: `de` oder `en` (auch mit Region, z. B. `en-US`); wählt Prompts und Prüfmarke. Mit `-u` zugleich die Sprache der Untertitel. Standard: `de`, mit `-u` die Sprache des Original-Audios | -| `-o`, `--output` | Ausgabedatei; Standard: `.korrigiert.txt` neben der Eingabe, mit `-u` `__.korrigiert.txt`; mit `-z` zusätzlich die Bereiche im Namen | +| `-o`, `--output` | Ausgabedatei; Standard: `.korrigiert.txt` neben der Eingabe, mit `-u` `abschriften//.korrigiert.txt`; mit `-z` zusätzlich die Bereiche im Namen | | `-z`, `--zeitraeume` | nur diese Bereiche korrigieren, siehe [Zeitauswahl](#zeitauswahl--z); nur mit `.vtt`-Eingabe oder `-u`, da reiner Text keine Zeitstempel hat | | `--exakt` | genau an den Zeiten schneiden statt an Satzgrenzen | -| `-g`, `--glossar` | Glossar mit festen Ersetzungen und Schreibweisen; mehrfach angeben zum Kombinieren (Ersetzungen in Reihenfolge der Angabe) | +| `-g`, `--glossar` | Glossar mit festen Ersetzungen und Schreibweisen; mehrfach angeben zum Kombinieren (Ersetzungen in Reihenfolge der Angabe). Das Video-Glossar des Ausgabeordners kommt automatisch dazu, siehe [Glossar](#glossar) | | `-m`, `--model` | Ollama-Modell; Standard: `qwen3:32b` (Konstante `MODEL`) | | `--kein-bericht` | keinen Änderungsbericht schreiben | | `--ueberschreiben` | Ausgabedatei auch ersetzen, wenn sie seit dem letzten Lauf von Hand geändert wurde | @@ -263,6 +274,31 @@ Modell an, an den Rändern der Ausschnitte nichts zu ergänzen. Eine Rohabschrif (`.txt`) mit solchen Überschriften, etwa von `vtt2txt.py -z`, wird ebenso in Blöcken korrigiert. +## Dateiablage + +```text +glossare/ gemeinsame Glossare je Sprecher oder Kanal +abschriften// Arbeitsordner, einer je Video (auch für Ausschnitte) + .txt Rohtext + .quelle.json Titel, Kanal, Datum, URL + .glossar.txt Glossar nur dieses Videos (optional, automatisch genutzt) + [_bereiche].korrigiert.txt Ergebnis, darf von Hand nachbearbeitet werden + [_bereiche].aenderungen.html Änderungsbericht + [_bereiche].korrigiert.parts/ Zwischenstände +fertig/[_bereiche].txt abgeschlossene Abschriften mit Quellenkopf +testdaten// echte Reden als Regressionstest-Eingaben (.vtt, .txt, Glossar) +tests/daten/ erfundene Beispielrede für die Tests (im Repository) +``` + +`glossare/`, `abschriften/`, `fertig/` und `testdaten/` stehen in `.gitignore`: Sie +enthalten Inhalte realer Beiträge und Personen und bleiben nur lokal. Wertvoll sind +davon auf Dauer nur `glossare/` und `fertig/`. Diese beiden gehören in eine eigene +Sicherung, z. B. ein zweites, **privates** Git-Repository. + +Ein Video durchläuft: Rohtext holen → (Video-Glossar anlegen) → korrigieren → +Bericht prüfen und nacharbeiten → mit `abschliessen.py` abschließen. Danach bleibt +nur `fertig/.txt`. + ## Ablauf 0. **Vorprüfung:** Läuft Ollama, ist das Modell installiert? Sonst Abbruch mit @@ -368,17 +404,22 @@ Ersetzungen ohne Treffer werden gesammelt gemeldet. Bei einem Glossar für einen einzelnen Beitrag deutet das auf einen Tippfehler hin, bei einem gemeinsamen Glossar ist es normal. -Mehrere Glossare lassen sich kombinieren: ein gemeinsames für wiederkehrende Namen -und Hörfehler eines Redners oder Kanals und eines je Beitrag, z. B. -`glossare/krone-schmalz.glossar.txt` (gemeinsam) plus `glossare/ramstein.glossar.txt`. -Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen -greifen. +Es gibt zwei Arten von Glossaren: -Glossare liegen im Verzeichnis `glossare/`. Sie gehören zu realen Beiträgen und -Personen und werden deshalb nicht versioniert: `glossare/` und `*.glossar.txt` stehen -in `.gitignore`, die Glossare bleiben nur lokal und sollten gesondert gesichert -werden. Im Repository ist als Beispiel nur `tests/daten/beispiel.glossar.txt` zur -erfundenen Beispielrede. +- **Gemeinsame Glossare** für wiederkehrende Namen und Hörfehler eines Redners oder + Kanals liegen in `glossare/`, z. B. `glossare/krone-schmalz.glossar.txt`. Sie werden + mit `-g` angegeben. +- **Video-Glossare** gelten nur für ein Video und liegen in dessen Arbeitsordner, + benannt wie der Ordner: `abschriften//.glossar.txt`. + `abschrift_korrigieren.py`, `glossar_vorschlag.py` und `aenderungen.py` nutzen es + automatisch (Meldung „Video-Glossar, automatisch“), und zwar nach den mit `-g` + angegebenen, damit die gemeinsamen Ersetzungen zuerst greifen. Beim Abschluss nennt + `abschliessen.py` seine Einträge, die noch in keinem gemeinsamen Glossar stehen. + +Glossare gehören zu realen Beiträgen und Personen und werden deshalb nicht +versioniert (`glossare/`, `abschriften/` und `*.glossar.txt` stehen in `.gitignore`); +`glossare/` sollte gesondert gesichert werden. Im Repository ist als Beispiel nur +`tests/daten/beispiel.glossar.txt` zur erfundenen Beispielrede. ### Glossar-Entwurf: `glossar_vorschlag.py` @@ -420,6 +461,46 @@ Der Entwurf ist ein Ausgangspunkt, kein fertiges Glossar: jeden Eintrag prüfen, Brauchbares ins Glossar des Beitrags (oder ins gemeinsame) übernehmen. Die Modellantworten werden in `.parts/` zwischengespeichert. +## Abschluss: `abschliessen.py` + +```bash +./abschliessen.py abschriften/ # mit Rückfrage vor dem Löschen +./abschliessen.py abschriften/ --ja # ohne Rückfrage +``` + +1. Ergebnisse sind alle `*.korrigiert.txt` im Ordner (bei Ausschnitten mehrere). +2. Abbruch, solange ein `*.neu.korrigiert.txt` (Konflikt mit Handarbeit) da ist oder + noch `[prüfen: …]`-Marken im Text stehen (`--trotzdem` schließt dennoch ab). +3. Jedes Ergebnis kommt als `fertig/[_bereiche].txt` mit Quellenkopf: + + ```text + Titel: Prof. Gabriele Krone-Schmalz – Respekt geht anders + Kanal: GGBLahnstein + Datum: 2026-07-30 + Quelle: https://www.youtube.com/watch?v=rm6lADgf6GQ + Abgeschlossen: 2026-10-11 + + + ``` + + Ohne `*.quelle.json` nennt der Kopf nur die Datei. Eine vorhandene Datei in + `fertig/` mit anderem Text wird nie überschrieben; mit demselben Text gilt das + Video als schon übernommen (z. B. nach „nicht löschen“). +4. Einträge des Video-Glossars, die in keinem Glossar unter `glossare/` stehen, werden + aufgelistet, damit Brauchbares vorher ins gemeinsame Glossar wandert. +5. Der Arbeitsordner wird angezeigt und nach Rückfrage gelöscht. Nie gelöscht werden + Ordner mit fremden Dateien (andere als `.txt`, `.vtt`, `.html`, `.json`, + `*.parts/`), das Aufrufverzeichnis und alles in `testdaten/`, `glossare/`, `tests/` + oder `fertig/`. + +| Option | Bedeutung | +|---|---| +| `ordner` | Arbeitsordner, z. B. `abschriften/` | +| `--ziel` | Verzeichnis für fertige Abschriften; Standard: `fertig` | +| `--glossare` | Verzeichnis der gemeinsamen Glossare; Standard: `glossare` | +| `--ja` | ohne Rückfrage löschen | +| `--trotzdem` | auch mit offenen Prüfmarken abschließen | + ## Testdaten **Im Repository:** `tests/daten/` enthält eine frei erfundene Beispielrede @@ -434,20 +515,29 @@ passendes Glossar (`beispiel.glossar.txt`) für die eingebauten Hörfehler wie ``` **Nur lokal:** Echte Reden gehören wegen des Urheberrechts nicht ins Repository; -`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`glossare/`). -Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und -ihre Glossare in `glossare/`, laufen zusätzlich die Tests, die diese Glossare -prüfen; sonst werden sie übersprungen: +`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare. Es enthält je Rede +einen Ordner mit unveränderlichen Eingaben, nie Ausgaben: -- `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `glossare/ramstein.glossar.txt`) -- `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `glossare/magdeburg.glossar.txt`) -- `Lahnstein.de-orig.*`: Rede „Respekt geht anders“ in Lahnstein (Glossar - `glossare/lahnstein.glossar.txt`, erstellt mit Hilfe von `glossar_vorschlag.py`), - zu laden mit - `./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d testdaten` +- `testdaten/ramstein/`: `ramstein.de.vtt`, `ramstein.de.txt`, `ramstein.glossar.txt` + (Rede über die US Air Base Ramstein) +- `testdaten/magdeburg/`: `magdeburg.de-orig.vtt`, `.txt`, `magdeburg.glossar.txt` + (Rede in Magdeburg) +- `testdaten/lahnstein/`: `Lahnstein.de-orig.vtt`, `.txt`, `lahnstein.glossar.txt` + (Rede „Respekt geht anders“, Glossar mit Hilfe von `glossar_vorschlag.py`), zu laden + mit `./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d testdaten/lahnstein` -Alle drei mit dem gemeinsamen `glossare/krone-schmalz.glossar.txt` davor. Ein Lauf über eine -Rede dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa 6–8 Minuten. +Liegen sie dort und `glossare/krone-schmalz.glossar.txt` daneben, laufen zusätzlich +die Tests, die diese Glossare prüfen; sonst werden sie übersprungen. Eine echte Rede +korrigiert man mit Ausgabe in einen Arbeitsordner, damit `testdaten/` sauber bleibt: + +```bash +./abschrift_korrigieren.py -i testdaten/ramstein/ramstein.de.txt \ + -g glossare/krone-schmalz.glossar.txt -g testdaten/ramstein/ramstein.glossar.txt \ + -o abschriften/ramstein.de/ramstein.de.korrigiert.txt +``` + +Ein Lauf über eine Rede dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa +6–8 Minuten. ## Tests @@ -457,9 +547,9 @@ python3 -m pytest Die Tests brauchen weder Ollama noch Netz: Modellaufrufe und `yt-dlp` werden durch Fakes ersetzt. Als Text dient die erfundene Beispielrede in `tests/daten/` (siehe -[Testdaten](#testdaten)). In einem frischen Klon laufen 318 Tests, 7 werden +[Testdaten](#testdaten)). In einem frischen Klon laufen 339 Tests, 7 werden übersprungen; sie prüfen die Glossare der echten Reden und laufen nur, wenn diese -lokal in `testdaten/` liegen (dann 325). +lokal in `testdaten/` liegen (dann 346). `tests/test_abschrift_korrigieren.py` prüft Abschnittsbildung, Satzgrenzen (Abkürzungen und Ordnungszahlen sind kein Satzende), Glossar (jede Ersetzung des @@ -467,7 +557,8 @@ Beispielglossars trifft die Beispielrede; lokal zusätzlich: jede Ersetzung im Glossar einer Rede trifft diese Rede, jede im gemeinsamen Glossar mindestens eine), Prompts (keine Namensteile ergänzen), Streaming-Auswertung, Absatzgliederung (Text bleibt unverändert, 3–10 Sätze), Verbinden kurzer Absätze (Modell wird nur gefragt, -wenn beide Nachbarn passen), Zwischenspeicher/Fortsetzen, Schutz von Handarbeit +wenn beide Nachbarn passen), Zwischenspeicher/Fortsetzen, Arbeitsordner, +Quellenangabe und automatisches Video-Glossar, Schutz von Handarbeit (`.neu.korrigiert.txt`, `--ueberschreiben`), Zeitauswahl, Sprachen und die Kommandozeile. `tests/test_glossar_vorschlag.py` prüft Filter (nur Funde im Text, keine bekannten), @@ -481,6 +572,9 @@ Die Tests nutzen eine kleine eigene Wortliste statt der des Systems. (Original-Audio, manuell vor automatisch) und Fehlerfälle. `tests/test_yt_untertitel.py` prüft Spurauswahl, Aufruf von `yt-dlp` und Fehlerfälle (ohne Netz, `yt-dlp` wird durch Fakes ersetzt). +`tests/test_abschliessen.py` prüft den Abschluss: Quellenkopf, mehrere Ausschnitte, +Abbruch bei Prüfmarken und Konflikten, nie überschreiben, Rückfrage, Schutz vor dem +Löschen fremder und geschützter Ordner und den Hinweis auf Video-Glossar-Einträge. `tests/test_vtt2txt.py` prüft die VTT-Umwandlung: die Beispiel-`.vtt` (und lokal jede Rede in `testdaten/`) ergibt genau die zugehörige `.txt`, echte Wiederholungen bleiben erhalten, auch bei Untertiteln ohne rollendes Fenster, dazu Zeitauswahl @@ -494,7 +588,9 @@ Verbinden kurzer Absätze wird in `.parts/` gespeichert. Ein erneuter Lauf überspringt alles, was schon berechnet ist. Ändern sich Modell (auch per `-m`), Prompt, Glossar oder Text eines Abschnitts, wird genau dieser Teil neu berechnet. Glossar-Begriffe stehen im Prompt; ein neuer Begriff -lässt deshalb alle Abschnitte neu korrigieren. Den Ordner kann man jederzeit löschen. +lässt deshalb alle Abschnitte neu korrigieren. Den Ordner kann man jederzeit löschen; +`abschliessen.py` löscht ihn mit dem Arbeitsordner. Er wächst sonst mit jeder +Prompt- oder Modelländerung, weil alte Fassungen liegen bleiben. `glossar_vorschlag.py` speichert seine Modellantworten ebenso in `.parts/`. @@ -530,6 +626,15 @@ In `vtt2txt.py`: | `MAX_SNAP_SECONDS` | 30 | so weit darf ein Zeitbereich bis zur nächsten Satzgrenze wachsen | | `ROLLING_SHARE` | 0.5 | ab diesem Anteil sich überlappender Blöcke gilt eine Datei als rollend | +In `yt_untertitel.py` und `abschliessen.py` (Pfade relativ zum Aufrufverzeichnis, also +im Programmordner aufrufen): + +| Konstante | Standard | Bedeutung | +|---|---|---| +| `WORK_DIR` | `abschriften` | Arbeitsordner je Video: `abschriften//` | +| `FINISHED_DIR` | `fertig` | abgeschlossene Abschriften (Option `--ziel`) | +| `GLOSSARY_DIR` | `glossare` | gemeinsame Glossare (Option `--glossare`) | + ## Bekannte Grenzen - Das Modell ändert gelegentlich Wörter eigenmächtig, auch sinnverändernd