Лёгкий способ написать статью на Хабр, или Привет от SmartSpeech

Привет! Меня зовут Филипенко Владимир и я не писал эту статью. Я её надиктовал. Поправок в этом тексте потребовали только термины, с которыми SmartSpeech ожидаемо не знаком. В остальном оставляю всё как есть.

В материале мы познакомимся с передовым сервисом синтеза и распознавания речи SmartSpeech от Сбера, обсудим его внутренности и разберемся, как этот сервис может облегчить и даже украсить жизнь рядового хабраавтора.

Своими руками я печатал только подчёркнутый текст и гиперссылки (и этот дисклеймер). Так что если заметите орфографические или пунктуационные ошибки — в первую очередь сообщайте о них разработчикам SmartSpeech. Сделать это можно в комментариях к посту.

Общее описание сервиса

SmartSpeech — это современное решение в области речевых технологий, предлагаемое Сбером. На данный момент сервис предоставляет возможности для решения двух задач: распознавания речи по аудиодорожке и синтеза речи по предоставленному тексту. Всё взаимодействие с сервисом реализовано через собственное API, использующее внутри протоколы HTTP и gRPC. То есть все необходимые вычисления происходят на внешнем сервере, что позволяет быстро и дёшево встроить SmartSpeech в систему клиента.
Сервис может применяться (и применяется):
в качестве фреймворка для синтеза речи в интерактивных чатах, инструкциях, и так далее, чтобы пользователь мог не только считывать информацию с экрана, но и воспринимать её на слух

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

для создания IVR (интерактивного голосового меню) и автоматизации контакт-центра, что оптимизирует его работу и снижает нагрузку на сотрудников

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

Распознавание речи

Использование

Естественно перед тем, как сесть за перо, хабраавтору нужно понять о чём писать. Для этого принято проводить интервью с представителями заказчика, в течение которого последние рассказывают о своём продукте и предоставляют всю необходимую информацию. В случае со SmartSpeech беседа с разработчиками в лице руководителя управления речевых и коммуникационных технологий SberDevices Сергея Галустьяна заняла около полутора часов, и, конечно же, была записана на диктофон, чтобы я не забыл никаких деталей. Однако ```.mp3```-файл — это крайне неудобный носитель информации, поэтому резонно было перевести аудиодорожку в текстовое представление, с чем мне и помог SmartSpeech.
Чтобы быстро оценить качество распознавания я воспользовался демоверсией продукта, расположенной на главной странице сервиса.
Демо отлично справилось с простыми предложениями и даже «Ехал грека через реку. Видит Грека  в реке рак» и «Престидижитация» были распознаны правильно. На этом этапе мне удалось подловить систему только на эзотерическом «абракадабра», услышав которое, сервис почему-то перешёл на латиницу и ответил «Abracadabra». Но, справедливости ради, суть была передана верно.
Удостоверившись в базовой работоспособности, я принялся неистово распознавать речь и переводить её в текст. Для этого необходим специальный токен, который можно получить, в случае если зарегистрированная вами организация прошла модерацию. К сожалению я не успел, да и не планировал заводить ООО «Рога И Копыта», поэтому пробный токен мне любезно предоставили сотрудники SberDevices. Помимо доступа для использования сервиса вам понадобится также поверхностное умение использования cURL’a. Если вам так же, как и мне, удобно выполнять нужные действия одной простой командой, то специально для этого разработчики SmartSpeech выложили в открытый доступ несколько скриптов на различных языках программирования для базовых запросов к API, что ещё больше облегчает процедуру распознавания со стороны клиента.
Стоит отметить, что для распознавания речи SmartSpeech предоставляет как *синхронное*, так и *асинхронное* API. Главное их отличие в том, что первое рассчитано на аудиодорожки не более 2 мегабайтов максимальной длительностью в 1 минуту. Причём в случае многоканального аудио распознается только первый канал. Всё это сделано для того, чтобы единоразово и максимально быстро получать ответ, что крайне важно для систем с IVR и голосовыми помощниками. Если же вы заинтересованы в процессинге больших аудиофайлов и время обработки запроса не так важно, то стоит обратить внимание на асинхронное API, принимающее на вход аудиофайлы уже до 1 гигабайта, которое может работать несколько медленнее. Подробнее об их различиях и API в целом можно узнать в документации.
Под мою ситуацию больше подошёл вариант с использованием асинхронного API, воспользоваться которым было так же просто, как написать в командной строке
```python3 recognize_async.py --token "<access_token>" --file "<input>" --output "<output>"```
Через несколько мгновений я получил результат распознавания и принялся за написание этой статьи, однако давайте на минутку остановимся и попытаемся в каком то виде разобраться, что же произошло за эти «несколько мгновений» на стороне сервера:

