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) 7. [Schritt 3: Korrigieren](#7-schritt-3-korrigieren)
8. [Schritt 4: Ergebnis prüfen](#8-schritt-4-ergebnis-prüfen) 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) 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) 10. [Schritt 6: Abschließen und aufräumen](#10-schritt-6-abschließen-und-aufräumen)
11. [Englische Beiträge](#11-englische-beiträge) 11. [Nur Ausschnitte bearbeiten (Zeitauswahl)](#11-nur-ausschnitte-bearbeiten-zeitauswahl)
12. [Dateien, die entstehen](#12-dateien-die-entstehen) 12. [Englische Beiträge](#12-englische-beiträge)
13. [Zwischenstände, Abbruch und Fortsetzen](#13-zwischenstände-abbruch-und-fortsetzen) 13. [Dateien, die entstehen](#13-dateien-die-entstehen)
14. [Ein anderes Sprachmodell verwenden](#14-ein-anderes-sprachmodell-verwenden) 14. [Zwischenstände, Abbruch und Fortsetzen](#14-zwischenstände-abbruch-und-fortsetzen)
15. [Fehlermeldungen und Lösungen](#15-fehlermeldungen-und-lösungen) 15. [Ein anderes Sprachmodell verwenden](#15-ein-anderes-sprachmodell-verwenden)
16. [Tipps und häufige Fragen](#16-tipps-und-häufige-fragen) 16. [Fehlermeldungen und Lösungen](#16-fehlermeldungen-und-lösungen)
17. [Kurzreferenz aller Befehle](#17-kurzreferenz-aller-befehle) 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 | | `vtt2txt.py` | Untertiteldatei (`.vtt`) → Rohtext |
| `glossar_vorschlag.py` | Entwurf für ein Glossar (vermutete Hörfehler bei Namen und Begriffen) | | `glossar_vorschlag.py` | Entwurf für ein Glossar (vermutete Hörfehler bei Namen und Begriffen) |
| `aenderungen.py` | Änderungsbericht für vorhandene Dateien erstellen | | `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 Für den Normalfall braucht man nur `abschrift_korrigieren.py` und am Ende
Ergebnisse zusätzlich ein Glossar. `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 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 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. der Qualität.
### 2.3 Prüfen, ob alles bereit ist ### 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 …` ausführbar machen: `chmod +x *.py`. Alternativ immer `python3 programm.py …`
aufrufen. 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 ## 3. Schnellstart
@ -133,16 +144,25 @@ URLs die Shell.
Das Programm Das Programm
1. lädt die Untertitel in der Originalsprache des Videos, 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`, 2. legt den Arbeitsordner an, z. B.
3. korrigiert ihn abschnittsweise und gliedert ihn in Absätze, `abschriften/GGBLahnstein_Prof_Gabriele_Krone-Schmalz_Respekt_geht_anders_2026-07-30/`
4. schreibt das Ergebnis nach `…_2026-07-30.korrigiert.txt` (kurz `abschriften/<Name>/`),
5. und den Änderungsbericht nach `…_2026-07-30.aenderungen.html`. 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 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“** 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 ```bash
./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.korrigiert.txt ./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: Ergebnisse, auch den Änderungsbericht:
```bash ```bash
./abschrift_korrigieren.py -i tests/daten/beispiel.de.txt -g tests/daten/beispiel.glossar.txt -o beispiel.korrigiert.txt ./abschrift_korrigieren.py -i tests/daten/beispiel.de.txt -g tests/daten/beispiel.glossar.txt \
# → beispiel.korrigiert.txt, beispiel.aenderungen.html -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 ```text
YouTube-URL YouTube-URL
│ Schritt 1: extract_text.py → rede.txt (Rohtext) │ Schritt 1: extract_text.py → abschriften/<Name>/<Name>.txt (Rohtext)
▼ ▼
Rohtext ansehen Rohtext ansehen
│ Schritt 2: glossar_vorschlag.py → rede.glossar.entwurf.txt │ Schritt 2: glossar_vorschlag.py → <Name>.glossar.entwurf.txt
│ prüfen, übernehmen → glossare/rede.glossar.txt │ prüfen, übernehmen → <Name>.glossar.txt (Video-Glossar)
│ bzw. glossare/<sprecher>.glossar.txt
▼ ▼
│ Schritt 3: abschrift_korrigieren.py → rede.korrigiert.txt │ Schritt 3: abschrift_korrigieren.py → <Name>.korrigiert.txt
│ rede.aenderungen.html │ <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 │ 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 fertige Abschrift
``` ```
Alle Dateien eines Videos liegen bis zum Abschluss in `abschriften/<Name>/`.
--- ---
## 5. Schritt 1: Rohtext holen ## 5. Schritt 1: Rohtext holen
@ -191,7 +219,8 @@ fertige Abschrift
### 5.1 Von YouTube: `extract_text.py` ### 5.1 Von YouTube: `extract_text.py`
```bash ```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: 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“ … Lade automatische Untertitel „de-orig“ …
``` ```
Ohne `-o` entsteht ein Name aus Kanal, Titel und Datum (siehe Ohne `-o` entsteht ein Name aus Kanal, Titel und Datum, und die Datei kommt in den
[Abschnitt 12.2](#122-standard-dateinamen)). 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?** **Welche Untertitel werden genommen?**
@ -223,16 +254,19 @@ versteht `abschrift_korrigieren.py`.
Soll die Original-Untertiteldatei (`.vtt`, mit Zeitstempeln) erhalten bleiben: Soll die Original-Untertiteldatei (`.vtt`, mit Zeitstempeln) erhalten bleiben:
```bash ```bash
./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d untertitel ./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein
# → untertitel/Lahnstein.de-orig.vtt # → abschriften/Lahnstein/Lahnstein.de-orig.vtt (+ Lahnstein.quelle.json)
./vtt2txt.py -i untertitel/Lahnstein.de-orig.vtt ./vtt2txt.py -i abschriften/Lahnstein/Lahnstein.de-orig.vtt
# → untertitel/Lahnstein.de-orig.txt # → 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 Achtung: `yt_untertitel.py` nimmt ohne `-l` Deutsch (`de`), nicht die
Originalsprache. Für englische Videos `-l en` angeben. 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 mit vorhandenen Dateien. `abschrift_korrigieren.py` nimmt sie auch direkt, der
Zwischenschritt über `vtt2txt.py` ist dann nur nötig, um den Rohtext anzusehen Zwischenschritt über `vtt2txt.py` ist dann nur nötig, um den Rohtext anzusehen
oder ein Glossar daraus zu erstellen. 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 die Ersetzungen ohne Treffer. Bei einem Glossar für genau diesen Beitrag deutet
„ohne Treffer“ auf einen Tippfehler. „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 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 ```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 bleiben lokal.** Sie enthalten Namen realer Personen und Hörfehler realer
`glossare/krone-schmalz.glossar.txt` und `glossare/ramstein.glossar.txt`. Sie Beiträge und werden deshalb nicht ins Git-Repository übernommen (`glossare/`,
enthalten Namen realer Personen und Hörfehler realer Beiträge und werden deshalb `abschriften/` und `*.glossar.txt` stehen in `.gitignore`). `glossare/` deshalb
nicht ins Git-Repository übernommen: `glossare/` und jede Datei `*.glossar.txt` sind gesondert sichern (siehe [Abschnitt 17](#17-tipps-und-häufige-fragen)). Als Vorlage
über `.gitignore` ausgeschlossen und bleiben nur auf dem eigenen Rechner. Das ist eignet sich das kleine Glossar zur erfundenen Beispielrede in
gewollt; Glossare deshalb gesondert sichern. Einzige Ausnahme ist das kleine, `tests/daten/beispiel.glossar.txt`.
leicht nachvollziehbare Glossar zur erfundenen Beispielrede in
`tests/daten/beispiel.glossar.txt`, das sich gut als Vorlage eignet.
### 6.3 Entwurf vom Modell: `glossar_vorschlag.py` ### 6.3 Entwurf vom Modell: `glossar_vorschlag.py`
Statt den ganzen Rohtext zu lesen, kann das Modell einen ersten Entwurf liefern: Statt den ganzen Rohtext zu lesen, kann das Modell einen ersten Entwurf liefern:
```bash ```bash
./glossar_vorschlag.py -i rede.txt -g glossare/krone-schmalz.glossar.txt ./glossar_vorschlag.py -i abschriften/<Name>/<Name>.txt -g glossare/krone-schmalz.glossar.txt
# → rede.glossar.entwurf.txt # → abschriften/<Name>/<Name>.glossar.entwurf.txt
``` ```
Das Modell sucht abschnittsweise vermutete Hörfehler: Namen, Orte, Fremdwörter, 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: Ersetzung verdirbt den Text unbemerkt. Deshalb:
1. Jeden Eintrag prüfen, im Zweifel im Rohtext oder Video nachsehen. 1. Jeden Eintrag prüfen, im Zweifel im Rohtext oder Video nachsehen.
2. Brauchbare Zeilen ohne `# ? ` ins Glossar des Beitrags (oder ins gemeinsame) 2. Brauchbare Zeilen ohne `# ? ` ins Video-Glossar
kopieren. `abschriften/<Name>/<Name>.glossar.txt` (oder ins gemeinsame) kopieren.
3. Unsichere Namen lieber als **Begriff** (ohne `=>`) aufnehmen. 3. Unsichere Namen lieber als **Begriff** (ohne `=>`) aufnehmen.
Nach einem Korrekturlauf kann der Entwurf zusätzlich die Wörter auflisten, die das 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: möchte, und Fehlgriffe des Modells:
```bash ```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. Diese Einträge stehen in einem eigenen Abschnitt mit ihrer Anzahl, z. B.
@ -367,11 +412,12 @@ entfernen.
## 7. Schritt 3: Korrigieren ## 7. Schritt 3: Korrigieren
```bash ```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 Statt des Rohtexts geht auch die Untertiteldatei (`-i …/<Name>.de-orig.vtt`) oder
`-u URL` (direkt von YouTube). `-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 ### 7.1 Was das Programm tut
@ -401,7 +447,7 @@ Ein gekürztes Beispiel mit Erläuterungen:
Modell: qwen3:32b Modell: qwen3:32b
Sprache des Beitrags: de Sprache des Beitrags: de
Glossar glossare/krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen 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 2× „Willly Brand“ → „Willy Brandt“ ← feste Ersetzungen mit Treffern
Ersetzt 6× „Rammstein“ → „Ramstein“ Ersetzt 6× „Rammstein“ → „Ramstein“
13 Ersetzung(en) ohne Treffer: „Hostelchik“, … ← bei gemeinsamen Glossaren normal 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 `-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 mit `.vtt`-Dateien, nicht mit reinem Text (der hat keine Zeitstempel). Dieselbe
Option kennen `extract_text.py` und `vtt2txt.py`. Option kennen `extract_text.py` und `vtt2txt.py`.
### 10.1 Zeitangaben ### 11.1 Zeitangaben
| Angabe | Bedeutung | | 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 > Reicht ein Bereich über das Ende des Videos hinaus, weist das Programm darauf hin
> und nennt die Länge der Untertitel. > und nennt die Länge der Untertitel.
### 10.2 Bereiche ### 11.2 Bereiche
| Aufruf | Bearbeitet | | 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 ./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 Alle Bereiche landen in **einer** Datei, jeder mit einer Überschrift, die seine
tatsächlichen Zeiten nennt: 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 Mit `-u` erkennt das Programm die Sprache des Videos selbst. Bei Dateien die
Sprache angeben: 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? | | Datei | Inhalt | Wird überschrieben? |
|---|---|---| |---|---|---|
| `rede.txt` | Rohtext (bei `-u` automatisch gespeichert) | nie, wenn sie schon mit anderem Inhalt existiert (dann Warnung) | | `<Name>.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)) | | `<Name>.quelle.json` | Titel, Kanal, Datum, URL (beim Download) | ja, beim nächsten Download |
| `rede.aenderungen.html` | Änderungsbericht | ja, bei jedem Lauf | | `<Name>.glossar.txt` | Video-Glossar (legt man selbst an) | nie |
| `rede.korrigiert.parts/` | Zwischenstände | wird ergänzt; darf jederzeit gelöscht werden | | `<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)) |
| `rede.glossar.entwurf.txt` | Glossar-Entwurf von `glossar_vorschlag.py` | ja | | `<Name>.aenderungen.html` | Änderungsbericht | ja, bei jedem Lauf |
| `rede.glossar.entwurf.parts/` | Zwischenstände des Entwurfs | wird ergänzt | | `<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 Ausschnitte (`-z`) desselben Videos landen im selben Ordner, mit den Bereichen im
aktuellen Verzeichnis. Fehlende Verzeichnisse in `-o` werden angelegt. 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 ### 13.2 Standard-Dateinamen
und Hochladedatum**:
Ohne `-o` (bzw. `-n` bei `yt_untertitel.py`) entsteht der Name des Arbeitsordners
und der Dateien aus **Kanal, Titel und Hochladedatum**:
| Video | Name | | 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 Jeder fertig korrigierte Abschnitt, jede Absatzgliederung und jede Entscheidung
beim Verbinden kurzer Absätze wird sofort in `<Ausgabe>.parts/` gespeichert. 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 - Ändern sich Modell, Anweisung, Glossar oder der Text eines Abschnitts, wird genau
dieser Teil neu berechnet; alte Zwischenstände stören nicht. dieser Teil neu berechnet; alte Zwischenstände stören nicht.
- Der Ordner `*.parts/` darf jederzeit gelöscht werden; dann wird alles neu - 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 ```bash
ollama pull qwen3:14b 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 | | 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. | | `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. | | `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 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 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. | | `Die Eingabedatei ist leer.` | Datei prüfen. |
| `Ausgabedatei darf nicht die Eingabedatei sein.` | Mit `-o` einen anderen Namen wählen. | | `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 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: 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. | | `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. | | `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). | | 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?** **Wie bekomme ich die besten Ergebnisse?**
Mit einem guten Glossar. Das Modell kennt viele Namen nicht oder schreibt sie 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 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?** **Wo sind die Absätze?**
In `*.korrigiert.txt` trennt eine Leerzeile die Absätze. Viele Textprogramme In `*.korrigiert.txt` trennt eine Leerzeile die Absätze. Viele Textprogramme
übernehmen das beim Einfügen direkt. übernehmen das beim Einfügen direkt.
**Kann ich das Ergebnis weiterverarbeiten (Word, LibreOffice)?** **Kann ich das Ergebnis weiterverarbeiten (Word, LibreOffice)?**
Die `.korrigiert.txt` ist reiner UTF-8-Text und lässt sich überall öffnen oder Die Dateien in `fertig/` (und die `.korrigiert.txt`) sind reiner UTF-8-Text und
einfügen. lassen sich überall öffnen oder einfügen.
--- ---
## 17. Kurzreferenz aller Befehle ## 18. Kurzreferenz aller Befehle
### `abschrift_korrigieren.py` ### `abschrift_korrigieren.py`
@ -795,7 +920,7 @@ einfügen.
|---|---| |---|---|
| `-i DATEI` | Eingabe: Rohtext (`.txt`) oder Untertitel (`.vtt`) | | `-i DATEI` | Eingabe: Rohtext (`.txt`) oder Untertitel (`.vtt`) |
| `-u URL` | statt `-i`: YouTube-Video laden und korrigieren | | `-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) | | `-g DATEI` | Glossar, mehrfach möglich (Reihenfolge zählt) |
| `-l SPRACHE` | `de` oder `en` (Standard: `de`, mit `-u` die Originalsprache) | | `-l SPRACHE` | `de` oder `en` (Standard: `de`, mit `-u` die Originalsprache) |
| `-m MODELL` | Ollama-Modell (Standard: `qwen3:32b`) | | `-m MODELL` | Ollama-Modell (Standard: `qwen3:32b`) |
@ -809,7 +934,7 @@ einfügen.
| Option | Bedeutung | | Option | Bedeutung |
|---|---| |---|---|
| `-u URL` | YouTube-URL (Pflicht) | | `-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) | | `-l SPRACHE` | Sprache der Untertitel (Standard: Originalsprache) |
| `-f` | Fließtext mit 80 Zeichen pro Zeile | | `-f` | Fließtext mit 80 Zeichen pro Zeile |
| `-z BEREICH …`, `--exakt` | Zeitauswahl wie oben | | `-z BEREICH …`, `--exakt` | Zeitauswahl wie oben |
@ -819,9 +944,9 @@ einfügen.
| Option | Bedeutung | | Option | Bedeutung |
|---|---| |---|---|
| `-u URL` | YouTube-URL (Pflicht) | | `-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`) | | `-l SPRACHE` | Sprache (Standard: `de`) |
| `-d VERZEICHNIS` | Zielverzeichnis (Standard: aktuelles) | | `-d VERZEICHNIS` | Zielverzeichnis (Standard: `abschriften/<Name>/`) |
### `vtt2txt.py` ### `vtt2txt.py`
@ -851,4 +976,16 @@ einfügen.
| `-g DATEI` | Glossare der Korrektur, mehrfach möglich | | `-g DATEI` | Glossare der Korrektur, mehrfach möglich |
| `-l SPRACHE` | Sprache für die Wortliste (Standard: `de`) | | `-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. 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 | | `abschrift_korrigieren.py` | Rohabschrift (oder VTT direkt) mit dem Sprachmodell korrigieren |
| `aenderungen.py` | Änderungsbericht: was hat das Modell gegenüber dem Rohtext geändert? | | `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 | | `glossar_vorschlag.py` | Glossar-Entwurf: vermutete Hörfehler bei Namen und Begriffen |
| `abschliessen.py` | fertige Abschrift mit Quellenangabe nach `fertig/`, Arbeitsordner löschen |
## Voraussetzungen ## Voraussetzungen
@ -41,26 +42,31 @@ der Lauf wird etwa 12-mal langsamer.
## Aufruf ## 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 ```bash
./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.korrigiert.txt ./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -g glossare/krone-schmalz.glossar.txt
# → lahnstein.korrigiert.txt, lahnstein.txt (Rohtext), lahnstein.aenderungen.html # → 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: Oder in zwei Schritten, um den Rohtext vorher anzusehen:
```bash ```bash
./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.txt ./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' # → abschriften/<Name>/<Name>.txt
./abschrift_korrigieren.py -i lahnstein.txt # → lahnstein.korrigiert.txt ./abschrift_korrigieren.py -i abschriften/<Name>/<Name>.txt # Ergebnis im selben Ordner
``` ```
Dasselbe in Einzelschritten, wenn die VTT-Datei erhalten bleiben soll: Dasselbe in Einzelschritten, wenn die VTT-Datei erhalten bleiben soll:
```bash ```bash
./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d untertitel ./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein
./vtt2txt.py -i untertitel/Lahnstein.de-orig.vtt # → abschriften/Lahnstein/Lahnstein.de-orig.vtt
./abschrift_korrigieren.py -i untertitel/Lahnstein.de-orig.txt ./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 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 ```bash
./extract_text.py -u 'https://www.youtube.com/watch?v=0LmCveTM788' ./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 -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 -f -o rede.txt # lesbarer Fließtext
./extract_text.py -u URL -z 0:03:17-0:05:25 # nur ein Ausschnitt ./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 | | `-u`, `--url` | YouTube-URL, Pflicht |
| `-l`, `--lang` | Sprache; Standard: Sprache des Original-Audios (`<sprache>-orig`) | | `-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) | | `-z`, `--zeitraeume` | nur Untertitel in diesen Bereichen, siehe [Zeitauswahl](#zeitauswahl--z) |
| `--exakt` | genau an den Zeiten schneiden statt an Satzgrenzen | | `--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` | | `-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 ### Standard-Dateinamen für YouTube-Videos
Ohne `-o` bzw. `-n` bilden `extract_text.py`, `yt_untertitel.py` und 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 | | 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. 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_…`; `…_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`). 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 Gleiches Video ergibt immer denselben Namen und denselben Ordner, Ausschnitte
überschrieben (ein mit `-u` gespeicherter, abweichender Rohtext aber nie). 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` ### 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`. Region gefunden: `-l en` findet manuelle Untertitel `en-US`.
```bash ```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 ./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 | | `-u`, `--url` | YouTube-URL, Pflicht |
| `-n`, `--name` | Dateiname ohne Endung; Standard: `<Kanal>_<Titel>_<Datum>` | | `-n`, `--name` | Dateiname ohne Endung; Standard: `<Kanal>_<Titel>_<Datum>` |
| `-l`, `--lang` | Sprache; Standard: `de` | | `-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. 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/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.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 -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 -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 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 ./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) | | `-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 | | `-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 | | `-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 | | `-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 | | `--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`) | | `-m`, `--model` | Ollama-Modell; Standard: `qwen3:32b` (Konstante `MODEL`) |
| `--kein-bericht` | keinen Änderungsbericht schreiben | | `--kein-bericht` | keinen Änderungsbericht schreiben |
| `--ueberschreiben` | Ausgabedatei auch ersetzen, wenn sie seit dem letzten Lauf von Hand geändert wurde | | `--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 (`.txt`) mit solchen Überschriften, etwa von `vtt2txt.py -z`, wird ebenso in
Blöcken korrigiert. 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 ## Ablauf
0. **Vorprüfung:** Läuft Ollama, ist das Modell installiert? Sonst Abbruch mit 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 einzelnen Beitrag deutet das auf einen Tippfehler hin, bei einem gemeinsamen Glossar ist
es normal. es normal.
Mehrere Glossare lassen sich kombinieren: ein gemeinsames für wiederkehrende Namen Es gibt zwei Arten von Glossaren:
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.
Glossare liegen im Verzeichnis `glossare/`. Sie gehören zu realen Beiträgen und - **Gemeinsame Glossare** für wiederkehrende Namen und Hörfehler eines Redners oder
Personen und werden deshalb nicht versioniert: `glossare/` und `*.glossar.txt` stehen Kanals liegen in `glossare/`, z. B. `glossare/krone-schmalz.glossar.txt`. Sie werden
in `.gitignore`, die Glossare bleiben nur lokal und sollten gesondert gesichert mit `-g` angegeben.
werden. Im Repository ist als Beispiel nur `tests/daten/beispiel.glossar.txt` zur - **Video-Glossare** gelten nur für ein Video und liegen in dessen Arbeitsordner,
erfundenen Beispielrede. 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` ### 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 Brauchbares ins Glossar des Beitrags (oder ins gemeinsame) übernehmen. Die Modellantworten
werden in `<Entwurf>.parts/` zwischengespeichert. 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 ## Testdaten
**Im Repository:** `tests/daten/` enthält eine frei erfundene Beispielrede **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; **Nur lokal:** Echte Reden gehören wegen des Urheberrechts nicht ins Repository;
`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`glossare/`). `testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare. Es enthält je Rede
Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und einen Ordner mit unveränderlichen Eingaben, nie Ausgaben:
ihre Glossare in `glossare/`, laufen zusätzlich die Tests, die diese Glossare
prüfen; sonst werden sie übersprungen:
- `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `glossare/ramstein.glossar.txt`) - `testdaten/ramstein/`: `ramstein.de.vtt`, `ramstein.de.txt`, `ramstein.glossar.txt`
- `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `glossare/magdeburg.glossar.txt`) (Rede über die US Air Base Ramstein)
- `Lahnstein.de-orig.*`: Rede „Respekt geht anders“ in Lahnstein (Glossar - `testdaten/magdeburg/`: `magdeburg.de-orig.vtt`, `.txt`, `magdeburg.glossar.txt`
`glossare/lahnstein.glossar.txt`, erstellt mit Hilfe von `glossar_vorschlag.py`), (Rede in Magdeburg)
zu laden mit - `testdaten/lahnstein/`: `Lahnstein.de-orig.vtt`, `.txt`, `lahnstein.glossar.txt`
`./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d testdaten` (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 Liegen sie dort und `glossare/krone-schmalz.glossar.txt` daneben, laufen zusätzlich
Rede dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa 6–8 Minuten. 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 ## Tests
@ -457,9 +547,9 @@ python3 -m pytest
Die Tests brauchen weder Ollama noch Netz: Modellaufrufe und `yt-dlp` werden durch 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 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 ü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 `tests/test_abschrift_korrigieren.py` prüft Abschnittsbildung, Satzgrenzen
(Abkürzungen und Ordnungszahlen sind kein Satzende), Glossar (jede Ersetzung des (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), Glossar einer Rede trifft diese Rede, jede im gemeinsamen Glossar mindestens eine),
Prompts (keine Namensteile ergänzen), Streaming-Auswertung, Absatzgliederung (Text Prompts (keine Namensteile ergänzen), Streaming-Auswertung, Absatzgliederung (Text
bleibt unverändert, 3–10 Sätze), Verbinden kurzer Absätze (Modell wird nur gefragt, 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 (`.neu.korrigiert.txt`, `--ueberschreiben`), Zeitauswahl, Sprachen und die
Kommandozeile. Kommandozeile.
`tests/test_glossar_vorschlag.py` prüft Filter (nur Funde im Text, keine bekannten), `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. (Original-Audio, manuell vor automatisch) und Fehlerfälle.
`tests/test_yt_untertitel.py` prüft Spurauswahl, Aufruf von `yt-dlp` und `tests/test_yt_untertitel.py` prüft Spurauswahl, Aufruf von `yt-dlp` und
Fehlerfälle (ohne Netz, `yt-dlp` wird durch Fakes ersetzt). 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 `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 jede Rede in `testdaten/`) ergibt genau die zugehörige `.txt`, echte Wiederholungen
bleiben erhalten, auch bei Untertiteln ohne rollendes Fenster, dazu Zeitauswahl 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. Lauf überspringt alles, was schon berechnet ist.
Ändern sich Modell (auch per `-m`), Prompt, Glossar oder Text eines Abschnitts, wird Ä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 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 `glossar_vorschlag.py` speichert seine Modellantworten ebenso in
`<Entwurf>.parts/`. `<Entwurf>.parts/`.
@ -530,6 +626,15 @@ In `vtt2txt.py`:
| `MAX_SNAP_SECONDS` | 30 | so weit darf ein Zeitbereich bis zur nächsten Satzgrenze wachsen | | `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 | | `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 ## Bekannte Grenzen
- Das Modell ändert gelegentlich Wörter eigenmächtig, auch sinnverändernd - Das Modell ändert gelegentlich Wörter eigenmächtig, auch sinnverändernd