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.
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
dschlueter 8fe7c394f1 feat: Glossar für die Magdeburg-Rede
- magdeburg.glossar.txt: 64 feste Ersetzungen (Namen, Orte, Hörfehler)
  und 10 Hinweis-Begriffe; jede Ersetzung trifft den Rohtext
- Test prüft jetzt beide Beispiel-Glossare gegen ihre Testdaten
- README: Glossare zu beiden Testdaten erwähnt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 18:11:58 +02:00
tests feat: Glossar für die Magdeburg-Rede 2026-10-10 18:11:58 +02:00
.gitignore test: Testdaten (Ramstein-Rede) ins Repo aufnehmen 2026-10-10 16:54:00 +02:00
pytest.ini feat: VTT-Untertitel in Rohabschrift umwandeln (vtt2txt.py) 2026-10-10 17:50:51 +02:00
README.md feat: Glossar für die Magdeburg-Rede 2026-10-10 18:11:58 +02:00
rede_korrigieren.py feat: VTT-Untertitel in Rohabschrift umwandeln (vtt2txt.py) 2026-10-10 17:50:51 +02:00
vtt2txt.py feat: VTT-Untertitel in Rohabschrift umwandeln (vtt2txt.py) 2026-10-10 17:50:51 +02:00

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.

./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: <Eingabe ohne Endung>.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

./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: <Eingabe ohne Endung>.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:

# 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 und magdeburg.glossar.txt sind Beispiele zu den Testdaten.

Testdaten

testdaten/ enthält zwei Reden, jeweils als automatische YouTube-Untertitel (.vtt, Original) und daraus mit vtt2txt.py gewonnener Rohtext (.txt, Eingabe für das Programm):

  • ramstein.de.*: Rede über die US Air Base Ramstein (mit Glossar ramstein.glossar.txt)
  • magdeburg.de-orig.*: Rede in Magdeburg (mit Glossar magdeburg.glossar.txt)
./vtt2txt.py -i "testdaten/*.vtt"           # erzeugt alle .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

python3 -m pytest

Die Tests brauchen kein Ollama: Modellaufrufe werden durch Fakes ersetzt. Geprüft werden Abschnittsbildung, Glossar (inkl. „jede Ersetzung in den Beispiel-Glossaren trifft ihre 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: jede .vtt in testdaten/ ergibt genau die zugehörige .txt, echte Wiederholungen bleiben erhalten, dazu Muster, Ausgabeverzeichnis und Fehlerfälle.

Zwischenstände

Jeder fertige Abschnitt und jede Absatzgliederung wird in <Ausgabe>.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.