diff --git a/.gitignore b/.gitignore index 88d671a..3581fd6 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,8 @@ output/ # Echte Reden (Urheberrecht): nur lokal; die Tests nutzen tests/daten/ testdaten/ -# Glossare echter Beiträge (Namen, Hörfehler): nur lokal; ins Repository gehört -# nur das Glossar der erfundenen Beispielrede +# Glossare echter Beiträge (Namen, Hörfehler): nur lokal in glossare/; ins +# Repository gehört nur das Glossar der erfundenen Beispielrede +glossare/ *.glossar.txt !tests/daten/beispiel.glossar.txt diff --git a/BEDIENUNGSANLEITUNG.md b/BEDIENUNGSANLEITUNG.md index 283c5a4..4dcbe39 100644 --- a/BEDIENUNGSANLEITUNG.md +++ b/BEDIENUNGSANLEITUNG.md @@ -172,7 +172,7 @@ YouTube-URL ▼ Rohtext ansehen │ Schritt 2: glossar_vorschlag.py → rede.glossar.entwurf.txt - │ prüfen, übernehmen → rede.glossar.txt + │ prüfen, übernehmen → glossare/rede.glossar.txt ▼ │ Schritt 3: abschrift_korrigieren.py → rede.korrigiert.txt │ rede.aenderungen.html @@ -299,15 +299,17 @@ Bewährt hat sich ein **gemeinsames Glossar** pro Redner oder Kanal (wiederkehre Namen und Hörfehler) plus eines **je Beitrag**: ```bash -./abschrift_korrigieren.py -i rede.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt +./abschrift_korrigieren.py -i rede.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt ``` Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen zuerst greifen. -Glossare enthalten Namen realer Personen und Hörfehler realer Beiträge. Sie werden -deshalb nicht ins Git-Repository übernommen: Jede Datei `*.glossar.txt` ist über -`.gitignore` ausgeschlossen und bleibt nur auf dem eigenen Rechner. Das ist -gewollt; Glossare lieber gesondert sichern. Einzige Ausnahme ist das kleine, +**Ablage:** Glossare gehören ins Verzeichnis `glossare/` im Programmordner, z. B. +`glossare/krone-schmalz.glossar.txt` und `glossare/ramstein.glossar.txt`. Sie +enthalten Namen realer Personen und Hörfehler realer Beiträge und werden deshalb +nicht ins Git-Repository übernommen: `glossare/` und jede Datei `*.glossar.txt` sind +über `.gitignore` ausgeschlossen und bleiben nur auf dem eigenen Rechner. Das ist +gewollt; Glossare deshalb gesondert sichern. Einzige Ausnahme ist das kleine, leicht nachvollziehbare Glossar zur erfundenen Beispielrede in `tests/daten/beispiel.glossar.txt`, das sich gut als Vorlage eignet. @@ -316,7 +318,7 @@ leicht nachvollziehbare Glossar zur erfundenen Beispielrede in Statt den ganzen Rohtext zu lesen, kann das Modell einen ersten Entwurf liefern: ```bash -./glossar_vorschlag.py -i rede.txt -g krone-schmalz.glossar.txt +./glossar_vorschlag.py -i rede.txt -g glossare/krone-schmalz.glossar.txt # → rede.glossar.entwurf.txt ``` @@ -353,7 +355,7 @@ Modell geändert hat. Das zeigt Hörfehler, die man als feste Ersetzung absicher möchte, und Fehlgriffe des Modells: ```bash -./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt +./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt ``` Diese Einträge stehen in einem eigenen Abschnitt mit ihrer Anzahl, z. B. @@ -365,7 +367,7 @@ entfernen. ## 7. Schritt 3: Korrigieren ```bash -./abschrift_korrigieren.py -i rede.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt +./abschrift_korrigieren.py -i rede.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt ``` Statt `-i rede.txt` geht auch `-i rede.de.vtt` (Untertiteldatei) oder @@ -398,8 +400,8 @@ Ein gekürztes Beispiel mit Erläuterungen: ```text Modell: qwen3:32b Sprache des Beitrags: de -Glossar krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen -Glossar ramstein.glossar.txt: 2 Begriffe, 15 feste Ersetzungen +Glossar glossare/krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen +Glossar glossare/ramstein.glossar.txt: 2 Begriffe, 15 feste Ersetzungen Ersetzt 2× „Willly Brand“ → „Willy Brandt“ ← feste Ersetzungen mit Treffern Ersetzt 6× „Rammstein“ → „Ramstein“ 13 Ersetzung(en) ohne Treffer: „Hostelchik“, … ← bei gemeinsamen Glossaren normal @@ -522,7 +524,7 @@ erstellt, lässt sich der Bericht jederzeit neu erzeugen. Mit denselben Glossare wie bei der Korrektur, damit deren Ersetzungen nicht als verdächtig gelten: ```bash -./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt +./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt # → rede.aenderungen.html ./aenderungen.py -a talk.txt -b talk.korrigiert.txt -l en # englischer Beitrag ``` @@ -771,7 +773,7 @@ Ja, z. B. in einer Schleife: ```bash for url in 'https://www.youtube.com/watch?v=AAA' 'https://www.youtube.com/watch?v=BBB'; do - ./abschrift_korrigieren.py -u "$url" -g krone-schmalz.glossar.txt + ./abschrift_korrigieren.py -u "$url" -g glossare/krone-schmalz.glossar.txt done ``` diff --git a/README.md b/README.md index d04fa9d..275b0fb 100644 --- a/README.md +++ b/README.md @@ -229,8 +229,8 @@ werden trotzdem umgewandelt; der Exit-Code ist dann 1. ```bash ./abschrift_korrigieren.py -i rede.txt # → rede.korrigiert.txt ./abschrift_korrigieren.py -i rede.txt -o out/rede.txt # eigene Ausgabedatei -./abschrift_korrigieren.py -i rede.txt -g rede.glossar.txt # mit Glossar -./abschrift_korrigieren.py -i rede.txt -g allgemein.glossar.txt -g rede.glossar.txt # kombiniert +./abschrift_korrigieren.py -i rede.txt -g glossare/rede.glossar.txt # mit Glossar +./abschrift_korrigieren.py -i rede.txt -g glossare/allgemein.glossar.txt -g glossare/rede.glossar.txt # kombiniert ./abschrift_korrigieren.py -i rede.de.vtt # VTT direkt → rede.de.korrigiert.txt ./abschrift_korrigieren.py -u URL # YouTube → __.korrigiert.txt ./abschrift_korrigieren.py -i talk.txt -l en # englischer Beitrag @@ -346,7 +346,7 @@ der Korrektur gelten deren Ersetzungen und Begriffe nicht als verdächtig: ```bash ./aenderungen.py -a rede.txt -b rede.korrigiert.txt # → rede.aenderungen.html ./aenderungen.py -a rede.de.vtt -b rede.korrigiert.txt -o bericht.html -./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt +./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt ./aenderungen.py -a talk.txt -b talk.korrigiert.txt -l en # englische Wortliste ``` @@ -370,13 +370,15 @@ es normal. Mehrere Glossare lassen sich kombinieren: ein gemeinsames für wiederkehrende Namen und Hörfehler eines Redners oder Kanals und eines je Beitrag, z. B. -`krone-schmalz.glossar.txt` (gemeinsam) plus `ramstein.glossar.txt`. Das gemeinsame -Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen greifen. +`glossare/krone-schmalz.glossar.txt` (gemeinsam) plus `glossare/ramstein.glossar.txt`. +Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen +greifen. -Glossare gehören zu realen Beiträgen und Personen und werden deshalb nicht -versioniert: `*.glossar.txt` steht in `.gitignore`, eigene Glossare liegen nur lokal. -Im Repository ist als Beispiel nur `tests/daten/beispiel.glossar.txt` zur erfundenen -Beispielrede. +Glossare liegen im Verzeichnis `glossare/`. Sie gehören zu realen Beiträgen und +Personen und werden deshalb nicht versioniert: `glossare/` und `*.glossar.txt` stehen +in `.gitignore`, die Glossare bleiben nur lokal und sollten gesondert gesichert +werden. Im Repository ist als Beispiel nur `tests/daten/beispiel.glossar.txt` zur +erfundenen Beispielrede. ### Glossar-Entwurf: `glossar_vorschlag.py` @@ -401,7 +403,7 @@ erneut vorgeschlagen. Zeit-Überschriften von Ausschnitten Roh- und korrigiertem Text entfernt; das Modell bekommt sie nicht zu sehen. ```bash -./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g krone-schmalz.glossar.txt +./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt # → rede.glossar.entwurf.txt ./glossar_vorschlag.py -i tests/daten/beispiel.de.txt # an der Beispielrede ausprobieren ``` @@ -432,18 +434,19 @@ passendes Glossar (`beispiel.glossar.txt`) für die eingebauten Hörfehler wie ``` **Nur lokal:** Echte Reden gehören wegen des Urheberrechts nicht ins Repository; -`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`*.glossar.txt`). +`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`glossare/`). Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und -ihre Glossare im Programmordner, laufen zusätzlich die Tests, die diese Glossare +ihre Glossare in `glossare/`, laufen zusätzlich die Tests, die diese Glossare prüfen; sonst werden sie übersprungen: -- `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `ramstein.glossar.txt`) -- `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `magdeburg.glossar.txt`) +- `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `glossare/ramstein.glossar.txt`) +- `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `glossare/magdeburg.glossar.txt`) - `Lahnstein.de-orig.*`: Rede „Respekt geht anders“ in Lahnstein (Glossar - `lahnstein.glossar.txt`, erstellt mit Hilfe von `glossar_vorschlag.py`), zu laden mit + `glossare/lahnstein.glossar.txt`, erstellt mit Hilfe von `glossar_vorschlag.py`), + zu laden mit `./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d testdaten` -Alle drei mit dem gemeinsamen `krone-schmalz.glossar.txt` davor. Ein Lauf über eine +Alle drei mit dem gemeinsamen `glossare/krone-schmalz.glossar.txt` davor. Ein Lauf über eine Rede dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa 6–8 Minuten. ## Tests diff --git a/tests/test_abschrift_korrigieren.py b/tests/test_abschrift_korrigieren.py index dc074e1..297e8d2 100644 --- a/tests/test_abschrift_korrigieren.py +++ b/tests/test_abschrift_korrigieren.py @@ -14,7 +14,9 @@ REPO = Path(__file__).resolve().parent.parent # Own, made-up sample speech; real speeches are only kept locally in testdaten/ SAMPLE = REPO / "tests" / "daten" / "beispiel.de.txt" GLOSSARY = REPO / "tests" / "daten" / "beispiel.glossar.txt" -SHARED_GLOSSARY = REPO / "krone-schmalz.glossar.txt" +# Real glossaries and speeches are only kept locally (see .gitignore) +GLOSSARIES = REPO / "glossare" +SHARED_GLOSSARY = GLOSSARIES / "krone-schmalz.glossar.txt" SPEECHES = REPO / "testdaten" # The autouse fixture below replaces it; tests of the real function use this REAL_FIND_MERGE_SIDE = ak.find_merge_side @@ -135,7 +137,7 @@ SAMPLE_GLOSSARIES = [ # Real speeches and their glossaries are not in the repository; without them these skip needs_speeches = pytest.mark.skipif( not all( - (SPEECHES / sample).is_file() and (REPO / glossary).is_file() + (SPEECHES / sample).is_file() and (GLOSSARIES / glossary).is_file() for glossary, sample in SAMPLE_GLOSSARIES ) or not SHARED_GLOSSARY.is_file(), reason="echte Reden (testdaten/) und ihre Glossare nur lokal", @@ -155,7 +157,7 @@ def test_sample_glossary_replacements_all_match(capsys, glossary, sample): text = flat((SPEECHES / sample).read_text(encoding="utf-8")) text = ak.apply_replacements(text, ak.read_glossary(SHARED_GLOSSARY)[1]) capsys.readouterr() - ak.apply_replacements(text, ak.read_glossary(REPO / glossary)[1]) + ak.apply_replacements(text, ak.read_glossary(GLOSSARIES / glossary)[1]) assert "ohne Treffer" not in capsys.readouterr().out