Техническая сторона

Алгоритм распознавания представляет собой довольно сложную систему, состоящую из нескольких компонент.
Первая из них это акустическая модель на основе нейронной сети QuartzNet, состоящей почти полностью из свёрточных слоёв.
Её задача заключается в предсказании вероятностей букв на выходе. Подробнее об её архитектуре и обучении можно почитать в оригинальной статье и посте. Далее в дело вступает beam search декодер с несколькими модификациями. Что важно, он в состоянии учитывать контекст, подаваемый на вход. Это позволяет всей модели распознавать некоторые специфические термины и именованные сущности. В частности при использовании данного алгоритма в виртуальных ассистентах Салют как контекст используются ваши контакты и названия устройств умного дома из одноименного приложения. Таким образом, модель не запутается, если сказать ей

* переведи Дену 100 рублей*,

или

* включи кондю*,

где «Ден» — друг детства, а «кондя» — название вашего кондиционера. Также поверх этого работают ещё несколько моделей, ответственных за определение конца фразы и нормализацию текста на выходе. В последнюю входит проставление пунктуации, учёт сокращений и аббревиатур и некоторые другие аспекты.
Также стоит отметить высокую скорость работы всей системы, или же *throughput*. Это особенно важно при распознавании речи в случае если данные подаются потоково и в этом плане решение SmartSpeech является одним из самых быстрых на рынке речевых технологий. В моём случае асинхронное распознавание 90 минут речи «весом» 70 мегабайт заняло немногим больше минуты.
Модели учились на десятках тысяч часов голосовых аудиозаписей с использованием PyTorch. Обучение производилось с помощью минимизации классического в speech recognition лосса CTC. Главной end-to-end метрикой всего пайплайна является *word error rate*. Однако так же измерялся *empty sentence error rate* так как важно, чтобы модель не предсказывала ничего на пустых и/или шумовых входах. Такие прецеденты имели место, скорее всего это было связано с нормализацией данных, которая в случае, если на вход подавалась тишина, превращала её в по сути белый шум, путающий акустическую модель. Эту проблему удалось побороть на достаточном уровне с помощью использования отдельной модели, отсекающей невалидные входы. Как минимум демо-версия с официального сайта справляется с этим и не пытается «говорить с пустотой», можете сами проверить.

Синтез речи

Использование

Синтезировать речь с помощью SmartSpeech ровно настолько же просто, насколько распознавать. Для этого аналогично нужно отправить соответствующий POST HTTP-запрос с вашим токеном в заголовке или же воспользоваться скриптом из репозитория:
```python3 synthesize.py --token "<access_token>" --file "<output>" --text "<input>"```
В том, что сгенерированная речь практически не отличается от человеческой можно убедиться в соответствующем демо, в котором доступно 6 базовых голосов.
Интересной фичей синтеза является возможность использования в запросе SSML (Speech Synthesis Markup Language) разметки. С помощью неё можно подсказать алгоритму, где делать паузы при произношении, как правильно прочитать дату, на какие слова сделать смысловое ударение и другое. Это позволяет кастомизировать генерацию речи под свои нужды, что делает выдачу ещё более качественной. В некоторых ситуациях использование SMML просто необходимо, вот яркий пример:
К сожалению (или к счастью?) с творчеством Гоголя SmartSpeech мало знаком и нуждается в подсказке.

Техническая сторона

