Привет! Меня зовут Филипенко Владимир и я не писал эту статью. Я её надиктовал. Поправок в этом тексте потребовали только термины, с которыми 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 это мощная система, включающая в себя инструменты для распознавания и синтеза речи. Помимо того, что она используется в таких высоконагруженных сервисах как контакт-центр Сбера, она также хорошо себя проявляет и на задачах поменьше, типа написания статьи на Хабре. Что ж, думаю, родись Толстой сейчас, его жена попросту лишилась бы работы! Ей не пришлось бы писать «Войну и мир» от руки, причём не один раз. Так что открывайте пошире двери и окна: будущее уже здесь. Пробуйте, пользуйтесь, открывайте новое!»
Привет! Меня зовут Филипенко Владимир и я не писал эту статью. Я её надиктовал. Поправок в этом тексте потребовали только термины, с которыми 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 это мощная система, включающая в себя инструменты для распознавания и синтеза речи. Помимо того, что она используется в таких высоконагруженных сервисах как контакт-центр Сбера, она также хорошо себя проявляет и на задачах поменьше, типа написания статьи на Хабре. Что ж, думаю, родись Толстой сейчас, его жена попросту лишилась бы работы! Ей не пришлось бы писать «Войну и мир» от руки, причём не один раз. Так что открывайте пошире двери и окна: будущее уже здесь. Пробуйте, пользуйтесь, открывайте новое!»

Комментарии (5)


  1. Quiensabe
    30.12.2021 09:04
    +4

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

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

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


    1. TRaMeLL
      30.12.2021 11:55

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



  1. DabjeilQutwyngo
    31.12.2021 01:26

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

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


    1. OBIEESupport
      31.12.2021 01:37

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