docs: Dateiablage mit Arbeitsordnern, Abschluss und Video-Glossaren

README: neue Abschnitte „Dateiablage“ und „Abschluss: abschliessen.py“,
Standardpfade abschriften/<Name>/ in allen Beispielen und Optionstabellen,
gemeinsame und Video-Glossare, testdaten/<rede>/, Tests und Einstellungen.

Bedienungsanleitung: neuer Abschnitt 10 „Schritt 6: Abschließen und
aufräumen“ (folgende Abschnitte umnummeriert), Ablaufdiagramm und
Schnellstart mit Arbeitsordner und Abschluss, Glossar-Arten, Dateien je
Arbeitsordner, Hinweis „im Programmordner arbeiten“, Sicherung von
glossare/ und fertig/, Fehlermeldungen und Kurzreferenz von abschliessen.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 23:33:09 +02:00
commit 6f3eb23547

193
README.md
View file

@ -21,6 +21,7 @@ Die Werkzeuge sind einzeln oder hintereinander nutzbar:
| `abschrift_korrigieren.py` | Rohabschrift (oder VTT direkt) mit dem Sprachmodell korrigieren |
| `aenderungen.py` | Änderungsbericht: was hat das Modell gegenüber dem Rohtext geändert? |
| `glossar_vorschlag.py` | Glossar-Entwurf: vermutete Hörfehler bei Namen und Begriffen |
| `abschliessen.py` | fertige Abschrift mit Quellenangabe nach `fertig/`, Arbeitsordner löschen |
## Voraussetzungen
@ -41,26 +42,31 @@ der Lauf wird etwa 12-mal langsamer.
## Aufruf
Von der YouTube-URL zum korrigierten Text in einem Befehl:
Von der YouTube-URL zum korrigierten Text in einem Befehl, dann abschließen:
```bash
./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.korrigiert.txt
# → lahnstein.korrigiert.txt, lahnstein.txt (Rohtext), lahnstein.aenderungen.html
./abschrift_korrigieren.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -g glossare/krone-schmalz.glossar.txt
# → abschriften/<Name>/: <Name>.txt (Rohtext), <Name>.quelle.json,
# <Name>.korrigiert.txt, <Name>.aenderungen.html, <Name>.korrigiert.parts/
./abschliessen.py abschriften/<Name> # → fertig/<Name>.txt, Arbeitsordner nach Rückfrage gelöscht
```
`<Name>` ist `<Kanal>_<Titel>_<Datum>`, siehe [Dateiablage](#dateiablage).
Oder in zwei Schritten, um den Rohtext vorher anzusehen:
```bash
./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -o lahnstein.txt
./abschrift_korrigieren.py -i lahnstein.txt # → lahnstein.korrigiert.txt
./extract_text.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' # → abschriften/<Name>/<Name>.txt
./abschrift_korrigieren.py -i abschriften/<Name>/<Name>.txt # Ergebnis im selben Ordner
```
Dasselbe in Einzelschritten, wenn die VTT-Datei erhalten bleiben soll:
```bash
./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d untertitel
./vtt2txt.py -i untertitel/Lahnstein.de-orig.vtt
./abschrift_korrigieren.py -i untertitel/Lahnstein.de-orig.txt
./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein
# → abschriften/Lahnstein/Lahnstein.de-orig.vtt
./vtt2txt.py -i abschriften/Lahnstein/Lahnstein.de-orig.vtt
./abschrift_korrigieren.py -i abschriften/Lahnstein/Lahnstein.de-orig.txt
```
Der Schritt über `vtt2txt.py` ist optional: `abschrift_korrigieren.py` nimmt auch die
@ -75,7 +81,7 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei
```bash
./extract_text.py -u 'https://www.youtube.com/watch?v=0LmCveTM788'
# → John_Mearsheimer_Offensive_Realism_Episode_1_Origins_of_the_War_In_Ukraine_2026-07-30.txt
# → abschriften/John_Mearsheimer_…_2026-07-30/John_Mearsheimer_…_2026-07-30.txt (+ .quelle.json)
./extract_text.py -u URL -l de -o texte/rede.txt # Sprache und Ziel
./extract_text.py -u URL -f -o rede.txt # lesbarer Fließtext
./extract_text.py -u URL -z 0:03:17-0:05:25 # nur ein Ausschnitt
@ -87,7 +93,7 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei
|---|---|
| `-u`, `--url` | YouTube-URL, Pflicht |
| `-l`, `--lang` | Sprache; Standard: Sprache des Original-Audios (`<sprache>-orig`) |
| `-o`, `--output` | Ausgabedatei (Verzeichnisse werden angelegt, vorhandene Datei überschrieben); Standard: `<Kanal>_<Titel>_<Datum>.txt`, siehe unten |
| `-o`, `--output` | Ausgabedatei (Verzeichnisse werden angelegt, vorhandene Datei überschrieben); Standard: `abschriften/<Name>/<Name>.txt`, siehe unten |
| `-z`, `--zeitraeume` | nur Untertitel in diesen Bereichen, siehe [Zeitauswahl](#zeitauswahl--z) |
| `--exakt` | genau an den Zeiten schneiden statt an Satzgrenzen |
| `-f`, `--fliesstext` | Fließtext, auf 80 Zeichen umbrochen (Wörter werden nie getrennt), statt der kurzen Untertitelzeilen; beides versteht `abschrift_korrigieren.py` |
@ -95,7 +101,8 @@ Zwischenschritt im temporären Verzeichnis. Die Spurwahl ist dieselbe wie bei
### Standard-Dateinamen für YouTube-Videos
Ohne `-o` bzw. `-n` bilden `extract_text.py`, `yt_untertitel.py` und
`abschrift_korrigieren.py -u` den Namen aus Kanal, Titel und Hochladedatum:
`abschrift_korrigieren.py -u` den Namen aus Kanal, Titel und Hochladedatum und
schreiben in den Arbeitsordner `abschriften/<Name>/`:
| Video | Name |
|---|---|
@ -108,8 +115,11 @@ Wörter werden mit `_` verbunden. Bindestriche und Punkte im Wort bleiben
Video-ID. Mit `-z` kommen die Bereiche dazu, z. B.
`…_2026-07-30_00-03-17_bis_00-05-25` (`-z A`: `_ab_…`, `-z 0-B` bzw. `-z -B`: `_bis_…`;
mehrere Bereiche mit `+` verbunden: `…_00-05-00_bis_00-06-00+ab_00-25-00`).
Gleiches Video ergibt immer denselben Namen; eine vorhandene Datei wird
überschrieben (ein mit `-u` gespeicherter, abweichender Rohtext aber nie).
Gleiches Video ergibt immer denselben Namen und denselben Ordner, Ausschnitte
eines Videos landen also beisammen. Eine vorhandene Datei wird überschrieben (ein mit
`-u` gespeicherter, abweichender Rohtext und eine von Hand geänderte Korrektur aber
nie). Neben dem Rohtext entsteht `<Rohtext>.quelle.json` mit Titel, Kanal, Datum und
URL; daraus macht `abschliessen.py` den Quellenkopf.
### Untertitel herunterladen: `yt_untertitel.py`
@ -130,7 +140,8 @@ gehören zur Synchronisation und werden nicht genommen. Sprachen werden auch mit
Region gefunden: `-l en` findet manuelle Untertitel `en-US`.
```bash
./yt_untertitel.py -u URL # → <Kanal>_<Titel>_<Datum>.de-orig.vtt
./yt_untertitel.py -u URL # → abschriften/<Name>/<Name>.de-orig.vtt
./yt_untertitel.py -u URL -n Lahnstein # → abschriften/Lahnstein/Lahnstein.de-orig.vtt
./yt_untertitel.py -u URL -n Lahnstein -d untertitel # → untertitel/Lahnstein.de-orig.vtt
```
@ -139,7 +150,7 @@ Region gefunden: `-l en` findet manuelle Untertitel `en-US`.
| `-u`, `--url` | YouTube-URL, Pflicht |
| `-n`, `--name` | Dateiname ohne Endung; Standard: `<Kanal>_<Titel>_<Datum>` |
| `-l`, `--lang` | Sprache; Standard: `de` |
| `-d`, `--dir` | Zielverzeichnis (wird angelegt); Standard: aktuelles Verzeichnis |
| `-d`, `--dir` | Zielverzeichnis (wird angelegt); Standard: Arbeitsordner `abschriften/<Name>/` |
Eine vorhandene Datei gleichen Namens wird überschrieben.
@ -232,7 +243,7 @@ werden trotzdem umgewandelt; der Exit-Code ist dann 1.
./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 → <Kanal>_<Titel>_<Datum>.korrigiert.txt
./abschrift_korrigieren.py -u URL # YouTube → abschriften/<Name>/<Name>.korrigiert.txt
./abschrift_korrigieren.py -i talk.txt -l en # englischer Beitrag
./abschrift_korrigieren.py -u URL -z 0:03:17-0:05:25 # nur ein Ausschnitt des Videos
./abschrift_korrigieren.py -u URL -z 00:05-00:06 00:25 # mehrere Bereiche, eine Datei
@ -243,10 +254,10 @@ werden trotzdem umgewandelt; der Exit-Code ist dann 1.
| `-i`, `--input` | Eingabedatei: Rohabschrift (`.txt`) oder Untertitel (`.vtt`, wird wie mit `vtt2txt.py` umgewandelt) |
| `-u`, `--url` | statt `-i`: YouTube-URL; Untertitel wie bei `extract_text.py`. Der Rohtext wird neben der Ausgabe gespeichert (`rede.korrigiert.txt` → `rede.txt`, sonst `<Name>.roh.txt`), eine vorhandene, abweichende Datei aber nie überschrieben |
| `-l`, `--lang` | Sprache des Beitrags: `de` oder `en` (auch mit Region, z. B. `en-US`); wählt Prompts und Prüfmarke. Mit `-u` zugleich die Sprache der Untertitel. Standard: `de`, mit `-u` die Sprache des Original-Audios |
| `-o`, `--output` | Ausgabedatei; Standard: `<Eingabe ohne Endung>.korrigiert.txt` neben der Eingabe, mit `-u` `<Kanal>_<Titel>_<Datum>.korrigiert.txt`; mit `-z` zusätzlich die Bereiche im Namen |
| `-o`, `--output` | Ausgabedatei; Standard: `<Eingabe ohne Endung>.korrigiert.txt` neben der Eingabe, mit `-u` `abschriften/<Name>/<Name>.korrigiert.txt`; mit `-z` zusätzlich die Bereiche im Namen |
| `-z`, `--zeitraeume` | nur diese Bereiche korrigieren, siehe [Zeitauswahl](#zeitauswahl--z); nur mit `.vtt`-Eingabe oder `-u`, da reiner Text keine Zeitstempel hat |
| `--exakt` | genau an den Zeiten schneiden statt an Satzgrenzen |
| `-g`, `--glossar` | Glossar mit festen Ersetzungen und Schreibweisen; mehrfach angeben zum Kombinieren (Ersetzungen in Reihenfolge der Angabe) |
| `-g`, `--glossar` | Glossar mit festen Ersetzungen und Schreibweisen; mehrfach angeben zum Kombinieren (Ersetzungen in Reihenfolge der Angabe). Das Video-Glossar des Ausgabeordners kommt automatisch dazu, siehe [Glossar](#glossar) |
| `-m`, `--model` | Ollama-Modell; Standard: `qwen3:32b` (Konstante `MODEL`) |
| `--kein-bericht` | keinen Änderungsbericht schreiben |
| `--ueberschreiben` | Ausgabedatei auch ersetzen, wenn sie seit dem letzten Lauf von Hand geändert wurde |
@ -263,6 +274,31 @@ Modell an, an den Rändern der Ausschnitte nichts zu ergänzen. Eine Rohabschrif
(`.txt`) mit solchen Überschriften, etwa von `vtt2txt.py -z`, wird ebenso in
Blöcken korrigiert.
## Dateiablage
```text
glossare/ gemeinsame Glossare je Sprecher oder Kanal
abschriften/<Name>/ Arbeitsordner, einer je Video (auch für Ausschnitte)
<Name>.txt Rohtext
<Name>.quelle.json Titel, Kanal, Datum, URL
<Name>.glossar.txt Glossar nur dieses Videos (optional, automatisch genutzt)
<Name>[_bereiche].korrigiert.txt Ergebnis, darf von Hand nachbearbeitet werden
<Name>[_bereiche].aenderungen.html Änderungsbericht
<Name>[_bereiche].korrigiert.parts/ Zwischenstände
fertig/<Name>[_bereiche].txt abgeschlossene Abschriften mit Quellenkopf
testdaten/<rede>/ echte Reden als Regressionstest-Eingaben (.vtt, .txt, Glossar)
tests/daten/ erfundene Beispielrede für die Tests (im Repository)
```
`glossare/`, `abschriften/`, `fertig/` und `testdaten/` stehen in `.gitignore`: Sie
enthalten Inhalte realer Beiträge und Personen und bleiben nur lokal. Wertvoll sind
davon auf Dauer nur `glossare/` und `fertig/`. Diese beiden gehören in eine eigene
Sicherung, z. B. ein zweites, **privates** Git-Repository.
Ein Video durchläuft: Rohtext holen → (Video-Glossar anlegen) → korrigieren →
Bericht prüfen und nacharbeiten → mit `abschliessen.py` abschließen. Danach bleibt
nur `fertig/<Name>.txt`.
## Ablauf
0. **Vorprüfung:** Läuft Ollama, ist das Modell installiert? Sonst Abbruch mit
@ -368,17 +404,22 @@ Ersetzungen ohne Treffer werden gesammelt gemeldet. Bei einem Glossar für einen
einzelnen Beitrag deutet das auf einen Tippfehler hin, bei einem gemeinsamen Glossar ist
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.
`glossare/krone-schmalz.glossar.txt` (gemeinsam) plus `glossare/ramstein.glossar.txt`.
Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen
greifen.
Es gibt zwei Arten von Glossaren:
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.
- **Gemeinsame Glossare** für wiederkehrende Namen und Hörfehler eines Redners oder
Kanals liegen in `glossare/`, z. B. `glossare/krone-schmalz.glossar.txt`. Sie werden
mit `-g` angegeben.
- **Video-Glossare** gelten nur für ein Video und liegen in dessen Arbeitsordner,
benannt wie der Ordner: `abschriften/<Name>/<Name>.glossar.txt`.
`abschrift_korrigieren.py`, `glossar_vorschlag.py` und `aenderungen.py` nutzen es
automatisch (Meldung „Video-Glossar, automatisch“), und zwar nach den mit `-g`
angegebenen, damit die gemeinsamen Ersetzungen zuerst greifen. Beim Abschluss nennt
`abschliessen.py` seine Einträge, die noch in keinem gemeinsamen Glossar stehen.
Glossare gehören zu realen Beiträgen und Personen und werden deshalb nicht
versioniert (`glossare/`, `abschriften/` und `*.glossar.txt` stehen in `.gitignore`);
`glossare/` sollte gesondert gesichert werden. Im Repository ist als Beispiel nur
`tests/daten/beispiel.glossar.txt` zur erfundenen Beispielrede.
### Glossar-Entwurf: `glossar_vorschlag.py`
@ -420,6 +461,46 @@ Der Entwurf ist ein Ausgangspunkt, kein fertiges Glossar: jeden Eintrag prüfen,
Brauchbares ins Glossar des Beitrags (oder ins gemeinsame) übernehmen. Die Modellantworten
werden in `<Entwurf>.parts/` zwischengespeichert.
## Abschluss: `abschliessen.py`
```bash
./abschliessen.py abschriften/<Name> # mit Rückfrage vor dem Löschen
./abschliessen.py abschriften/<Name> --ja # ohne Rückfrage
```
1. Ergebnisse sind alle `*.korrigiert.txt` im Ordner (bei Ausschnitten mehrere).
2. Abbruch, solange ein `*.neu.korrigiert.txt` (Konflikt mit Handarbeit) da ist oder
noch `[prüfen: …]`-Marken im Text stehen (`--trotzdem` schließt dennoch ab).
3. Jedes Ergebnis kommt als `fertig/<Name>[_bereiche].txt` mit Quellenkopf:
```text
Titel: Prof. Gabriele Krone-Schmalz – Respekt geht anders
Kanal: GGBLahnstein
Datum: 2026-07-30
Quelle: https://www.youtube.com/watch?v=rm6lADgf6GQ
Abgeschlossen: 2026-10-11
<korrigierter Text>
```
Ohne `*.quelle.json` nennt der Kopf nur die Datei. Eine vorhandene Datei in
`fertig/` mit anderem Text wird nie überschrieben; mit demselben Text gilt das
Video als schon übernommen (z. B. nach „nicht löschen“).
4. Einträge des Video-Glossars, die in keinem Glossar unter `glossare/` stehen, werden
aufgelistet, damit Brauchbares vorher ins gemeinsame Glossar wandert.
5. Der Arbeitsordner wird angezeigt und nach Rückfrage gelöscht. Nie gelöscht werden
Ordner mit fremden Dateien (andere als `.txt`, `.vtt`, `.html`, `.json`,
`*.parts/`), das Aufrufverzeichnis und alles in `testdaten/`, `glossare/`, `tests/`
oder `fertig/`.
| Option | Bedeutung |
|---|---|
| `ordner` | Arbeitsordner, z. B. `abschriften/<Name>` |
| `--ziel` | Verzeichnis für fertige Abschriften; Standard: `fertig` |
| `--glossare` | Verzeichnis der gemeinsamen Glossare; Standard: `glossare` |
| `--ja` | ohne Rückfrage löschen |
| `--trotzdem` | auch mit offenen Prüfmarken abschließen |
## Testdaten
**Im Repository:** `tests/daten/` enthält eine frei erfundene Beispielrede
@ -434,20 +515,29 @@ 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 (`glossare/`).
Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und
ihre Glossare in `glossare/`, laufen zusätzlich die Tests, die diese Glossare
prüfen; sonst werden sie übersprungen:
`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare. Es enthält je Rede
einen Ordner mit unveränderlichen Eingaben, nie Ausgaben:
- `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
`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`
- `testdaten/ramstein/`: `ramstein.de.vtt`, `ramstein.de.txt`, `ramstein.glossar.txt`
(Rede über die US Air Base Ramstein)
- `testdaten/magdeburg/`: `magdeburg.de-orig.vtt`, `.txt`, `magdeburg.glossar.txt`
(Rede in Magdeburg)
- `testdaten/lahnstein/`: `Lahnstein.de-orig.vtt`, `.txt`, `lahnstein.glossar.txt`
(Rede „Respekt geht anders“, Glossar mit Hilfe von `glossar_vorschlag.py`), zu laden
mit `./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d testdaten/lahnstein`
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.
Liegen sie dort und `glossare/krone-schmalz.glossar.txt` daneben, laufen zusätzlich
die Tests, die diese Glossare prüfen; sonst werden sie übersprungen. Eine echte Rede
korrigiert man mit Ausgabe in einen Arbeitsordner, damit `testdaten/` sauber bleibt:
```bash
./abschrift_korrigieren.py -i testdaten/ramstein/ramstein.de.txt \
-g glossare/krone-schmalz.glossar.txt -g testdaten/ramstein/ramstein.glossar.txt \
-o abschriften/ramstein.de/ramstein.de.korrigiert.txt
```
Ein Lauf über eine Rede dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa
6–8 Minuten.
## Tests
@ -457,9 +547,9 @@ python3 -m pytest
Die Tests brauchen weder Ollama noch Netz: Modellaufrufe und `yt-dlp` werden durch
Fakes ersetzt. Als Text dient die erfundene Beispielrede in `tests/daten/` (siehe
[Testdaten](#testdaten)). In einem frischen Klon laufen 318 Tests, 7 werden
[Testdaten](#testdaten)). In einem frischen Klon laufen 339 Tests, 7 werden
übersprungen; sie prüfen die Glossare der echten Reden und laufen nur, wenn diese
lokal in `testdaten/` liegen (dann 325).
lokal in `testdaten/` liegen (dann 346).
`tests/test_abschrift_korrigieren.py` prüft Abschnittsbildung, Satzgrenzen
(Abkürzungen und Ordnungszahlen sind kein Satzende), Glossar (jede Ersetzung des
@ -467,7 +557,8 @@ Beispielglossars trifft die Beispielrede; lokal zusätzlich: jede Ersetzung im
Glossar einer Rede trifft diese Rede, jede im gemeinsamen Glossar mindestens eine),
Prompts (keine Namensteile ergänzen), Streaming-Auswertung, Absatzgliederung (Text
bleibt unverändert, 3–10 Sätze), Verbinden kurzer Absätze (Modell wird nur gefragt,
wenn beide Nachbarn passen), Zwischenspeicher/Fortsetzen, Schutz von Handarbeit
wenn beide Nachbarn passen), Zwischenspeicher/Fortsetzen, Arbeitsordner,
Quellenangabe und automatisches Video-Glossar, Schutz von Handarbeit
(`.neu.korrigiert.txt`, `--ueberschreiben`), Zeitauswahl, Sprachen und die
Kommandozeile.
`tests/test_glossar_vorschlag.py` prüft Filter (nur Funde im Text, keine bekannten),
@ -481,6 +572,9 @@ Die Tests nutzen eine kleine eigene Wortliste statt der des Systems.
(Original-Audio, manuell vor automatisch) und Fehlerfälle.
`tests/test_yt_untertitel.py` prüft Spurauswahl, Aufruf von `yt-dlp` und
Fehlerfälle (ohne Netz, `yt-dlp` wird durch Fakes ersetzt).
`tests/test_abschliessen.py` prüft den Abschluss: Quellenkopf, mehrere Ausschnitte,
Abbruch bei Prüfmarken und Konflikten, nie überschreiben, Rückfrage, Schutz vor dem
Löschen fremder und geschützter Ordner und den Hinweis auf Video-Glossar-Einträge.
`tests/test_vtt2txt.py` prüft die VTT-Umwandlung: die Beispiel-`.vtt` (und lokal
jede Rede in `testdaten/`) ergibt genau die zugehörige `.txt`, echte Wiederholungen
bleiben erhalten, auch bei Untertiteln ohne rollendes Fenster, dazu Zeitauswahl
@ -494,7 +588,9 @@ Verbinden kurzer Absätze wird in `<Ausgabe>.parts/` gespeichert. Ein erneuter
Lauf überspringt alles, was schon berechnet ist.
Ändern sich Modell (auch per `-m`), Prompt, Glossar oder Text eines Abschnitts, wird
genau dieser Teil neu berechnet. Glossar-Begriffe stehen im Prompt; ein neuer Begriff
lässt deshalb alle Abschnitte neu korrigieren. Den Ordner kann man jederzeit löschen.
lässt deshalb alle Abschnitte neu korrigieren. Den Ordner kann man jederzeit löschen;
`abschliessen.py` löscht ihn mit dem Arbeitsordner. Er wächst sonst mit jeder
Prompt- oder Modelländerung, weil alte Fassungen liegen bleiben.
`glossar_vorschlag.py` speichert seine Modellantworten ebenso in
`<Entwurf>.parts/`.
@ -530,6 +626,15 @@ In `vtt2txt.py`:
| `MAX_SNAP_SECONDS` | 30 | so weit darf ein Zeitbereich bis zur nächsten Satzgrenze wachsen |
| `ROLLING_SHARE` | 0.5 | ab diesem Anteil sich überlappender Blöcke gilt eine Datei als rollend |
In `yt_untertitel.py` und `abschliessen.py` (Pfade relativ zum Aufrufverzeichnis, also
im Programmordner aufrufen):
| Konstante | Standard | Bedeutung |
|---|---|---|
| `WORK_DIR` | `abschriften` | Arbeitsordner je Video: `abschriften/<Name>/` |
| `FINISHED_DIR` | `fertig` | abgeschlossene Abschriften (Option `--ziel`) |
| `GLOSSARY_DIR` | `glossare` | gemeinsame Glossare (Option `--glossare`) |
## Bekannte Grenzen
- Das Modell ändert gelegentlich Wörter eigenmächtig, auch sinnverändernd