- 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 "мама мыла раму"
# → ма'ма мы'ла ра'му
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 1 [2]

Код и модель на GitHub [3], лицензия MIT.

Почему не достаточно Silero stress?

Silero-Stress [4]— классная модель. Быстрая, бесплатная, для большинства задач достаточно точная.

Но:

Что важно

Silero

ruaccent-predictor

Точность

~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)
"В лес+у род+илась ёлочка"
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 2 [2]

Модель обучалась на апострофах, но я добавил автоконвертацию в формат Silero. Получился универсальный инструмент.

Архитектура

Transformer Encoder-Decoder
├─ 4 слоя encoder + 4 слоя decoder
├─ 8 attention heads
├─ 256 dimensions
└─ 12.5M параметров
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 3 [2]

Для сравнения: GPT-2 имеет 117M параметров. Моя модель в 10 раз меньше. На Github выложил все коды подготовки датасета и обучения [5] модели, словарь vocab.json для прозрачности методики обучения.

Данные: 400+ книг

Использовал датасет Accentual-Syllabic Verse in Russian Prose [6] — 400+ художественных произведений с ручной разметкой ударений.

Обработка:

470,000+ строк
  ↓ фильтрация (заголовки, короткие, без ударений)
224,000 валидных пар
  ↓ split
202k train + 22k validation
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 4 [2]

Словарь извлекается автоматически из данных:

  • Кириллица (А-Я, а-я, ё)

  • Пунктуация

  • Латиница (для иностранных слов)

  • Итого: 224 символа

Главная фича: теперь это pip-пакет

pip install ruaccent-predictor
ruaccent "привет мир"
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 5 [2]

Что сделал:

1. Упаковал в PyPI

  • Модель скачивается автоматически при первом запуске

  • Кэшируется локально

  • Работает offline после первой загрузки

2. Добавил CLI

# Быстрая проверка
ruaccent "текст для проверки"

# Файл целиком
ruaccent -i book.txt -o result.txt

# Формат для Silero
ruaccent --format synthesis "привет"

# Через pipe
cat file.txt | ruaccent
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 6 [2]

3. Простой Python API

from ruaccent import load_accentor

accentor = load_accentor()

# Одно предложение
result = accentor("привет мир")

# Batch обработка (быстрее)
results = accentor(texts, batch_size=8)
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 7 [2]

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

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

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

accentor("привет мир")  # ~0.5 сек
accentor("привет мир")  # ~0.0001 сек (из кэша!)
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 8 [2]

На практике экономит ~30% времени при обработке книг.

Batch-обработка

# Медленно
for text in texts:
    result = accentor(text)

# Быстро (в 4 раза)
results = accentor(texts, batch_size=8)
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 9 [2]

Бенчмарки (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)
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 10 [2]

Точность: 99.7%

На валидации (22,000 предложений):

  • ✅ Правильно: 21,934

  • ❌ Ошибки: 66

    Сложные составные слова (~40%)

    • “сельскохозяйственный” — путается на внутренних слогах

    Омографы без контекста (~30%)

    • “замок” → за’мок или замо’к? Без контекста сложно

    Поэтические вольности (~20%)

    • Авторская метрика vs обычное произношение

    Редкие слова (~10%)

Важные ограничения

  • Не исправляет “е” на “ё”

"Он подошел" → "Он подоше'л" (не "подошёл")
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 11 [2]
  • Не ставит ударения на “ё”

"ёлка" → "ёлка" (ё всегда ударная)
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 12 [2]
  • Не отмечает односложные

"я иду" → "я иду'" (не "я' иду'")
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 13 [2]

Примеры использования

CLI для быстрых задач

# Проверка
$ ruaccent "замок на замке"
за'мок на за'мке

# Файл
$ ruaccent -i book.txt -o book_accented.txt
Processing 254 lines... Done in 42s

# Формат Silero
$ ruaccent --format synthesis "привет"
прив+ет
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 14 [2]

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')
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 15 [2]

Интеграция с 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')
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 16 [2]

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

✅ Используйте ruaccent-predictor если:

  • Готовите аудиокниги (точность критична)

  • Делаете учебные материалы по русскому языку

  • Создаёте датасеты для других моделей

  • Нужна максимальная точность, время не критично

❌ Используйте Silero-stress если:

  • Синтезируете в реальном времени

  • Восстанавливаете е в ё

  • Хотите обрабатывать омографы через контекст

  • Нужна скорость

Планы развития

Ближайшее:

  • Quantization для CPU (2-3x ускорение)

  • Web-демо для тестирования

  • Docker контейнер с REST API

Среднесрочное:

  • Решение омографов через контекст

  • Одновременно ударения + ё-фикация

  • Специализация под поэзию/прозу

Попробуйте

pip install ruaccent-predictor
ruaccent "ваш текст здесь"
Посимвольная нейросетевая модель для автоматической акцентуации русского языка - 17 [2]

Полезные ссылки:

  • GitHub [3] — код, модель, примеры

  • PyPI [7] — установка

  • Датасет [6] — обучающие данные

Обратная связь:

  • Issues на GitHub — баги и предложения

  • Discussions — вопросы и идеи

  • Pull requests — помощь в разработке

Итого

Модель ruaccent-predictor — инструмент для точной расстановки ударений:

>99% точности — меньше ошибок чем у аналогов на художественных текстах
Один pip install — работает из коробки
Два формата — для чтения и TTS
Открытый код — MIT, используйте как хотите

Не заменяет Silero в real-time, но хорош для оффлайн работы. В настоящий момент мой пайплайн включает комбинированную обработку silero-stress и ruaccent-predictor.

Попробуйте и поделитесь опытом [8] в комментариях!

Вопросы к сообществу:

  1. Используете ли модели для расстановки ударений? Какие?

  2. Какая точность достаточна для ваших задач?

  3. Какие фичи были бы полезны?

Автор: 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

www.BrainTools.ru

Rambler's Top100