При разработке систем распознавания речи мы сталкиваемся с заблуждениями среди потребителей и разработчиков, в первую очередь связанными с разделением формы и сути. Одним из таких заблуждений является то, что в устной речи якобы "можно услышать" грамматически верные знаки препинания и пробелы между словами, когда по факту реальная устная речь и грамотная письменная речь очень сильно отличаются (устная речь скорее похожа на "поток" слегка разделенный паузами и интонацией, поэтому люди так не любят монотонно бубнящих докладчиков). Понятно, что можно просто начинать каждое высказывание с большой буквы и ставить точку в конце. Но хотелось бы иметь какое-то относительно простое и универсальное средство расстановки знаков препинания и заглавных букв в предложениях, которые генерирует наша система распознавания речи. Совсем хорошо бы было, если бы такая система в принципе работала с любыми текстами. По этой причине мы бы хотели поделиться с сообществом системой, которая: На всякий случай явно повторюсь — цель такой системы — лишь улучшать читабельность текста. Она не добавляет в текст информации, которой в нем изначально не было. На вход подается предложение, записанное строчными буквами и без какой-либо пунктуации — как мы обычно получаем на выходе системы распознавания речи. Требуется разработать модель, восстанавливающую его грамотную запись в смысле использования заглавных букв и знаков препинания. Набор знаков препинания .,—!?- был выбран исходя из оценки того, отсутствие каких символов наиболее бросается в глаза в предложениях, которые в среднем встречаются в речи в целевых доменах. Кроме того, модель разрабатывалась из предположения, что после, и только после каждого токена сетке следует проставить только одну метку — знака препинания или просто пробела. Это автоматически исключает сложные случаи расстановки пунктуации в начале предложения или из нескольких символов (самый яркий пример — разнообразная прямая речь в литературе). Это упрощение сделано намеренно, т.к. нам показалось, что такое ограничение более конструктивно, чем учет всех малочисленных краевых случаев. И вообще главная задача, скорее, в улучшении читабельности, чем в идеальной записи составной прямой речи с обращениями и описаниями. Задачу предполагалось сразу решать для нескольких основных языков. При этом модель по построению может быть легко расширена на произвольное количество языков, с которыми мы работаем, при наличии потребности и соответствующих корпусов данных. Решение виделось прежде всего в виде какой-то малой бертоподобной модели с классифицирующими слоями поверх. В качестве данных для обучения использовались приватные корпуса, уже имевшиеся в наличии. Мы ознакомились с недавним решением смежной задачи от коллег, однако, для наших целей требовалась: В результате у нашего решения из значительных зависимостей только сам PyTorch, никаких специализированных библиотек. По возможности мы хотели взять небольшую предобученную языковую модель. Однако, поиск по списку готовых моделей, доступных на https://huggingface.co/, дает не самые обнадеживающие результаты: требование мультиязычности и уменьшения модели, например, дистилляции, по сути приводят нас к единственной доступной опции, и то с весом в полгигабайта. Здесь, наверное можно сделать ремарку про степень полезности "революции трансформеров" в NLP, но напрашивающиеся выводы мы оставим на усмотрение читателя. Мы экспериментировали с разными архитектурами, но в итоге остановились на самой простой, и итоговый размер модели составил 520 мегабайт.  Такой размер дистилированного берта в основе нас не вполне устроил, и мы попробовали сжать обученную модель. Самый простой и эффективный способ — конечно, квантизация (причем сочетание статической и динамической как здесь) — и в результате модель была ужата до 130 мегабайт без значимой потери качества, потому всюду далее будут именно метрики финальной квантизованной модели. Кроме того, мы сократили избыточный для нашей задачи словарь, выкинув токены для других языков, что позволило сжать эмбеддинг размера 120 тысяч токенов (размер токена — аж 768) до более приятных 75 тысяч. Наверняка можно было еще подрезать не самые часто используемые токены и применить оставшиеся более продвинутые методы сжатия моделей (факторизацию и замену механизма "внимания" на более простые аналоги), но мы решили остановиться, поскольку модель уже стала меньше 100 мегабайт. Вопреки всеобщему тренду на сенсационализм и утрату рационального мышления, во всех наших статьях мы стараемся показывать максимально подробные, информативные и честные метрики на разных данных. В данном случае приведем метрики полученной модели на: В качестве метрик в этой задаче используем: Для корректного и информативного расчета метрик из текстов были выброшены: На вход модели подавались отдельные предложения, а не наборы предложений. В ячейках указан WER_p / WER_c, а наивный бейзлайн состоит в постановке заглавной буквы в начале предложения и точки в конце. Домен — валидационные данные: Домен — книги: Домен — валидационные данные: Домен — книги: Как можно заметить из таблиц — даже для русского, значения дефиса остались пустыми, потому что на использовавшихся для расчета метрик данных модель предлагала его не проставлять вовсе, либо заменять дефис каким-нибудь иным символом (как видно в матрицах ниже); похоже, он лучше расставляется в случае предложений в форме определений (см. пример в конце статьи). Приведем доступные F1 метрики из разных статей, где решались смежные задачи — здесь разные языки, разные валидационные данные, поэтому напрямую сравнить не удастся, но можно оценить порядок цифр. Cистема классов в таких работах тоже обычно иная — COMMA, PERIOD, QUESTION: Матрицы по книжкам: 
 
 
 
 Глядя на то, что для домена книг все же не везде метрики выглядят информативными и иногда совпадают с тривиальным решением, мы добавили и примеры именно текстов — для сравнения оригинальной расстановки пунктуации и заглавных букв с результатом работы модели.  Здесь более наглядны особенности работы модели: Но тут нет ничего удивительного — новой информации модель не создает (никак неиссякаемая тугая струя желтых статей про "zoom and enhance" на Хабре удручает), мысли автора текста не читает и вообще по сути просто делает текст более привычным глазу. Модель выложена в репозитории проекта silero-models и, соответственно, будет поддерживаться, как и прочие наши решения оттуда. А вот простой запуск модели (с более подробными примерами можно ознакомиться в colab):  У данной работы есть ряд ограничений и очевидных вещей, которые мы решили пока не делать (так сказать нужно же было где-то поставить точку): Нам более-менее очевидно, как сделать большую часть этих вещей, но только время и разведка боем покажет востребованность подобного рода инструментов. Machine Learning / Data Science