feat: Ausschnitte an Satzgrenzen erweitern (--exakt schneidet genau)

Bei -s/-e werden angeschnittene Sätze an beiden Enden vollständig
aufgenommen (höchstens 30 s über den Zeitraum hinaus). rede_korrigieren.py
weist das Modell bei Ausschnitten zusätzlich an, nichts zu ergänzen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 19:34:36 +02:00
commit faea4bf465

View file

@ -142,6 +142,10 @@ PROMPTS = {
"glossary": "Glossar: korrekte Schreibweisen von Namen und Begriffen, die in "
"dieser Rede vorkommen. Falsch erkannte Varianten davon in der Abschrift "
"stillschweigend korrigieren:",
"excerpt": "Der Text ist ein Ausschnitt aus einer längeren Rede und kann mitten "
"im Satz beginnen oder enden. Vervollständige angeschnittene Sätze nicht und "
"ergänze kein Wort, auch nicht in einer Markierung; lass einen unvollständigen "
"Anfang oder Schluss unverändert stehen.",
},
"en": {
"system": SYSTEM_EN,
@ -150,6 +154,10 @@ PROMPTS = {
"glossary": "Glossary: correct spellings of names and terms that occur in "
"this speech. Silently correct misrecognized variants of them in the "
"transcript:",
"excerpt": "The text is an excerpt from a longer speech and may begin or end "
"in the middle of a sentence. Do not complete cut-off sentences and do not "
"add any word, not even in a mark; leave an incomplete beginning or ending "
"unchanged.",
},
}
DEFAULT_LANGUAGE = "de"
@ -163,13 +171,16 @@ PARAGRAPH_FORMAT = {
}
def build_system(glossary, lang=DEFAULT_LANGUAGE):
"""Append glossary terms (correct spellings) to the system prompt."""
def build_system(glossary, lang=DEFAULT_LANGUAGE, excerpt=False):
"""Append the excerpt note and glossary terms (correct spellings) to the system prompt."""
prompts = PROMPTS[lang]
system = prompts["system"]
if excerpt:
system += f"\n{prompts['excerpt']}\n"
if not glossary:
return prompts["system"]
return system
terms = "\n".join(f"- {term}" for term in glossary)
return f"{prompts['system']}\n{prompts['glossary']}\n{terms}\n"
return f"{system}\n{prompts['glossary']}\n{terms}\n"
def read_glossary(path):
@ -544,7 +555,7 @@ def save_raw_text(path, raw):
def read_source(args):
"""Return the raw transcript, the output path and the language of the speech."""
if args.url is not None:
info, lines = fetch_text(args.url, args.lang, args.start, args.ende)
info, lines = fetch_text(args.url, args.lang, args.start, args.ende, args.exakt)
lang = base_language(args.lang or original_language(info) or DEFAULT_LANGUAGE)
if lang not in PROMPTS:
raise SystemExit(
@ -558,7 +569,7 @@ def read_source(args):
raw = args.input.read_text(encoding="utf-8-sig")
if args.input.suffix.lower() == ".vtt":
raw = "\n".join(vtt_to_lines(raw, args.start, args.ende))
raw = "\n".join(vtt_to_lines(raw, args.start, args.ende, args.exakt))
return raw, args.output, base_language(args.lang or DEFAULT_LANGUAGE)
@ -583,7 +594,8 @@ def main():
)
terms += more_terms
replacements += more_replacements
system = build_system(terms, lang)
excerpt = args.start is not None or args.ende is not None
system = build_system(terms, lang, excerpt)
# Subtitle line breaks carry no meaning; send plain running text
text = " ".join(raw.split())