Smooth Hermes TTS sentence transitions
This commit is contained in:
@@ -224,6 +224,40 @@ def _spoken_date(match: re.Match) -> str:
|
||||
return result
|
||||
|
||||
|
||||
def _spoken_short_date_range(match: re.Match) -> str:
|
||||
first_day = int(match.group(1))
|
||||
last_day = int(match.group(2))
|
||||
month = int(match.group(3))
|
||||
year = match.group(4)
|
||||
month_name = GERMAN_MONTHS.get(month)
|
||||
if not month_name or not 1 <= first_day <= 31 or not 1 <= last_day <= 31:
|
||||
return match.group(0)
|
||||
result = f"{first_day}. bis {last_day}. {month_name}"
|
||||
if year:
|
||||
result += f" {year}"
|
||||
return result
|
||||
|
||||
|
||||
def _spoken_full_date_range(match: re.Match) -> str:
|
||||
first_day = int(match.group(1))
|
||||
first_month = int(match.group(2))
|
||||
last_day = int(match.group(3))
|
||||
last_month = int(match.group(4))
|
||||
year = match.group(5)
|
||||
first_name = GERMAN_MONTHS.get(first_month)
|
||||
last_name = GERMAN_MONTHS.get(last_month)
|
||||
if (not first_name or not last_name
|
||||
or not 1 <= first_day <= 31 or not 1 <= last_day <= 31):
|
||||
return match.group(0)
|
||||
if first_month == last_month:
|
||||
result = f"{first_day}. bis {last_day}. {last_name}"
|
||||
else:
|
||||
result = f"{first_day}. {first_name} bis {last_day}. {last_name}"
|
||||
if year:
|
||||
result += f" {year}"
|
||||
return result
|
||||
|
||||
|
||||
def _spell_digits(value: str) -> str:
|
||||
return " ".join(GERMAN_DIGITS[digit] for digit in value)
|
||||
|
||||
@@ -277,6 +311,20 @@ def normalize_for_german_speech(text: str) -> str:
|
||||
text,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
# Date ranges are deliberately strict: both variants require dotted
|
||||
# calendar notation, so ordinary numeric ranges remain untouched.
|
||||
text = re.sub(
|
||||
r"\b([0-3]?\d)\.([01]?\d)\.\s*[-‐‑‒–—−]\s*"
|
||||
r"([0-3]?\d)\.([01]?\d)\.(?:(\d{4})\b)?",
|
||||
_spoken_full_date_range,
|
||||
text,
|
||||
)
|
||||
text = re.sub(
|
||||
r"\b([0-3]?\d)\.\s*[-‐‑‒–—−]\s*"
|
||||
r"([0-3]?\d)\.([01]?\d)\.(?:(\d{4})\b)?",
|
||||
_spoken_short_date_range,
|
||||
text,
|
||||
)
|
||||
text = re.sub(
|
||||
r"\b([0-3]?\d)\.([01]?\d)\.(?:(\d{4})\b)?",
|
||||
_spoken_date,
|
||||
|
||||
Reference in New Issue
Block a user