diff --git a/README.md b/README.md index 633bfc1..6602304 100644 --- a/README.md +++ b/README.md @@ -329,7 +329,9 @@ des Modells sind oft falsch (Lahnstein: `Deckmäntelchen → Deckmäntel`), und falsche feste Ersetzung verdirbt den Text unbemerkt. Zum Übernehmen `# ? ` entfernen. Einträge aus den mit `-g` angegebenen Glossaren werden vorher angewendet und nicht -erneut vorgeschlagen. +erneut vorgeschlagen. Zeit-Überschriften von Ausschnitten +(`[00:04:57 - 00:06:04]`, siehe [Zeitauswahl](#zeitauswahl--s--e--z)) werden aus +Roh- und korrigiertem Text entfernt; das Modell bekommt sie nicht zu sehen. ```bash ./glossar_vorschlag.py -i testdaten/Lahnstein.de-orig.txt \ diff --git a/glossar_vorschlag.py b/glossar_vorschlag.py index ecaa520..9369d36 100755 --- a/glossar_vorschlag.py +++ b/glossar_vorschlag.py @@ -15,6 +15,7 @@ from rede_korrigieren import ( MODEL, apply_replacements, chat_request, check_ollama, ollama_open, read_glossary, split_chunks, ) +from vtt2txt import split_segments SYSTEM = """Du suchst Hörfehler in der automatischen Abschrift einer deutschen Rede. @@ -116,6 +117,11 @@ def model_suggestions(text, model, cache_dir, known): return found +def plain_text(text): + """Running text without time headers ("[00:04:57 - 00:06:04]") of excerpts.""" + return " ".join(" ".join(body for _, body in split_segments(text)).split()) + + def contains(words, part): """Is `part` a contiguous run of `words`?""" return any(words[i:i + len(part)] == part for i in range(len(words) - len(part) + 1)) @@ -213,7 +219,7 @@ def parse_args(): def main(): args = parse_args() - text = " ".join(read_raw(args.input).split()) + text = plain_text(read_raw(args.input)) if not text: raise SystemExit("Die Eingabedatei ist leer.") @@ -234,7 +240,7 @@ def main(): changes = None if args.korrigiert: - corrected = args.korrigiert.read_text(encoding="utf-8") + corrected = plain_text(args.korrigiert.read_text(encoding="utf-8")) changes = correction_changes(raw, corrected, replacements, set(suggestions)) args.output.parent.mkdir(parents=True, exist_ok=True) diff --git a/tests/test_glossar_vorschlag.py b/tests/test_glossar_vorschlag.py index e5a8fde..527c6de 100644 --- a/tests/test_glossar_vorschlag.py +++ b/tests/test_glossar_vorschlag.py @@ -136,3 +136,27 @@ def test_cli_missing_file(monkeypatch, capsys): with pytest.raises(SystemExit): run_main(monkeypatch, "-i", "fehlt.txt") assert "Datei nicht gefunden" in capsys.readouterr().err + + +def test_time_headers_never_reach_model_or_changes(tmp_path, monkeypatch): + raw = tmp_path / "rede.txt" + raw.write_text( + "[00:04:59 - 00:06:04]\nDer Kremmel\nist da.\n\n[00:09:58 - 00:12:02]\nHerr Grotzki auch.\n", + encoding="utf-8", + ) + corrected = tmp_path / "rede.korrigiert.txt" + corrected.write_text( + "[00:04:59 - 00:06:04]\n\nDer Kreml ist da.\n\n[00:09:58 - 00:12:02]\n\n" + "Herr Grotzki auch.\n", + encoding="utf-8", + ) + model = fake_model([]) + monkeypatch.setattr(urllib.request, "urlopen", model) + out = tmp_path / "entwurf.txt" + run_main(monkeypatch, "-i", raw, "-k", corrected, "-o", out) + + sent = model.calls[0]["messages"][1]["content"] + assert sent == "Der Kremmel ist da. Herr Grotzki auch." + draft = out.read_text(encoding="utf-8") + assert "# ? Kremmel => Kreml (1×)" in draft + assert "00:0" not in draft.replace(str(raw), "")