2026-10-10 16:50:54 +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
|
|
|
|
|
|
|
|
|
|
|
|
```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
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
| Option | Bedeutung |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `-i`, `--input` | Eingabedatei (Rohabschrift), 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:
|
|
|
|
|
|
|
|
|
|
|
|
```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.
|
|
|
|
|
|
|
2026-10-10 16:54:00 +02:00
|
|
|
|
## 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
|
|
|
|
|
|
./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.
|
|
|
|
|
|
|
2026-10-10 16:57:37 +02:00
|
|
|
|
## 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.
|
|
|
|
|
|
|
2026-10-10 16:50:54 +02:00
|
|
|
|
## 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.
|