Перейти к содержанию

Text Preprocessor

Обработка текста для TTS: числа в слова, нормализация.

Возможности

  • Числа в слова (русский язык)
  • Даты в текст
  • Аббревиатуры
  • Телефоны
  • Валюта
  • Нормализация пунктуации

Использование

Числа в слова

from kit.utils import TextPreprocessor

preprocessor = TextPreprocessor(language="ru")

# Базовые числа
text = preprocessor.numbers_to_words("У меня 5 яблок и 12 груш")
# "У меня пять яблок и двенадцать груш"

# Большие числа
text = preprocessor.numbers_to_words("Население: 145000000 человек")
# "Население: сто сорок пять миллионов человек"

# Дробные
text = preprocessor.numbers_to_words("Цена: 99.99 рублей")
# "Цена: девяносто девять целых девяносто девять сотых рублей"

Даты

text = preprocessor.process_dates("Встреча 15.03.2024 в 14:30")
# "Встреча пятнадцатого марта две тысячи двадцать четвёртого года в четырнадцать тридцать"

# Разные форматы
text = preprocessor.process_dates("2024-03-15")
# "пятнадцатое марта две тысячи двадцать четвёртого года"

Валюта

text = preprocessor.process_currency("Цена: $150 или 15000₽")
# "Цена: сто пятьдесят долларов или пятнадцать тысяч рублей"

text = preprocessor.process_currency("€50.99")
# "пятьдесят евро девяносто девять центов"

Телефоны

text = preprocessor.process_phones("+7 (999) 123-45-67")
# "плюс семь девятьсот девяносто девять сто двадцать три сорок пять шестьдесят семь"

Аббревиатуры

preprocessor = TextPreprocessor(
    abbreviations={
        "США": "Соединённые Штаты Америки",
        "РФ": "Российская Федерация",
        "ИИ": "искусственный интеллект"
    }
)

text = preprocessor.expand_abbreviations("ИИ развивается в США и РФ")
# "искусственный интеллект развивается в Соединённых Штатах Америки и Российской Федерации"

Полная обработка

text = preprocessor.process(
    "В 2024 году ИИ в США достиг оборота $500 млрд. Контакт: +1-555-123-4567"
)
# "В две тысячи двадцать четвёртом году искусственный интеллект
#  в Соединённых Штатах Америки достиг оборота пятьсот миллиардов долларов.
#  Контакт: плюс один пятьсот пятьдесят пять сто двадцать три сорок пять шестьдесят семь"

Нормализация для TTS

# Удаление нечитаемых символов
text = preprocessor.normalize_for_tts("Привет!!! Как дела???")
# "Привет! Как дела?"

# Разбиение на предложения
sentences = preprocessor.split_sentences("Привет. Как дела? Отлично!")
# ["Привет.", "Как дела?", "Отлично!"]

API Reference

TextPreprocessor

class TextPreprocessor:
    def __init__(
        self,
        language: str = "ru",
        abbreviations: dict = None
    )

    def numbers_to_words(self, text: str) -> str
    def process_dates(self, text: str) -> str
    def process_currency(self, text: str) -> str
    def process_phones(self, text: str) -> str
    def expand_abbreviations(self, text: str) -> str
    def normalize_for_tts(self, text: str) -> str
    def split_sentences(self, text: str) -> List[str]

    def process(
        self,
        text: str,
        numbers: bool = True,
        dates: bool = True,
        currency: bool = True,
        phones: bool = True,
        abbreviations: bool = True,
        normalize: bool = True
    ) -> str

Примеры из production

Autoshorts — подготовка скрипта для озвучки

class ScriptPreprocessor:
    def __init__(self):
        self.preprocessor = TextPreprocessor(
            language="ru",
            abbreviations={
                "ИИ": "искусственный интеллект",
                "IT": "ай ти",
                "CEO": "генеральный директор",
                "API": "эй пи ай"
            }
        )

    def prepare_for_tts(self, script: str) -> str:
        """Подготовка скрипта для TTS."""
        # Полная обработка
        processed = self.preprocessor.process(script)

        # Добавление пауз
        processed = self.add_pauses(processed)

        return processed

    def add_pauses(self, text: str) -> str:
        """Добавление пауз в нужных местах."""
        # Пауза после заголовков
        text = re.sub(r'([.!?])\s*\n', r'\1 <break time="500ms"/> ', text)

        # Пауза перед важными словами
        important = ["важно", "внимание", "итак"]
        for word in important:
            text = text.replace(f" {word}", f' <break time="200ms"/> {word}')

        return text

DedMoroz.ai — обработка имён

class GreetingPreprocessor:
    def __init__(self):
        self.preprocessor = TextPreprocessor()

    def process_greeting(self, name: str, text: str) -> str:
        """Обработка поздравления с именем."""
        # Обработка чисел и дат
        text = self.preprocessor.process(text)

        # Склонение имени (упрощённо)
        text = text.replace("{name}", name)
        text = text.replace("{name_dat}", self.to_dative(name))

        return text

    def to_dative(self, name: str) -> str:
        """Простое склонение в дательный падеж."""
        if name.endswith("а"):
            return name[:-1] + "е"
        elif name.endswith("я"):
            return name[:-1] + "е"
        elif name.endswith(("й", "ь")):
            return name[:-1] + "ю"
        return name + "у"

# "Дорогому {name_dat}! В 2024 году желаю 1000 удач!"
# -> "Дорогому Саше! В две тысячи двадцать четвёртом году желаю тысячу удач!"