- BrainTools - https://www.braintools.ru -
Привет Хабр, решил поделиться небольшой моделью для расстановки ударений, которую обучил на датасете, из более 400 книг художественной прозы с лицензией MIT.
Разрабатывая систему синтеза речи на базе Silero TTS, столкнулся с проблемой: минимальные ошибки [1] в расстановке ударений всего два процента из 100 приводят к ошибкам в каждом из 5-6 предложений. Для аудиокниг это критично, так процесс “выслушивания” и правки книги на 10000 предожений потребует не менее 10 часов ручного времени.
Сделал свою модель с фокусом на точность в хужожественных книгах. Получилось 99.7% на валидационном датасете. Упаковал в pip-пакет ruaccent-predictor.
Что умеет:
pip install ruaccent-predictor
ruaccent "мама мыла раму"
# → ма'ма мы'ла ра'му
Код и модель на GitHub [3], лицензия MIT.
Silero-Stress [4]— классная модель. Быстрая, бесплатная, для большинства задач достаточно точная.
Но:
|
Что важно |
Silero |
ruaccent-predictor |
|---|---|---|
|
Точность |
~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 выложил все коды подготовки датасета и обучения [5] модели, словарь vocab.json для прозрачности методики обучения.
Использовал датасет Accentual-Syllabic Verse in Russian Prose [6] — 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)
Повторяющиеся фразы (“сказал он”, “ответила она”) кэшируются:
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(
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')
Готовите аудиокниги (точность критична)
Делаете учебные материалы по русскому языку
Создаёте датасеты для других моделей
Нужна максимальная точность, время не критично
Синтезируете в реальном времени
Восстанавливаете е в ё
Хотите обрабатывать омографы через контекст
Нужна скорость
Ближайшее:
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.
Попробуйте и поделитесь опытом [8] в комментариях!
Вопросы к сообществу:
Используете ли модели для расстановки ударений? Какие?
Какая точность достаточна для ваших задач?
Какие фичи были бы полезны?
Автор: Kubataba
Источник [9]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/25208
URLs in this post:
[1] ошибки: http://www.braintools.ru/article/4192
[2] Image: https://sourcecraft.dev/
[3] GitHub: https://github.com/kubataba/Russian-Stress-Accent-Predictor
[4] Silero-Stress : https://github.com/snakers4/silero-stress
[5] обучения: http://www.braintools.ru/article/5125
[6] Accentual-Syllabic Verse in Russian Prose: https://huggingface.co/datasets/nevmenandr/accentual-syllabic-verse-in-russian-prose
[7] PyPI: https://pypi.org/project/ruaccent-predictor/
[8] опытом: http://www.braintools.ru/article/6952
[9] Источник: https://habr.com/ru/articles/992892/?utm_campaign=992892&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.