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

Акцентор для русского языка для на базе модели со словарем на уровне символов

5м. чтение

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

О чём речь

Разрабатывая систему синтеза речи на базе 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

Точность

~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)

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

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

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

python

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( 'snakers4/silero-models', 'silero_tts', language='ru' ) # Подготовка текста text = "Мама мыла раму." accented = accentor(text, format='synthesis') # Синтез audio = model.apply_tts(text=accented, speaker='baya')

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

✅ Используйте 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. Какие фичи были бы полезны?

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу [email protected] для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.