Привет Хабр, решил поделиться небольшой моделью для расстановки ударений, которую обучил на датасете, из более 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.
Попробуйте и поделитесь опытом в комментариях!
Вопросы к сообществу:
Используете ли модели для расстановки ударений? Какие?
Какая точность достаточна для ваших задач?
Какие фичи были бы полезны?
