Speak aspect ratios correctly in TTS
This commit is contained in:
1 parent
f1ed51a302
commit
2724861224
2 files changed
+54
-1
No files matched your search
@@ -269,6 +269,36 @@ def _spoken_ipv4(match: re.Match) -> str:
|
||||
return " Punkt ".join(str(int(part)) for part in match.group(0).split("."))
|
||||
|
||||
|
||||
def _normalize_aspect_ratios(text: str) -> str:
|
||||
"""Speak colon notation as a ratio only when the surrounding text says so.
|
||||
|
||||
A bare ``16:09`` remains a clock time. This deliberately avoids a global
|
||||
replacement of common ratios because ``16:9`` can also be a valid time.
|
||||
"""
|
||||
cue = (
|
||||
r"(?:Seitenverh[aä]ltnis|Bildseitenverh[aä]ltnis|Bildformat|"
|
||||
r"Videoformat|Hochformat|Querformat|Format|Aspect[- ]?Ratio)"
|
||||
)
|
||||
text = re.sub(
|
||||
rf"\b({cue}\b(?:\s+(?:von|im|ist|betr[aä]gt))?\s*[\(\[]?\s*)"
|
||||
rf"(\d{{1,3}})\s*:\s*(\d{{1,3}})",
|
||||
lambda match: (
|
||||
f"{match.group(1)}{int(match.group(2))} zu {int(match.group(3))}"
|
||||
),
|
||||
text,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
return re.sub(
|
||||
rf"\b(\d{{1,3}})\s*:\s*(\d{{1,3}})"
|
||||
rf"(\s*[-‐‑‒–—−]?\s*{cue}\b)",
|
||||
lambda match: (
|
||||
f"{int(match.group(1))} zu {int(match.group(2))}{match.group(3)}"
|
||||
),
|
||||
text,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
|
||||
|
||||
def normalize_for_german_speech(text: str) -> str:
|
||||
"""Turn common visual notation into unambiguous spoken German."""
|
||||
text = re.sub(r"\bv\.\s*a\.", "vor allem", text, flags=re.IGNORECASE)
|
||||
@@ -281,10 +311,14 @@ def normalize_for_german_speech(text: str) -> str:
|
||||
_spoken_ipv4,
|
||||
text,
|
||||
)
|
||||
# A colon is ambiguous between an aspect ratio and a clock time. Resolve
|
||||
# ratios first, but only when an explicit format cue is present.
|
||||
text = _normalize_aspect_ratios(text)
|
||||
text = re.sub(
|
||||
r"\b([01]?\d|2[0-3]):([0-5]\d)\b",
|
||||
r"\b([01]?\d|2[0-3]):([0-5]\d)\b(?:\s*Uhr\b)?",
|
||||
lambda match: f"{int(match.group(1))} Uhr {int(match.group(2))}",
|
||||
text,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
text = re.sub(
|
||||
r"\b([01]?\d|2[0-3])\s*[-‐‑‒–—−]\s*"
|
||||
|
||||
Reference in new issue
Block a user