Как показывает практика, *end-to-end* решения для синтеза речи производят очень бедный и однообразный звук. Поэтому весь алгоритм так же, как и в случае распознавания состоит из нескольких составных частей, глобально из акустической модели, порождающей в некотором смысле сжатое представлению звука, и вокодера, генерирующего на его основе уже чёткую и приятную для восприятия аудиодорожку в 48 килогерц и 16 бит.
Тут основные усилия были вложены в вокодер, непосредственно влияющий на качество синтеза. В отличие от других подходов он использует дополнительные признаки входного текста, а также изменяет выходные частоты на основе акустических фичей, чтобы звук звучал естественнее и живее.
Отдельной головной болью в синтезе речи является проблема быстродействия системы, так как например в случае её применения в голосовом помощнике требуется *Real-time* генерация. Ведь даже лишняя секунда, потраченная на работу алгоритма очень существенно сказывается на впечатлении от всего сервиса. Нетрудно заметить, что качественной системе необходимо производить звук быстрее, чем он на самом деле произносится. С учётом задержек сети под «быстрее» имеется в виду относительное ускорение в полтора 2 раза. Иначе говорящий робот будет неожиданно прерываться на середине фразы, что конечно же неприемлемо. В связи с этим вокодер в SmartSpeech является потоковым, то есть обрабатывает входящий запрос блоками и выдаёт результат как можно быстрее по готовности.
Серьёзным подспорьем для ускорения работы стало кеширование ответов. Ведь не имеет смысла каждый раз генерировать новые стандартные фразы типа «привет». Поэтому если робот уже произносил некоторую фразу, то в следующий раз этого же дня он скажет её аналогичным образом, воспользовавшись закешированными данными. Потому чтобы выдача не была однообразной, предзаписанные фразы варьируются.
Также довольно непростым был процесс сбора данных. И тут дело в невероятной прожорливости моделей синтеза (яркий пример — Tacotron) и их требовательности к чистоте обучающих наборов. Для этого голосовые записи тщательно проверялись на чёткое соответствие нужному тексту и интонации, причём по несколько раз. Подробнее про сбор данных можно узнать из статьи про то, как создавался самый большой русскоязычный речевой датасет Golos.

«А ручки-то вот они

Вместо заключения здесь читателю предлагается переквалифицироваться в слушателя и перейти по ссылке, где можно оценить синтез речи от SmartSpeech. Стоит отметить, что ему пришлось подсказать ударения в словах «Толстого» и «Хабре» с помощью SSML-разметки.
Для тех, кто хочет свериться с исходником, вот текст, который зачитывается
«Что мы имеем в итоге? SmartSpeech это мощная система, включающая в себя инструменты для распознавания и синтеза речи. Помимо того, что она используется в таких высоконагруженных сервисах как контакт-центр Сбера, она также хорошо себя проявляет и на задачах поменьше, типа написания статьи на Хабре. Что ж, думаю, родись Толстой сейчас, его жена попросту лишилась бы работы! Ей не пришлось бы писать «Войну и мир» от руки, причём не один раз. Так что открывайте пошире двери и окна: будущее уже здесь. Пробуйте, пользуйтесь, открывайте новое!»

