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:
parent
d66f185fdd
commit
6f3eb23547
1 changed files with 373 additions and 131 deletions
193
README.md
193
README.md
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue