Привет Хабр, решил поделиться небольшой моделью для расстановки ударений, которую обучил на датасете, из более 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 |
|
Моя ниша: когда точность важнее скорости. Подготовка аудиокниг, учебные материалы, эталонные датасеты.
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 "ваш текст здесь"
Полезные ссылки:
Обратная связь:
-
Issues на GitHub — баги и предложения
-
Discussions — вопросы и идеи
-
Pull requests — помощь в разработке
Итого
Модель ruaccent-predictor — инструмент для точной расстановки ударений:
>99% точности — меньше ошибок чем у аналогов на художественных текстах
Один pip install — работает из коробки
Два формата — для чтения и TTS
Открытый код — MIT, используйте как хотите
Не заменяет Silero в real-time, но хорош для оффлайн работы. В настоящий момент мой пайплайн включает комбинированную обработку silero-stress и ruaccent-predictor.
Попробуйте и поделитесь опытом в комментариях!
Вопросы к сообществу:
-
Используете ли модели для расстановки ударений? Какие?
-
Какая точность достаточна для ваших задач?
-
Какие фичи были бы полезны?
Автор: Kubataba


