Привет Хабр, решил поделиться небольшой моделью для расстановки ударений, которую обучил на датасете, из более 400 книг художественной прозы с лицензией MIT.

О чём речь

Разрабатывая систему синтеза речи на базе Silero TTS, столкнулся с проблемой: минимальные ошибки в расстановке ударений всего два процента из 100 приводят к ошибкам в каждом из 5-6 предложений. Для аудиокниг это критично, так процесс "выслушивания" и правки книги на 10000 предожений потребует не менее 10 часов ручного времени.

Сделал свою модель с фокусом на точность в хужожественных книгах. Получилось 99.7% на валидационном датасете. Упаковал в pip-пакет ruaccent-predictor.

Что умеет:

pip install ruaccent-predictor
ruaccent "мама мыла раму"
# → ма'ма мы'ла ра'му

Код и модель на GitHub, лицензия MIT.

Почему не достаточно Silero stress?

Silero-Stress — классная модель. Быстрая, бесплатная, для большинства задач достаточно точная.

Но:

Что важно

Silero

ruaccent-predictor

Точность

~98%

>99%

10k предложений

2-3 мин

~60 мин

Ошибок на 10k

~200

~30

Вес модели акцентора

50 Mb

30 Mb

Моя ниша: когда точность важнее скорости. Подготовка аудиокниг, учебные материалы, эталонные датасеты.

Silero-stress остаётся королём для real-time. Моя модель — для создателей аудиокниг.

Как это работает

Character-level подход

Вместо работы со словами обучил модель на символах. Почему:

  • ✅ Словарь всего 224 символа (vs десятки тысяч слов)

  • ✅ Работает с любыми словами, даже с опечатками

  • ✅ Компактно: 12.5M параметров (~30 MB)

Два формата вывода

# Апостроф после гласной (для чтения)
"В лесу' родила'сь ёлочка"

# Плюс перед гласной (для Silero TTS)
"В лес+у род+илась ёлочка"

Модель обучалась на апострофах, но я добавил автоконвертацию в формат Silero. Получился универсальный инструмент.

Архитектура

Transformer Encoder-Decoder
├─ 4 слоя encoder + 4 слоя decoder
├─ 8 attention heads
├─ 256 dimensions
└─ 12.5M параметров

Для сравнения: GPT-2 имеет 117M параметров. Моя модель в 10 раз меньше. На Github выложил все коды подготовки датасета и обучения модели, словарь vocab.json для прозрачности методики обучения.

Данные: 400+ книг

Использовал датасет Accentual-Syllabic Verse in Russian Prose — 400+ художественных произведений с валидацией пар при отборе.

Обработка:

470,000+ строк
  ↓ фильтрация (заголовки, короткие, без ударений)
224,000 валидных пар
  ↓ split
202k train + 22k validation

Словарь извлекается автоматически из данных:

  • Кириллица (А-Я, а-я, ё)

  • Пунктуация

  • Латиница (для иностранных слов)

  • Итого: 224 символа

Главная фича: теперь это pip-пакет

pip install ruaccent-predictor
ruaccent "привет мир"

Что сделал:

1. Упаковал в PyPI

  • Модель скачивается автоматически при первом запуске

  • Кэшируется локально

  • Работает offline после первой загрузки

2. Добавил CLI

# Быстрая проверка
ruaccent "текст для проверки"

# Файл целиком
ruaccent -i book.txt -o result.txt

# Формат для Silero
ruaccent --format synthesis "привет"

# Через pipe
cat file.txt | ruaccent

3. Простой Python API

from ruaccent import load_accentor

accentor = load_accentor()

# Одно предложение
result = accentor("привет мир")

# Batch обработка (быстрее)
results = accentor(texts, batch_size=8)

Производительность

Умное кэширование

Повторяющиеся фразы ("сказал он", "ответила она") кэшируются:

accentor("привет мир")  # ~0.5 сек
accentor("привет мир")  # ~0.0001 сек (из кэша!)

На практике экономит ~30% времени при обработке книг.

Batch-обработка

# Медленно
for text in texts:
    result = accentor(text)

# Быстро (в 4 раза)
results = accentor(texts, batch_size=8)

