Как использовать api распознавание речи. Использование Google Cloud Speech API v2 в Asterisk для распознавания русской речи

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
  • 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 с элементами голосового управления.

    Вот информация из Интернета с сайта vorabota.ru :

    Чтобы приступить к преобразованию голоса в текст, понадобится микрофон (в ноутбуках он встроенный), желательна хорошая скорость интернет соединения и браузер Google Chrome не ниже 25 версии. В других браузерах функция голосового набора текстов, к сожалению, не работает.

    Запустите страницу для ввода текста голосом в браузере Chrome. Внизу окна выберите язык, на котором Вы планируете диктовать текст. Нажмите на иконку микрофона в верхнем правом углу. И в всплывшей строке нажмите кнопку «разрешить» использование браузером микрофона.

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

    Пожалуй, Web Speech API – самый простой и довольно качественный способ преобразовать свою речь в текст. Так как не надо отвлекаться на какие-то дополнительные манипуляции с клавиатурой. Просто включил микрофон и говори текст.

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

    Запустил в браузере Google Chrome страницу http://vorabota.ru/voice/text.html и опробовал голосовой ввод текста. Зачитал фразу «Web Speech API Голосовой набор текста. Выделить всё. Отправить Email «, а получил «Websphere api голосовой набор текста выделить все отправить email «. Вторая попытка: «Нажмите кнопку разрешить, чтобы включить микрофон » — «Нажмите кнопку разрешить чтобы включить микрофон «.

    Сравнение исходной фразы и результата показывает, что: а) русская фраза преобразуется в русский текст достаточно качественно; б) английская фраза преобразуется в английский текст с ошибками, которые легко скорректировать; в) требуется обязательная корректировка текста с исправлением ошибок и с расстановкой знаков препинания и заглавных букв; г) отличие этой реализации Голосового набора текста от других, доступных в Интернете, в предельной простоте: в ней нет ничего лишнего, что облегчает освоение и использование.

    Мой вывод таков: имеет смысл подобным образом реализовать Голосовой ввод текста на своём сайте, чтобы облегчить ввод текста на страницы сайта.

    Надо всего лишь вставить на соответствующую страницу сайта необходимый код.

    Создал отдельную страницу , предназначенную только для Голосового ввода текста , и начал её отладку.

    Вот код страницы Диктуем текст :

    Код в отладке…

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

    Приглашаю всех высказываться в

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

    №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. Избегайте длинных фраз.

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

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