refactor: rede_korrigieren.py → abschrift_korrigieren.py, Texte neutral

Das Programm verarbeitet beliebige gesprochene Beiträge (Reden, Vorträge,
Interviews, Videos). Prompts und Texte sprechen von „Beitrag“ statt „Rede“;
README-Titel passend zum Projektverzeichnis youtube_abschrift_korrigieren.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 20:52:02 +02:00
commit 5a59baef88

View file

@ -1,8 +1,10 @@
# youtube_rede_korrigieren
# youtube_abschrift_korrigieren
Korrigiert automatische Abschriften deutscher (und englischer) Reden (z. B.
YouTube-Untertitel als Text) mit einem lokalen Sprachmodell über Ollama: Rechtschreibung, Satzzeichen,
Korrigiert automatische Abschriften gesprochener Beiträge – Reden, Vorträge,
Interviews, Videos, auf Deutsch oder Englisch (z. B. YouTube-Untertitel als Text) –
mit einem lokalen Sprachmodell über Ollama: Rechtschreibung, Satzzeichen,
Hörfehler, Absätze – möglichst wortgetreu, ohne Zusammenfassung oder Glättung.
Das Hauptprogramm ist `abschrift_korrigieren.py`.
Die Werkzeuge sind einzeln oder hintereinander nutzbar:
@ -11,7 +13,7 @@ Die Werkzeuge sind einzeln oder hintereinander nutzbar:
| `extract_text.py` | YouTube-URL → Textdatei in einem Schritt (die beiden folgenden zusammen) |
| `yt_untertitel.py` | Untertitel eines YouTube-Videos als VTT herunterladen |
| `vtt2txt.py` | VTT in eine Rohabschrift (Text) umwandeln |
| `rede_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? |
| `glossar_vorschlag.py` | Glossar-Entwurf: vermutete Hörfehler bei Namen und Begriffen |
@ -21,7 +23,7 @@ Die Werkzeuge sind einzeln oder hintereinander nutzbar:
- für den Download: [yt-dlp](https://github.com/yt-dlp/yt-dlp) (`pip install yt-dlp`)
- Ollama auf `127.0.0.1:11434` mit dem Modell `qwen3:32b`
(`ollama pull qwen3:32b`)
`rede_korrigieren.py` und `glossar_vorschlag.py` prüfen beides vor dem Start und
`abschrift_korrigieren.py` und `glossar_vorschlag.py` prüfen beides vor dem Start und
brechen sonst mit einem Hinweis ab (`sudo systemctl start ollama` bzw. `ollama pull …`)
Für gute Geschwindigkeit muss das Modell komplett in den Grafikspeicher passen.
@ -34,7 +36,7 @@ der Lauf wird etwa 12-mal langsamer.
Von der YouTube-URL zum korrigierten Text in einem Befehl:
```bash
./rede_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
# → lahnstein.korrigiert.txt, lahnstein.txt (Rohtext), lahnstein.aenderungen.html
```
@ -42,7 +44,7 @@ Oder in zwei Schritten, um den Rohtext vorher anzusehen:
```bash
./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.txt
./rede_korrigieren.py -i lahnstein.txt # → lahnstein.korrigiert.txt
./abschrift_korrigieren.py -i lahnstein.txt # → lahnstein.korrigiert.txt
```
Dasselbe in Einzelschritten, wenn die VTT-Datei erhalten bleiben soll:
@ -50,10 +52,10 @@ 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 testdaten
./vtt2txt.py -i testdaten/Lahnstein.de-orig.vtt
./rede_korrigieren.py -i testdaten/Lahnstein.de-orig.txt
./abschrift_korrigieren.py -i testdaten/Lahnstein.de-orig.txt
```
Der Schritt über `vtt2txt.py` ist optional: `rede_korrigieren.py` nimmt auch die
Der Schritt über `vtt2txt.py` ist optional: `abschrift_korrigieren.py` nimmt auch die
`.vtt` direkt. Die `.txt` lohnt sich, um den Rohtext anzusehen oder ein Glossar
daraus zu erstellen.
@ -70,7 +72,7 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei
./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 00:05-00:06 00:10-00:12 00:25 # mehrere Bereiche
./rede_korrigieren.py -i rede.txt # → rede.korrigiert.txt
./abschrift_korrigieren.py -i rede.txt # → rede.korrigiert.txt
```
| Option | Bedeutung |
@ -80,12 +82,12 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei
| `-o`, `--output` | Ausgabedatei (Verzeichnisse werden angelegt, vorhandene Datei überschrieben); Standard: `<Kanal>_<Titel>_<Datum>.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 `rede_korrigieren.py` |
| `-f`, `--fliesstext` | Fließtext, auf 80 Zeichen umbrochen (Wörter werden nie getrennt), statt der kurzen Untertitelzeilen; beides versteht `abschrift_korrigieren.py` |
### Standard-Dateinamen für YouTube-Videos
Ohne `-o` bzw. `-n` bilden `extract_text.py`, `yt_untertitel.py` und
`rede_korrigieren.py -u` den Namen aus Kanal, Titel und Hochladedatum:
`abschrift_korrigieren.py -u` den Namen aus Kanal, Titel und Hochladedatum:
| Video | Name |
|---|---|
@ -136,7 +138,7 @@ Eine vorhandene Datei gleichen Namens wird überschrieben.
### Untertitel umwandeln: `vtt2txt.py`
Macht aus VTT-Untertiteln (z. B. von `yt-dlp --write-auto-subs`) die Rohabschrift
für `rede_korrigieren.py`: Zeitstempel und Tags werden entfernt. YouTube-Auto-Untertitel
für `abschrift_korrigieren.py`: Zeitstempel und Tags werden entfernt. YouTube-Auto-Untertitel
zeigen ein rollendes Fenster, jeder Block wiederholt das Ende des vorigen. Übernommen
wird nur, was nach dieser Überlappung neu ist; sagt der Redner eine Zeile wirklich
zweimal, bleibt sie zweimal erhalten.
@ -160,7 +162,7 @@ zweimal, bleibt sie zweimal erhalten.
#### Zeitauswahl (`-z`)
Gilt gleich für `vtt2txt.py`, `extract_text.py` und `rede_korrigieren.py`.
Gilt gleich für `vtt2txt.py`, `extract_text.py` und `abschrift_korrigieren.py`.
| Zeit | Bedeutung |
|---|---|
@ -206,25 +208,25 @@ Der Dateiname enthält immer die angegebenen Zeiten.
Eine fehlerhafte Datei (keine Untertitel, nicht UTF-8) wird gemeldet, die übrigen
werden trotzdem umgewandelt; der Exit-Code ist dann 1.
### Abschrift korrigieren: `rede_korrigieren.py`
### Abschrift korrigieren: `abschrift_korrigieren.py`
```bash
./rede_korrigieren.py -i rede.txt # → rede.korrigiert.txt
./rede_korrigieren.py -i rede.txt -o out/rede.txt # eigene Ausgabedatei
./rede_korrigieren.py -i rede.txt -g rede.glossar.txt # mit Glossar
./rede_korrigieren.py -i rede.txt -g allgemein.glossar.txt -g rede.glossar.txt # kombiniert
./rede_korrigieren.py -i rede.de.vtt # VTT direkt → rede.de.korrigiert.txt
./rede_korrigieren.py -u URL # YouTube → <Kanal>_<Titel>_<Datum>.korrigiert.txt
./rede_korrigieren.py -i speech.txt -l en # englische Rede
./rede_korrigieren.py -u URL -z 0:03:17-0:05:25 # nur ein Ausschnitt des Videos
./rede_korrigieren.py -u URL -z 00:05-00:06 00:25 # mehrere Bereiche, eine Datei
./abschrift_korrigieren.py -i rede.txt # → rede.korrigiert.txt
./abschrift_korrigieren.py -i rede.txt -o out/rede.txt # eigene Ausgabedatei
./abschrift_korrigieren.py -i rede.txt -g rede.glossar.txt # mit Glossar
./abschrift_korrigieren.py -i rede.txt -g allgemein.glossar.txt -g 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 -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
```
| Option | Bedeutung |
|---|---|
| `-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 der Rede: `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 |
| `-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 |
@ -260,13 +262,13 @@ Zweifelhafte Stellen markiert das Modell als `Lesart [prüfen: Originalwortlaut]
in englischen Reden als `reading [check: original wording]`.
Englische Reden bekommen eigene, englische Prompts für Korrektur und Absätze
(`SYSTEM_EN` usw. in `rede_korrigieren.py`); dort entfernt das Modell auch die
(`SYSTEM_EN` usw. in `abschrift_korrigieren.py`); dort entfernt das Modell auch die
Sprecherwechsel-Marken `>>` der YouTube-Auto-Untertitel. Weitere Sprachen lassen sich
über das Wörterbuch `PROMPTS` ergänzen.
## Änderungsbericht
Jeder Lauf von `rede_korrigieren.py` schreibt neben die Ausgabe
Jeder Lauf von `abschrift_korrigieren.py` schreibt neben die Ausgabe
`<Name>.aenderungen.html` (aus `rede.korrigiert.txt` wird `rede.aenderungen.html`)
und zeigt die häufigsten Änderungen in der Konsole. Der Bericht enthält:
@ -299,12 +301,12 @@ Multi-Domain Task Force
Michael Gorbatschow (Vorname so belassen)
```
Ersetzungen ohne Treffer werden gesammelt gemeldet. Bei einem Glossar für eine
einzelne Rede deutet das auf einen Tippfehler hin, bei einem gemeinsamen Glossar ist
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 und eines je Rede. Beispiel zu den Testdaten:
und Hörfehler eines Redners oder Kanals und eines je Beitrag. Beispiel zu den Testdaten:
`krone-schmalz.glossar.txt` (gemeinsam) plus `ramstein.glossar.txt`,
`magdeburg.glossar.txt` bzw. `lahnstein.glossar.txt`. Das gemeinsame Glossar zuerst angeben, damit seine
Ersetzungen vor den speziellen greifen. Ein weiteres Kanal-Glossar:
@ -347,7 +349,7 @@ Roh- und korrigiertem Text entfernt; das Modell bekommt sie nicht zu sehen.
| `-m`, `--model` | Ollama-Modell; Standard: `qwen3:32b` |
Der Entwurf ist ein Ausgangspunkt, kein fertiges Glossar: jeden Eintrag prüfen,
Brauchbares ins Glossar der Rede (oder ins gemeinsame) übernehmen. Die Modellantworten
Brauchbares ins Glossar des Beitrags (oder ins gemeinsame) übernehmen. Die Modellantworten
werden in `<Entwurf>.parts/` zwischengespeichert.
## Testdaten
@ -365,7 +367,7 @@ Alle drei mit dem gemeinsamen `krone-schmalz.glossar.txt` davor.
```bash
./vtt2txt.py -i "testdaten/*.vtt" # erzeugt alle .txt neu
./rede_korrigieren.py -i testdaten/ramstein.de.txt -g krone-schmalz.glossar.txt -g ramstein.glossar.txt
./abschrift_korrigieren.py -i testdaten/ramstein.de.txt -g krone-schmalz.glossar.txt -g ramstein.glossar.txt
# → testdaten/ramstein.de.korrigiert.txt (nicht versioniert)
```
@ -402,7 +404,7 @@ Teil neu berechnet. Den Ordner kann man jederzeit löschen.
## Einstellungen
Oben in `rede_korrigieren.py`:
Oben in `abschrift_korrigieren.py`:
| Konstante | Standard | Bedeutung |
|---|---|---|