Привет Хабр, решил поделиться небольшой моделью для расстановки ударений, которую обучил на открытом датасете из более чем 400 книг художественной прозы в открытом источнике.
Разрабатывая систему синтеза речи на базе Silero TTS, столкнулся с проблемой: минимальные ошибки в расстановке ударений всего два процента из 100 приводят к ошибкам в каждом из 5-6 предложений. Для аудиокниг это критично, так процесс "выслушивания" и правки книги на 10000 предожений потребует не менее 10 часов ручного времени.
Сделал свою модель с фокусом на точность в хужожественных книгах. Получилось 99.7% на валидационном датасете. Упаковал в pip-пакет ruaccent-predictor.
Что умеет:
pip install ruaccent-predictor ruaccent "мама мыла раму" # → ма'ма мы'ла ра'му
Код и модель на GitHub, лицензия MIT.
Silero-Stress — классная модель. Быстрая, бесплатная, для большинства задач достаточно точная.
Но:
|
Что важно |
Silero |
ruaccent |
|---|---|---|
|
Точность |
~98% |
>99% |
|
10k предложений |
2-3 мин |
~60 мин |
|
Ошибок на 10k |
~200 |
~30 |
|
Вес модели акцентора |
50 Mb |
|
Моя ниша: когда точность важнее скорости. Подготовка аудиокниг, учебные материалы, эталонные датасеты.
Silero-stress остаётся королём для real-time. Моя модель — для создателей аудиокниг.
Вместо работы со словами обучил модель на символах. Почему:
✅ Словарь всего 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 для прозрачности методики обучения.
Использовал датасет Accentual-Syllabic Verse in Russian Prose — 400+ художественных произведений с ручной разметкой ударений.
Обработка:
470,000+ строк ↓ фильтрация (заголовки, короткие, без ударений) 224,000 валидных пар ↓ split 202k train + 22k validation
Словарь извлекается автоматически из данных:
Кириллица (А-Я, а-я, ё)
Пунктуация
Латиница (для иностранных слов)
Итого: 224 символа
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)
Повторяющиеся фразы ("сказал он", "ответила она") кэшируются:
python
accentor("привет мир") # ~0.5 сек accentor("привет мир") # ~0.0001 сек (из кэша!)
На практике экономит ~30% времени при обработке книг.
# Медленно 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)
На валидации (22,000 предложений):
✅ Правильно: 21,934
❌ Ошибки: 66
Сложные составные слова (~40%)
"сельскохозяйственный" — путается на внутренних слогах
Омографы без контекста (~30%)
"замок" → за'мок или замо'к? Без контекста сложно
Поэтические вольности (~20%)
Авторская метрика vs обычное произношение
Редкие слова (~10%)
Не исправляет "е" на "ё"
"Он подошел" → "Он подоше'л" (не "подошёл")
Не ставит ударения на "ё"
"ёлка" → "ёлка" (ё всегда ударная)
Не отмечает односложные
"я иду" → "я иду'" (не "я' иду'")
# Проверка $ ruaccent "замок на замке" за'мок на за'мке # Файл $ ruaccent -i book.txt -o book_accented.txt Processing 254 lines... Done in 42s # Формат Silero $ ruaccent --format synthesis "привет" прив+ет
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')
from ruaccent import load_accentor import torch accentor = load_accentor() # Загрузка Silero model, _ = torch.hub.load( 'snakers4/silero-models', 'silero_tts', language='ru' ) # Подготовка текста text = "Мама мыла раму." accented = accentor(text, format='synthesis') # Синтез audio = model.apply_tts(text=accented, speaker='baya')
Готовите аудиокниги (точность критична)
Делаете учебные материалы по русскому языку
Создаёте датасеты для других моделей
Нужна максимальная точность, время не критично
Синтезируете в реальном времени
Восстанавливаете е в ё
Хотите обрабатывать омографы через контекст
Нужна скорость
Ближайшее:
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.
Попробуйте и поделитесь опытом в комментариях!
Вопросы к сообществу:
Используете ли модели для расстановки ударений? Какие?
Какая точность достаточна для ваших задач?
Какие фичи были бы полезны?
Источник


