Edit tts mode

This commit is contained in:
2026-04-13 18:33:19 +03:00
parent 780f6f0084
commit 7239f85506
6 changed files with 98 additions and 22 deletions

View File

@@ -1,12 +1,65 @@
import re
# Единицы измерения со слэшем — раскрываем до чтения слэша
UNIT_SLASH = [
(r'\bкм\s*/\s*ч\b', 'километров в час'),
(r'\\s*/\s*с\b', 'метров в секунду'),
(r'\bкм\s*/\s*с\b', 'километров в секунду'),
(r'\б\s*/\s*с\b', 'мегабит в секунду'),
(r'\bгб\s*/\s*с\b', 'гигабит в секунду'),
(r'\bруб\s*/\s*мес\b', 'рублей в месяц'),
(r'\bр\s*/\s*мес\b', 'рублей в месяц'),
]
def clean_for_speech(text: str) -> str:
text = re.sub(r'\*+', '', text) # убрать **жирный**
text = re.sub(r'#+\s', '', text) # убрать ## заголовки
text = re.sub(r'- ', '', text) # убрать тире списков
text = re.sub(r'\[.*?\]\(.*?\)', '', text) # убрать ссылки
text = re.sub(r'\n+', '. ', text) # переносы → точки
# составные единицы со слэшем — до общей замены `/`
for pat, repl in UNIT_SLASH:
text = re.sub(pat, repl, text, flags=re.IGNORECASE)
# знаки перед числом: "+9", "-3", "±2"
text = re.sub(r'(^|\s)\+(\d)', r'\1плюс \2', text)
text = re.sub(r'(^|\s)-(\d)', r'\1минус \2', text)
text = re.sub(r'±(\d)', r'плюс-минус \1', text)
# дроби и отношения "12/15" → "12 из 15", "5/10" → "5 из 10"
text = re.sub(r'(\d+)\s*/\s*(\d+)', r'\1 из \2', text)
# одиночный слэш — как союз "или"
text = text.replace('/', ' или ')
# градусы и прочие символы
text = re.sub(r'°\s*C\b', ' градусов', text, flags=re.IGNORECASE)
text = re.sub(r'°\s*F\b', ' градусов Фаренгейта', text, flags=re.IGNORECASE)
text = text.replace('°', ' градусов')
text = text.replace('%', ' процентов')
text = text.replace('', ' номер ')
text = text.replace('&', ' и ')
text = text.replace('@', ' собака ')
text = text.replace('×', ' на ')
# распространённые сокращения в полную форму — иначе TTS буквоедит
abbr = [
(r'\\.\s*е\.', 'то есть'),
(r'\\.\s*к\.', 'так как'),
(r'\\.\s*д\.', 'так далее'),
(r'\\.\s*п\.', 'тому подобное'),
(r'\\s*т\.\s*д\.', 'и так далее'),
(r'\\s*т\.\s*п\.', 'и тому подобное'),
(r'\bпо-\s*русски\b', 'по-русски'),
]
for pat, repl in abbr:
text = re.sub(pat, repl, text, flags=re.IGNORECASE)
# схлопываем дубли пунктуации
text = re.sub(r'([:;,!?])\s*\.', r'\1', text)
text = re.sub(r'\.\s*\.+', '.', text)
text = re.sub(r'\s+', ' ', text) # лишние пробелы
text = re.sub(r'(\d+)\.(\s)', r'\1\2', text)
return text.strip()