docs: Dateiablage mit Arbeitsordnern, Abschluss und Video-Glossaren

README: neue Abschnitte „Dateiablage“ und „Abschluss: abschliessen.py“,
Standardpfade abschriften/<Name>/ in allen Beispielen und Optionstabellen,
gemeinsame und Video-Glossare, testdaten/<rede>/, Tests und Einstellungen.

Bedienungsanleitung: neuer Abschnitt 10 „Schritt 6: Abschließen und
aufräumen“ (folgende Abschnitte umnummeriert), Ablaufdiagramm und
Schnellstart mit Arbeitsordner und Abschluss, Glossar-Arten, Dateien je
Arbeitsordner, Hinweis „im Programmordner arbeiten“, Sicherung von
glossare/ und fertig/, Fehlermeldungen und Kurzreferenz von abschliessen.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 23:33:09 +02:00
commit 6f3eb23547
2 changed files with 373 additions and 131 deletions

View file

@ -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/<Name>/`, 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/<Name>/`),
3. speichert dort den Rohtext `<Name>.txt` und die Quellenangabe `<Name>.quelle.json`
(Titel, Kanal, Datum, URL),
4. korrigiert den Text abschnittsweise und gliedert ihn in Absätze,
5. schreibt das Ergebnis nach `<Name>.korrigiert.txt`
6. und den Änderungsbericht nach `<Name>.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/<Name>
# → fertig/<Name>.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/<Name>/<Name>.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 → <Name>.glossar.entwurf.txt
│ prüfen, übernehmen → <Name>.glossar.txt (Video-Glossar)
│ bzw. glossare/<sprecher>.glossar.txt
▼
│ Schritt 3: abschrift_korrigieren.py → rede.korrigiert.txt
│ rede.aenderungen.html
│ Schritt 3: abschrift_korrigieren.py → <Name>.korrigiert.txt
│ <Name>.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/<Name>.txt, Arbeitsordner gelöscht
▼
fertige Abschrift
```
Alle Dateien eines Videos liegen bis zum Abschluss in `abschriften/<Name>/`.
---
## 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/<Name>/<Name>.txt und <Name>.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/<Name>/` (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/<Name>/<Name>.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/<Name>/<Name>.txt -g glossare/krone-schmalz.glossar.txt
# Glossar glossare/krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen
# Glossar abschriften/<Name>/<Name>.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/<Name>/<Name>.txt -g glossare/krone-schmalz.glossar.txt
# → abschriften/<Name>/<Name>.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/<Name>/<Name>.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/<Name>/<Name>.txt -k abschriften/<Name>/<Name>.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/<Name>/<Name>.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 …/<Name>.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/<Name>/<Name>.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/<Name>
```
Was dabei passiert:
1. **Prüfen:** Gibt es noch `[prüfen: …]`-Marken im Text oder eine ungeklärte
`<Name>.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 `<Name>.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/<Name>/ Arbeitsordner, einer je Video
fertig/ abgeschlossene Abschriften, je eine Datei
testdaten/<rede>/ nur für Entwickler: echte Reden für Regressionstests
```
Im Arbeitsordner `abschriften/<Name>/`:
| 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 |
| `<Name>.txt` | Rohtext (bei `-u` automatisch gespeichert) | nie, wenn sie schon mit anderem Inhalt existiert (dann Warnung) |
| `<Name>.quelle.json` | Titel, Kanal, Datum, URL (beim Download) | ja, beim nächsten Download |
| `<Name>.glossar.txt` | Video-Glossar (legt man selbst an) | nie |
| `<Name>.korrigiert.txt` | korrigierte Abschrift | ja, außer sie wurde von Hand geändert (dann `<Name>.neu.korrigiert.txt`, siehe [Abschnitt 9](#9-schritt-5-nachbessern-und-erneut-laufen-lassen)) |
| `<Name>.aenderungen.html` | Änderungsbericht | ja, bei jedem Lauf |
| `<Name>.korrigiert.parts/` | Zwischenstände | wird ergänzt; darf jederzeit gelöscht werden |
| `<Name>.glossar.entwurf.txt` | Glossar-Entwurf von `glossar_vorschlag.py` | ja |
| `<Name>.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/<Name>.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 `<Ausgabe>.parts/` gespeichert.
@ -691,11 +800,12 @@ beim Verbinden kurzer Absätze wird sofort in `<Ausgabe>.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: <Name>.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: `<Eingabe>.korrigiert.txt` bzw. `<Kanal>_<Titel>_<Datum>.korrigiert.txt`) |
| `-o DATEI` | Ausgabedatei (Standard: `<Eingabe>.korrigiert.txt`, mit `-u` `abschriften/<Name>/<Name>.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: `<Kanal>_<Titel>_<Datum>.txt`) |
| `-o DATEI` | Ausgabedatei (Standard: `abschriften/<Name>/<Name>.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: `<Kanal>_<Titel>_<Datum>`) |
| `-n NAME` | Name von Datei und Arbeitsordner (Standard: `<Kanal>_<Titel>_<Datum>`) |
| `-l SPRACHE` | Sprache (Standard: `de`) |
| `-d VERZEICHNIS` | Zielverzeichnis (Standard: aktuelles) |
| `-d VERZEICHNIS` | Zielverzeichnis (Standard: `abschriften/<Name>/`) |
### `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/<Name>` (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/<Name>/<Name>.glossar.txt` verwenden
`abschrift_korrigieren.py`, `glossar_vorschlag.py` und `aenderungen.py` automatisch.
Jedes Programm zeigt mit `--help` seine Optionen.

193
README.md
View file

@ -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/<Name>/: <Name>.txt (Rohtext), <Name>.quelle.json,
# <Name>.korrigiert.txt, <Name>.aenderungen.html, <Name>.korrigiert.parts/
./abschliessen.py abschriften/<Name> # → fertig/<Name>.txt, Arbeitsordner nach Rückfrage gelöscht
```
`<Name>` ist `<Kanal>_<Titel>_<Datum>`, 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/<Name>/<Name>.txt
./abschrift_korrigieren.py -i abschriften/<Name>/<Name>.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 (`<sprache>-orig`) |
| `-o`, `--output` | Ausgabedatei (Verzeichnisse werden angelegt, vorhandene Datei überschrieben); Standard: `<Kanal>_<Titel>_<Datum>.txt`, siehe unten |
| `-o`, `--output` | Ausgabedatei (Verzeichnisse werden angelegt, vorhandene Datei überschrieben); Standard: `abschriften/<Name>/<Name>.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/<Name>/`:
| 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 `<Rohtext>.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 # → <Kanal>_<Titel>_<Datum>.de-orig.vtt
./yt_untertitel.py -u URL # → abschriften/<Name>/<Name>.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: `<Kanal>_<Titel>_<Datum>` |
| `-l`, `--lang` | Sprache; Standard: `de` |
| `-d`, `--dir` | Zielverzeichnis (wird angelegt); Standard: aktuelles Verzeichnis |
| `-d`, `--dir` | Zielverzeichnis (wird angelegt); Standard: Arbeitsordner `abschriften/<Name>/` |
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 → <Kanal>_<Titel>_<Datum>.korrigiert.txt
./abschrift_korrigieren.py -u URL # YouTube → abschriften/<Name>/<Name>.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 `<Name>.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: `<Eingabe ohne Endung>.korrigiert.txt` neben der Eingabe, mit `-u` `<Kanal>_<Titel>_<Datum>.korrigiert.txt`; mit `-z` zusätzlich die Bereiche im Namen |
| `-o`, `--output` | Ausgabedatei; Standard: `<Eingabe ohne Endung>.korrigiert.txt` neben der Eingabe, mit `-u` `abschriften/<Name>/<Name>.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/<Name>/ Arbeitsordner, einer je Video (auch für Ausschnitte)
<Name>.txt Rohtext
<Name>.quelle.json Titel, Kanal, Datum, URL
<Name>.glossar.txt Glossar nur dieses Videos (optional, automatisch genutzt)
<Name>[_bereiche].korrigiert.txt Ergebnis, darf von Hand nachbearbeitet werden
<Name>[_bereiche].aenderungen.html Änderungsbericht
<Name>[_bereiche].korrigiert.parts/ Zwischenstände
fertig/<Name>[_bereiche].txt abgeschlossene Abschriften mit Quellenkopf
testdaten/<rede>/ 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/<Name>.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/<Name>/<Name>.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 `<Entwurf>.parts/` zwischengespeichert.
## Abschluss: `abschliessen.py`
```bash
./abschliessen.py abschriften/<Name> # mit Rückfrage vor dem Löschen
./abschliessen.py abschriften/<Name> --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/<Name>[_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
<korrigierter Text>
```
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/<Name>` |
| `--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 `<Ausgabe>.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
`<Entwurf>.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/<Name>/` |
| `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