Голосовой ввод. Поиск оптимальной системы аудио распознавания речи с закрытым исходным кодом, но имеющими открытые API, для возможности интеграции

  • 19.04.2019
  • Asterisk ,
  • Google API ,
  • Яндекс API
  • Выбор API для распознавания речи

    Я рассматривал только вариант api, коробочные решения были не нужны, поскольку требовали ресурсы, данные для распознания не критичны для бизнеса, да и использование их существенно сложнее и требует больше человеко-часов.

    Первым был Yandex SpeechKit Cloud. Мне он сразу понравился простотой использования:

    Curl -X POST -H "Content-Type: audio/x-wav" --data-binary "@speech.wav" "https://asr.yandex.net/asr_xml?uuid=<идентификатор пользователя>&key=&topic=queries"
    Ценовая политика 400 рублей за 1000 запросов. Первый месяц бесплатно. Но после этого пошли только разочарования:

    На передачу большого предложения, приходил ответ из 2-3 слов
    - Распознавались эти слова в странной последовательности
    - Попытки изменения топика положительных результатов не принесли

    Возможно это было связано со средним качеством записи, мы все тестировали через голосовые шлюзы и древние телефоны panasonic. Пока планирую его в дальнейшем использовать для построения IVR.

    Следующим стал сервис от Google. Интернет пестрит статьями, в которых предлагается использовать API для разработчиков Chromium. Сейчас ключей для этого API уже так просто получить нельзя. Поэтому мы будем использовать коммерческую платформу.

    Ценовая политика - 0-60 минут в месяц бесплатно. Далее 0,006 $ за 15 секунд речи. Каждый запрос округляется к цифре кратной 15. Первые два месяца бесплатно, для создания проекта нужна кредитная карта. Варианты использования API в базовой документации разнообразны. Мы будем использовать скрипт на Python:

    Скрипт из документации

    """Google Cloud Speech API sample application using the REST API for batch processing.""" import argparse import base64 import json from googleapiclient import discovery import httplib2 from oauth2client.client import GoogleCredentials DISCOVERY_URL = ("https://{api}.googleapis.com/$discovery/rest?" "version={apiVersion}") def get_speech_service(): credentials = GoogleCredentials.get_application_default().create_scoped(["https://www.googleapis.com/auth/cloud-platform"]) http = httplib2.Http() credentials.authorize(http) return discovery.build("speech", "v1beta1", http=http, discoveryServiceUrl=DISCOVERY_URL) def main(speech_file): """Transcribe the given audio file. Args: speech_file: the name of the audio file. """ with open(speech_file, "rb") as speech: speech_content = base64.b64encode(speech.read()) service = get_speech_service() service_request = service.speech().syncrecognize(body={ "config": { "encoding": "LINEAR16", # raw 16-bit signed LE samples "sampleRate": 16000, # 16 khz "languageCode": "en-US", # a BCP-47 language tag }, "audio": { "content": speech_content.decode("UTF-8") } }) response = service_request.execute() print(json.dumps(response)) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("speech_file", help="Full path of audio file to be recognized") args = parser.parse_args() main(args.speech_file)

    Подготовка к использованию Google Cloud Speech API

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

    Перейдем к настройке самого сервера, нам необходимы будут:

    Python
    - python-pip
    - python google api client

    Sudo apt-get install -y python python-pip pip install --upgrade google-api-python-client
    Теперь нам необходимо экспортировать две переменных окружения, для успешной работы с апи. Первая это путь к сервисному ключу, вторая название вашего проекта.

    Export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account_file.json export GCLOUD_PROJECT=your-project-id
    Скачаем тестовый аудио файл и попытаемся запустить скрипт:

    Wget https://cloud.google.com/speech/docs/samples/audio.raw python voice.py audio.raw {"results": [{"alternatives": [{"confidence": 0.98267895, "transcript": "how old is the Brooklyn Bridge"}]}]}
    Отлично! Первый тест успешен. Теперь изменим в скрипте язык распознавания текста и попробуем распознать его:

    Nano voice.py service_request = service.speech().syncrecognize(body={ "config": { "encoding": "LINEAR16", # raw 16-bit signed LE samples "sampleRate": 16000, # 16 khz "languageCode": "ru-RU", # a BCP-47 language tag
    Нам необходим.raw аудио файл. Используем для этого sox

    Apt-get install -y sox sox test.wav -r 16000 -b 16 -c 1 test.raw python voice.py test.raw {"results": [{"alternatives": [{"confidence": 0.96161985, "transcript": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0412\u0430\u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f"}]}]}
    Гугл возвращает нам ответ в юникоде. Но мы хотим видеть нормальные буквы. Поменяем немного наш voice.py:

    Print(json.dumps(response))
    Мы будем использовать

    S = simplejson.dumps({"var": response}, ensure_ascii=False) print s
    Добавим import simplejson . Итоговый скрипт под катом:

    Voice.py

    """Google Cloud Speech API sample application using the REST API for batch processing.""" import argparse import base64 import json import simplejson from googleapiclient import discovery import httplib2 from oauth2client.client import GoogleCredentials DISCOVERY_URL = ("https://{api}.googleapis.com/$discovery/rest?" "version={apiVersion}") def get_speech_service(): credentials = GoogleCredentials.get_application_default().create_scoped(["https://www.googleapis.com/auth/cloud-platform"]) http = httplib2.Http() credentials.authorize(http) return discovery.build("speech", "v1beta1", http=http, discoveryServiceUrl=DISCOVERY_URL) def main(speech_file): """Transcribe the given audio file. Args: speech_file: the name of the audio file. """ with open(speech_file, "rb") as speech: speech_content = base64.b64encode(speech.read()) service = get_speech_service() service_request = service.speech().syncrecognize(body={ "config": { "encoding": "LINEAR16", # raw 16-bit signed LE samples "sampleRate": 16000, # 16 khz "languageCode": "en-US", # a BCP-47 language tag }, "audio": { "content": speech_content.decode("UTF-8") } }) response = service_request.execute() s = simplejson.dumps({"var": response}, ensure_ascii=False) print s if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("speech_file", help="Full path of audio file to be recognized") args = parser.parse_args() main(args.speech_file)


    Но перед его запуском нужно будет экспортировать ещё одну переменную окружения export PYTHONIOENCODING=UTF-8 . Без неё у меня возникли проблемы с stdout при вызове в скриптах.

    Export PYTHONIOENCODING=UTF-8 python voice.py test.raw {"var": {"results": [{"alternatives": [{"confidence": 0.96161985, "transcript": "Здравствуйте Вас приветствует компания"}]}]}}
    Отлично. Теперь мы можем вызывать этот скрипт в диалплане.

    Пример Asterisk dialplan

    Для вызова скрипта я буду использовать простенький диалплан:

    Exten => 1234,1,Answer exten => 1234,n,wait(1) exten => 1234,n,Playback(howtomaketicket) exten => 1234,n,Playback(beep) exten => 1234,n,Set(FILE=${CALLERID(num)}--${EXTEN}--${STRFTIME(${EPOCH},%d-%m-%Y--%H-%M-%S)}.wav) exten => 1234,n,MixMonitor(${FILE},/opt/test/send.sh [email protected] "${CDR(src)}" "${CALLERID(name)}" "${FILE}") exten => 1234,n,wait(28) exten => 1234,n,Playback(beep) exten => 1234,n,Playback(Thankyou!) exten => 1234,n,Hangup()
    Я использую для записи mixmonitor и после окончания запускаю скрипт. Можно использовать record и это, пожалуй, будет лучше. Пример send.sh для отправки - он предполагает, что у вас уже настроен mutt:

    #!/bin/bash #скрипт для отправки уведомлений # экспортируем необходимые переменные окружения # файл лицензии гугла export GOOGLE_APPLICATION_CREDENTIALS=/opt/test/project.json # название проекта export GCLOUD_PROJECT=project-id # кодировка для питона export PYTHONIOENCODING=UTF-8 #список переменных на входе EMAIL=$1 CALLERIDNUM=$2 CALLERIDNAME=$3 FILE=$4 # перекодируем звуковой файл в raw для того, чтобы отдать его гугл апи sox /var/spool/asterisk/monitor/$FILE -r 16000 -b 16 -c 1 /var/spool/asterisk/monitor/$FILE.raw # присваиваем переменной значение выполненного скрипта по конвертации звука в текст и обрезаем не нужное TEXT=`python /opt/test/voice.py /var/spool/asterisk/monitor/$FILE.raw | sed -e "s/.*transcript"://" -e "s/}]}]}}//"` # отправляем письмо, включаем в письмо распознанный текст echo "новое уведомление от номера: $CALLERIDNUM $CALLERIDNAME $TEXT " | mutt -s "Это заголовок письма" -e "set [email protected] realname="я присылаю оповещения"" -a "/var/spool/asterisk/monitor/$FILE" -- $EMAIL

    Заключение

    Таким образом мы решили поставленную задачу. Надеюсь кому-то пригодится мой опыт. Буду рад комментариям (пожалуй только ради этого и стоит читать Хабр!). В будущем планирую реализовать на основе этого IVR с элементами голосового управления.

    Google Speech API - сервис распознавания голоса Google.

    Распознавание речи позволяет создавать системы автоматического обслуживания клиентов в тех случаях, когда не применимо управление с помощью тонального набора. В качестве примера можно рассмотреть сервис бронирования авиабилетов, который подразумевает выбор их большого числа городов. Тональное меню в таком сервисе не удобно, поэтому голосовое управление будет самым эффективным. Диалог между системой и абонентом может выглядеть следующим образом:

    Система: Здравствуйте. Куда вы хотите лететь? Абонент: Казань Система: Откуда вы хотите лететь? Абонент: Москва Система: Назовите дату вылета Абонент: 10 апреля
    • Голосовой навигации в многоуровневых меню IVR и автоматического соединения с нужным сотрудником
    • Распознавания адреса для доставки
    • Автоматической голосовой аутентификации пользователей при запросе персонализированной или конфиденциальной информации по телефону или через интернет
    • Справочной системы информационного обслуживания
    • Корпоративной системы голосового самообслуживания клиентов (запрос баланса, проверка лицевого счета, бронирование билетов)

    Система распознавания речи, как правило, состоит из следующих частей:

    • Запись сообщения от абонента
    • Распознавание голоса и прием текстовых данных от сервиса
    • Анализ полученной информации и выполнение необходимых действий

    Для использования Google Speech API в вашей системе выполните следующие действия:

    Шаг 1. Скачайте и импортируйте сценарии в вашу систему Oktell .

    Скачать сценарий: (для версий Oktell старше 2.10)

    В архиве располагаются два сценария:

    • Google_Speech_API_main - сценарий для записи голосового сообщения, является примером правильного использования сервиса распознавания в главном сценарии.
    • Google_Speech_API - сценарий для отправки записи на сервис Google и приема распознанного сообщения.

    После импорта сценариев в Oktell , сохраните их "На сервер "

    ВНИМАНИЕ: Google Speech API - это платный продукт. В сценарии (компонент Web-запроса GoogleVoice ) используется пробный ключ, который может быть заблокирован в следствие определенного числа запросов. При тестах максимальное количество запросов не обнаружено. Если вы хотите приобрести платную версию Google Speech API обратитесь в поддержку Google.

    Шаг 2. В модуле "Администрирование " - "Внутренние номера " добавьте внутренний номер с типом "Запуск IVR ". Выберите IVR-сценарий Google_Speech_API_main .

    The Web Speech API enables you to incorporate voice data into web apps. The Web Speech API has two parts: SpeechSynthesis (Text-to-Speech), and SpeechRecognition (Asynchronous Speech Recognition.)

    Web Speech Concepts and Usage

    The Web Speech API makes web apps able to handle voice data. There are two components to this API:

    • Speech recognition is accessed via the SpeechRecognition interface, which provides the ability to recognize voice context from an audio input (normally via the device"s default speech recognition service) and respond appropriately. Generally you"ll use the interface"s constructor to create a new SpeechRecognition object, which has a number of event handlers available for detecting when speech is input through the device"s microphone. The SpeechGrammar interface represents a container for a particular set of grammar that your app should recognise. Grammar is defined using JSpeech Grammar Format (JSGF .)
    • Speech synthesis is accessed via the SpeechSynthesis interface, a text-to-speech component that allows programs to read out their text content (normally via the device"s default speech synthesiser.) Different voice types are represented by SpeechSynthesisVoice objects, and different parts of text that you want to be spoken are represented by SpeechSynthesisUtterance objects. You can get these spoken by passing them to the SpeechSynthesis.speak() method.

    Web Speech API Interfaces

    Speech recognition

    SpeechRecognition The controller interface for the recognition service; this also handles the SpeechRecognitionEvent sent from the recognition service. SpeechRecognitionAlternative Represents a single word that has been recognised by the speech recognition service. SpeechRecognitionError Represents error messages from the recognition service. SpeechRecognitionEvent The event object for the result and nomatch events, and contains all the data associated with an interim or final speech recognition result. SpeechGrammar The words or patterns of words that we want the recognition service to recognize. SpeechGrammarList Represents a list of SpeechGrammar objects. SpeechRecognitionResult Represents a single recognition match, which may contain multiple SpeechRecognitionAlternative objects. SpeechRecognitionResultList Represents a list of SpeechRecognitionResult objects, or a single one if results are being captured in continuous mode.

    Speech synthesis

    SpeechSynthesis The controller interface for the speech service; this can be used to retrieve information about the synthesis voices available on the device, start and pause speech, and other commands besides. SpeechSynthesisErrorEvent Contains information about any errors that occur while processing SpeechSynthesisUtterance objects in the speech service. SpeechSynthesisEvent Contains information about the current state of SpeechSynthesisUtterance objects that have been processed in the speech service. SpeechSynthesisUtterance Represents a speech request. It contains the content the speech service should read and information about how to read it (e.g. language, pitch and volume.) SpeechSynthesisVoice Represents a voice that the system supports. Every SpeechSynthesisVoice has its own relative speech service including information about language, name and URI. Window.speechSynthesis Specced out as part of a interface called SpeechSynthesisGetter , and Implemented by the Window object, the speechSynthesis property provides access to the SpeechSynthesis controller, and therefore the entry point to speech synthesis functionality.

    Examples

    The Web Speech API repo on GitHub contains demos to illustrate speech recognition and synthesis.

    Specifications

    Specification Status Comment
    Web Speech API Draft Initial definition

    Browser compatibility

    SpeechRecognition

    https://github.com/mdn/browser-compat-data and send us a pull request.

    Desktop Mobile
    Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Edge Mobile Firefox for Android Opera for Android Safari on iOS Samsung Internet
    SpeechRecognition

    Experimental

    Chrome Full support 33

    Prefixed Notes

    Full support 33

    Prefixed Notes

    Prefixed
    Edge ? Firefox No support No IE No support No Opera No support No Safari No support No WebView Android ? Chrome Android Full support Yes

    Prefixed Notes

    Full support Yes

    Prefixed Notes

    Prefixed Implemented with the vendor prefix: webkit Notes You"ll need to serve your code through a web server for recognition to work.
    Edge Mobile ? Firefox Android No support No Opera Android No support No Safari iOS No support No Samsung Internet Android ?

    Legend

    Full support Full support No support No support Compatibility unknown Compatibility unknown Experimental. Expect behavior to change in the future. Experimental. Expect behavior to change in the future. See implementation notes. See implementation notes. Requires a vendor prefix or different name for use.

    SpeechSynthesis

    The compatibility table on this page is generated from structured data. If you"d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

    Update compatibility data on GitHub

    Desktop Mobile
    Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Edge Mobile Firefox for Android Opera for Android Safari on iOS Samsung Internet

    Сейчас без компьютера просто нереально обойтись в современном мире. От вас не требуется быть мастером фотошопа или профессионально монтировать видео (если это не связано с работой, конечно). Но суметь набрать какой-нибудь текст – это необходимый минимум.

    №2. Web Speech API


    Онлайн-программа Web Speech API по функционалу абсолютно идентична предыдущим.

    Этот сервис, как и перечисленные выше, также был создан компанией Google.

    Главная страница выглядит так:


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

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


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

    После окончания работы текст можно скопировать туда, куда вам необходимо (опять же таки – ctrl+C, ctrl+V).

    №3. Talktyper

    Не менее простая программа – это Talktyper.

    Для начала работы перейдите на сайт: https://talktyper.com/ru/index.html.


    Для начала работы достаточно нажать на значок микрофона справа.

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

    Talktyper многофункциональный: он не только набирает текст, но и ставит знаки препинания, исправляет самостоятельно ошибки. Если какое-то начитанное вами слово система не может распознать, как правильное, то оно обязательно высветится.

    Кроме того, Talktyper имеет функцию перевода, а также его озвучивания.

    Обратите внимание! После того как вы закончите голосовой набор текста, обязательно нажмите на стрелочку, чтобы набранный документ был перенесен в другое поле. После этого его можно будет отправить по электронной почте или скопировать в нужный файл.

    Возможные проблемы при работе с программами голосового набора

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

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

    Весь процесс можно разделить на 3 главных этапа:

      Акустический распознаватель.

      Важно говорить четко, громко, микрофон должен передавать голос без перебоев.

      Лингвистическая обработка.

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

      Распознанный орфографический текст.

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

    При работе с компьютерными наборщиками текста чаще всего возникает 2 проблемы:

    1. Акустический распознаватель «улавливает» вашу речь с перебоями.
    2. В словаре системы недостаточно слов, чтобы распознать всё, сказанное вами.

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

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

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

    Дальше всех в этом деле продвинулась компания Google, т.к. имеет достаточно средств для инвестиций. Эта компания, кроме прочего, создала самый большой онлайн-словарь, который помогает распознавать голос и переводить его в графическую версию.

    Смотрите подробное руководство в этом ролике:

    1. Когда вы произносите речь, в комнате должно быть тихо. Звуки природы, музыка, плач ребенка воспринимаются системой, как шум. Из-за этого текст будет набран с большими ошибками.
    2. Не говорите, если что-то едите. Это не только скажется на качестве набора, но и опасно для жизни к тому же.
    3. Перед началом работы нужно подобрать правильную громкость вашего голоса, а также понять какая чувствительность у вашего микрофона.

      Для этого попробуйте записать несколько предложений привычным тоном. Если в записи будут перебои, обратитесь к настройкам микрофона.

    4. Делайте небольшие паузы между словами.
    5. Избегайте длинных фраз.

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

    А уж из каких сервисов выбирать, вы уже знаете…

    С этого дня независимые разработчики получили доступ к Cloud Speech API, технологии распознавания речи, на которой основаны продукты Google. Продукт, получивший обновление, теперь доступен в Google Cloud.

    Открытая бета-версия Cloud Speech была выпущена прошлым летом. Эта технология с простым API позволяет разработчикам преобразовывать аудио в текст. Модели нейронной сети могут распознавать более 80 языков и диалектов, а готовая транскрипция появляется сразу после проговаривания текста.

    API построен на базе технологии, которая обеспечивает функцию распознавания речи в Google Assistant, Search и Now, однако в новой версии были внесены изменения для адаптации технологии под нужды пользователей Cloud.

    Чем отличается новая версия Cloud Speech API?

    Благодаря отзывам разработчиков команда Google смогла повысить точность транскрипции продолжительных аудиозаписей и ускорить процесс обработки данных в 3 раза по сравнению с первоначальной версией. Также была добавлена поддержка других аудиоформатов, включая WAV, OPUS и Speex.

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

    Среди частых случаев применения технологии стоит отметить её использование в организациях для анализа работы колл-центров, отслеживания общения с клиентами и повышения продаж.