feat: VTT-Untertitel in Rohabschrift umwandeln (vtt2txt.py)

- vtt2txt.py als Kommandozeilenprogramm: -i nimmt mehrere Dateien und
  Muster (auch ohne Shell-Expansion), -o eine Datei oder ein Verzeichnis
- Rollende YouTube-Untertitel über die Überlappung aufeinanderfolgender
  Blöcke entdoppeln; echte Wiederholungen des Redners bleiben erhalten
- Fix: Blöcke nur an wirklich leeren Zeilen trennen; Text nach einer
  Leerzeichen-Zeile ging verloren (u. a. das letzte [applaus])
- Schutz gegen Überschreiben der Eingabe und doppelte Ausgabedateien,
  klare Meldung bei Nicht-UTF-8, Stapel läuft bei Fehlern weiter
- rede_korrigieren.py nimmt .vtt direkt an
- testdaten/ramstein.de.txt neu erzeugt (+ abschließendes [applaus])
- pytest: global installiertes asyncio-Plugin abschalten (Warnung)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-10 17:50:51 +02:00
commit 99238870f7

View file

@ -9,6 +9,8 @@ import sys
import time
import urllib.request
from vtt2txt import vtt_to_lines
MODEL = "qwen3:32b"
OLLAMA_URL = "http://127.0.0.1:11434/api/chat"
@ -356,7 +358,8 @@ def parse_args():
f"mit {MODEL} über Ollama."
)
parser.add_argument(
"-i", "--input", required=True, type=Path, help="Eingabedatei (Rohabschrift)"
"-i", "--input", required=True, type=Path,
help="Eingabedatei: Rohabschrift (.txt) oder Untertitel (.vtt)",
)
parser.add_argument(
"-o", "--output", type=Path,
@ -388,8 +391,11 @@ def main():
terms, replacements = read_glossary(args.glossar) if args.glossar else ([], [])
system = build_system(terms)
raw = source.read_text(encoding="utf-8-sig")
if source.suffix.lower() == ".vtt":
raw = "\n".join(vtt_to_lines(raw))
# Subtitle line breaks carry no meaning; send plain running text
text = " ".join(source.read_text(encoding="utf-8").split())
text = " ".join(raw.split())
if args.glossar:
print(