# youtube_rede_korrigieren Korrigiert automatische Abschriften deutscher Reden (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. ## Voraussetzungen - Python 3 (nur Standardbibliothek) - Ollama auf `127.0.0.1:11434` mit dem Modell `qwen3:32b` (`ollama pull qwen3:32b`) Für gute Geschwindigkeit muss das Modell komplett in den Grafikspeicher passen. Mit `OLLAMA_NUM_PARALLEL=1` braucht `qwen3:32b` bei 16k Kontext rund 24 GB (eine RTX 3090). Bei `OLLAMA_NUM_PARALLEL=4` landet ein Drittel auf der CPU und der Lauf wird etwa 12-mal langsamer. ## Aufruf ### 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 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. ```bash ./vtt2txt.py -i rede.de.vtt # → rede.de.txt ./vtt2txt.py -i ramstein.de*.vtt # mehrere Dateien, je → *.txt ./vtt2txt.py -i "ramstein.de*.vtt" # Muster löst das Programm auf (Windows) ./vtt2txt.py -i rede.de.vtt -o out/rede.txt # eigene Ausgabedatei ./vtt2txt.py -i *.vtt -o out/ # alle in ein Verzeichnis ``` | Option | Bedeutung | |---|---| | `-i`, `--input` | eine oder mehrere VTT-Dateien oder Muster, Pflicht | | `-o`, `--output` | Ausgabedatei (nur bei einer Eingabedatei) oder Verzeichnis (vorhanden oder mit `/` am Ende); Standard: `.txt` neben der Eingabe | 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` ```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.de.vtt # VTT direkt → rede.de.korrigiert.txt ``` | Option | Bedeutung | |---|---| | `-i`, `--input` | Eingabedatei: Rohabschrift (`.txt`) oder Untertitel (`.vtt`, wird wie mit `vtt2txt.py` umgewandelt), Pflicht | | `-o`, `--output` | Ausgabedatei; Standard: `.korrigiert.txt` neben der Eingabe | | `-g`, `--glossar` | Glossar mit festen Ersetzungen und Schreibweisen | ## Ablauf 1. **Fließtext:** Untertitel-Zeilenumbrüche werden entfernt. 2. **Feste Ersetzungen** aus dem Glossar (`falsch => richtig`) werden im Rohtext angewendet, bevor das Modell ihn sieht. 3. **Korrektur:** Der Text wird in Abschnitte von ca. 1200 Wörtern geteilt (immer am Satzende) und abschnittsweise vom Modell korrigiert. Fortschritt wird live angezeigt. 4. **Wortzahl-Prüfung:** Weicht die Wortzahl eines Abschnitts um mehr als 5 % ab, gibt es eine Warnung (mögliche Auslassungen oder Ergänzungen). 5. **Absätze:** Das Modell nennt nur Satznummern, an denen ein Absatz beginnt; der Text selbst wird dabei nicht verändert. Absätze über 10 Sätze werden nochmals geteilt, Absätze unter 3 Sätzen mit dem Nachbarn verbunden. Zweifelhafte Stellen markiert das Modell als `Lesart [prüfen: Originalwortlaut]`. ## Glossar Eine Zeile pro Eintrag, `#` leitet Kommentare ein: ```text # feste Ersetzung (ganze Wörter, Groß-/Kleinschreibung zählt, Reihenfolge = Datei) Willly Brand => Willy Brandt Kremmel => Kreml # Hinweis fürs Modell (korrekte Schreibweise) Multi-Domain Task Force ``` Ersetzungen ohne Treffer werden gemeldet (Tippfehler im Glossar). `ramstein.glossar.txt` ist ein Beispiel für eine Rede über die US Air Base Ramstein. ## Testdaten `testdaten/` enthält eine Rede über die US Air Base Ramstein: - `ramstein.de.vtt`: automatische YouTube-Untertitel (Original) - `ramstein.de.txt`: daraus gewonnener Rohtext (Eingabe für das Programm) ```bash ./vtt2txt.py -i testdaten/ramstein.de.vtt # erzeugt testdaten/ramstein.de.txt neu ./rede_korrigieren.py -i testdaten/ramstein.de.txt -g ramstein.glossar.txt # → testdaten/ramstein.de.korrigiert.txt (nicht versioniert) ``` Ein Lauf dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa 6 Minuten. ## Tests ```bash python3 -m pytest ``` Die Tests brauchen kein Ollama: Modellaufrufe werden durch Fakes ersetzt. Geprüft werden Abschnittsbildung, Glossar (inkl. „jede Ersetzung in `ramstein.glossar.txt` trifft die Testdaten“), Streaming-Auswertung, Absatzgliederung (Text bleibt unverändert, 3–10 Sätze), Zwischenspeicher/Fortsetzen und die Kommandozeile. `tests/test_vtt2txt.py` prüft die VTT-Umwandlung: `testdaten/ramstein.de.vtt` ergibt genau `testdaten/ramstein.de.txt`, echte Wiederholungen bleiben erhalten, dazu Muster, Ausgabeverzeichnis und Fehlerfälle. ## Zwischenstände Jeder fertige Abschnitt und jede Absatzgliederung wird in `.parts/` gespeichert. Ein erneuter Lauf überspringt alles, was schon berechnet ist. Ändern sich Modell, Prompt, Glossar oder Text eines Abschnitts, wird genau dieser Teil neu berechnet. Den Ordner kann man jederzeit löschen. ## Einstellungen Oben in `rede_korrigieren.py`: | Konstante | Standard | Bedeutung | |---|---|---| | `MODEL` | `qwen3:32b` | Ollama-Modell | | `CHUNK_SIZE` | 1200 | Wörter pro Korrekturabschnitt | | `MAX_WORD_DEVIATION` | 0.05 | Warnschwelle Wortzahl | | `MAX_PARAGRAPH_SENTENCES` | 10 | längster erlaubter Absatz | | `MIN_PARAGRAPH_SENTENCES` | 3 | kürzester gewünschter Absatz | ## Bekannte Grenzen - `qwen3:32b` ohne Denkmodus erkennt Hörfehler ohne Glossar nur teilweise und setzt kaum `[prüfen: …]`-Marken. Bekannte Fehler gehören deshalb ins Glossar. - Das Verbinden kurzer Absätze achtet nicht auf den Inhalt. - Abkürzungen wie „z. B.“ oder „2. Weltkrieg“ können als Satzende gelten; das beeinflusst nur mögliche Absatzgrenzen, nicht den Text.