Бенчмарки (Mac Mini M4):

Batch Size

Скорость

1

2.5 предл/сек

8

10.1 предл/сек

32

8.7 предл/сек

Оптимум — batch_size=8.

Поддержка железа

accentor = load_accentor(device='auto')
# → CUDA (NVIDIA GPU)
# → MPS (Apple Silicon)
# → CPU (fallback)

Точность: 99.7%

На валидации (22,000 предложений):

  • ✅ Правильно: 21,934

  • ❌ Ошибки: 66

    Сложные составные слова (~40%)

    • "сельскохозяйственный" — путается на внутренних слогах

    Омографы без контекста (~30%)

    • "замок" → за'мок или замо'к? Без контекста сложно

    Поэтические вольности (~20%)

    • Авторская метрика vs обычное произношение

    Редкие слова (~10%)

Важные ограничения

  • Не исправляет "е" на "ё"

"Он подошел" → "Он подоше'л" (не "подошёл")
  • Не ставит ударения на "ё"

"ёлка" → "ёлка" (ё всегда ударная)
  • Не отмечает односложные

"я иду" → "я иду'" (не "я' иду'")

Примеры использования

CLI для быстрых задач

# Проверка
$ ruaccent "замок на замке"
за'мок на за'мке

# Файл
$ ruaccent -i book.txt -o book_accented.txt
Processing 254 lines... Done in 42s

# Формат Silero
$ ruaccent --format synthesis "привет"
прив+ет

Python для интеграции

from ruaccent import load_accentor

accentor = load_accentor()

# Простой случай
text = "Мама мыла раму."
print(accentor(text))
# → Ма'ма мы'ла ра'му.

# Batch
texts = ["первое", "второе", "третье"]
results = accentor(texts, batch_size=8)

# Оба формата
apostrophe, synthesis = accentor(text, format='both')

Интеграция с Silero TTS

from ruaccent import load_accentor
import torch

accentor = load_accentor()

# Загрузка Silero
model, _ = torch.hub.load(
     repo_or_dir='snakers4/silero-models',
     model='silero_tts',
     language='ru',
     speaker='v5_cis_base'    
)

# Подготовка текста
text = "Мама мыла раму."
accented = accentor(text, format='synthesis')

# Синтез
audio = model.apply_tts(text=accented, speaker='ru_eduard')

Кому это подойдёт

✅ Используйте ruaccent-predictor если:

  • Готовите аудиокниги (точность критична)

  • Делаете учебные материалы по русскому языку

  • Создаёте датасеты для других моделей

  • Нужна максимальная точность, время не критично

❌ Используйте Silero-stress если:

  • Синтезируете в реальном времени

  • Восстанавливаете е в ё

  • Хотите обрабатывать омографы через контекст

  • Нужна скорость

Планы развития

Ближайшее:

  • Quantization для CPU (2-3x ускорение)

  • Web-демо для тестирования

  • Docker контейнер с REST API

Среднесрочное:

  • Решение омографов через контекст

  • Одновременно ударения + ё-фикация

  • Специализация под поэзию/прозу

Попробуйте

pip install ruaccent-predictor
ruaccent "ваш текст здесь"

Полезные ссылки:

  • GitHub — код, модель, примеры

  • PyPI — установка

  • Датасет — обучающие данные

Обратная связь:

  • Issues на GitHub — баги и предложения

  • Discussions — вопросы и идеи

  • Pull requests — помощь в разработке

Итого

Модель ruaccent-predictor — инструмент для точной расстановки ударений:

>99% точности — меньше ошибок чем у аналогов на художественных текстах
Один pip install — работает из коробки
Два формата — для чтения и TTS
Открытый код — MIT, используйте как хотите

Не заменяет Silero в real-time, но хорош для оффлайн работы. В настоящий момент мой пайплайн включает комбинированную обработку silero-stress и ruaccent-predictor.

Попробуйте и поделитесь опытом в комментариях!

Вопросы к сообществу:

  1. Используете ли модели для расстановки ударений? Какие?

  2. Какая точность достаточна для ваших задач?

  3. Какие фичи были бы полезны?