Комментарии 19

    +26

    Никогда не пойму, почему не писать цены за свои услуги?

    Почему нужно лазить по сайту и даже на нем тарифы закопаны где-то на портале для разработчиков... Насколько знаю, абсолютно всех бесят эти "цена по запросу", и при этом стоит сделать что-то свое - с радостью наступают на те же грабли...

    Синтез речи: 18.6 коп. за 1000 символов
    Распознавание речи: 60 коп. за 1 минуту.

      +11

      Чтобы иметь 2 возможности: переобуваться в прыжке; устанавливать каждому клиенту свою цену, в зависимости от его платежестпособности.

        +3

        3) сбор контактной информации

        +9

        Gogle Docs - диктовка бесплатно

        Microsoft OneDrive Word - диктовка бесплатно. За деньги - расшифровка в текст аудиофайла.

        P.S. Именно сегодня развлекался сравнивая диктовку Google и Microsoft на аудидиодорожке одной и той же видеозаписи. MS победил немного меньшим количиством ошибок и стабильностью - у Google постоянно приходилось перезапускать и работало только в Chrome.

          0

          Спасибо большое, только-только подбираю устройство, чтобы MS устойчиво с русским языком работал. Но, к сожалению, это все - короткие заметки.

            0

            К плюсам MS можно добавить, что он отмечает места, где есть сомнения в точности распознавания и к ним можно быстро вернуться для ручной коррекции. И также отображается точность распознавания в процентах - в моих пробах получалось 92-96%.

            0

            Windows 11 (win+H) - диктовка тоже бесплатно

            @Javian, вы пишите:

            |Microsoft OneDrive Word - диктовка бесплатно. За деньги - расшифровка в текст аудиофайла.

            Не могу в своем платном OneDrive найти расшифровку аудиофайла в текст. Подскажите пожалуйста - где она находится.

          +5

          Зачем писать статью, если можно не писать
          (заголовок в рекомендациях в шапке)

          Потому что при скорости печати слепым десятипальцевым набором свыше 900 символов в минуту можно набирать текст быстрее, чем его физически возможно проговаривать в комфортном режиме. И предел скорости набора текста можно повышать тренировками, а с проговариванием и последующим распознаванием так не получится.

            +1

            Странное такое чувство, вы и думаете со скоростью свыше 900 символов в минуту (10% - пробелы, кстати). Можно и читать 5000 знаков в минуту, даже пересказывать прочитанное, но что-то мало кто этими режимами мозга пользуется. Нужен комфорт мозговой работы, для чего и нужны инструменты "речь-в-текст" и обратно.

              0

              Думаем мы гораздо быстрее ~900 символов в минуту, просто не осознаём это как правило. Всё от ситуации зависит, но ~900 эт уж слишком мало.

                0

                Кстати, кажется абсолютно не зря природа мозга так устроена, что, думая 40 000 мыслей в день, 20 000 исчезнут совсем без следа, еще сколько-то без записи на бумагу тоже пропадут, остается около 1000 идей, которые большие умы могут додумать до конца. Не зря же мужчина на русском языке может сказать 10000 слов в сутки, женщина - 15000. Порты ввода/вывода иначе погорят. А так достаточно ненапряжно: 8 часов по 60 минут воспроизводить то, что содержится в оперативной части мозга (а она невелика) + 600 печатных страниц из долговременной = около 480 000 знаков в день. Получаем 1 слово говорим, 10 думаем. Если у вас другие расчеты, подскажите, пожалуйста.

            +8

            Как хабраавтору мне разумеется больше всего интересен последний пункт,

            А мне (как граммар-наци) больше всего интересно, когда оно научится вводное слово "разумеется" запятыми обрамлять. Если, конечно, хабраавтору в этот момент не разумелось что-то древнерусское.

              +1

              Под мобильные устройства планируется создавать?

                +2

                Пропущенные запятые не вдохновляют.

                Печать букв - это только малая часть работы над текстом. Ещё его надо как минимум структурировать и редактировать стилистически. К тому же, держать в голове всю необходимую информацию для работы над хорошей содержательной статьёй решительно невозможно, по любому нужны заготовки и копипаст.

                  +3

                  В старые добрые времена было правило: не написано - значит не было. И как только человек садился писать, он начинал думать. Жалко жалко прощаться с этимими старыми добрыми временами.

                    +1

                    В старые и добрые были секретари и писари (а затем машинистки). Есественно, у тех, кто мог за это платить. Писатели, видимо, по большей части не могли и вынуждены были корячиться сами с перьями, затем с кнопками и копирками, потом просто с кнопками. Ну а теперь, видимо, прогресс выходит на принципиально новый этап. Писари, считай, уже есть, осталось дождаться полноценных электронных секретарей-редакторов-корректоров

                    Тем более, что прощаться никто и не заставляет. Можно прекрасно, "как в старые добрые" творить любым из доступных ранее способов. Все они не только доступны, но многие стали даже более доступны, чем прежде. Например, бумага и чернила уж точно подешевели в сравнении с каким-нибудь там 17-м веком

                      +4

                      Ну и где сейчас найти нормальную глину для табличек?!

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.