SpeechKit + Asterisk
Введение Регистрация в Яндекс.Облако и получение API ключа Использование скрипта для конвертации текста в речь Использование скрипта распознования речи Правки диалплана для работы с yandex speechkit Скрипт выполняющий AMI запросы Введение Скорее всего, каждый сталкивался с функционалом банковских/коллекторских служб. Вам поступает звонок, вы отвечаете на вызов, а далее вам воспроизводится какое-то голосовое приветствие и спрашивают: […]
- Введение
- Регистрация в Яндекс.Облако и получение API ключа
- Использование скрипта для конвертации текста в речь
- Использование скрипта распознования речи
- Правки диалплана для работы с yandex speechkit
- Скрипт выполняющий AMI запросы
Введение
Скорее всего, каждый сталкивался с функционалом банковских/коллекторских служб. Вам поступает звонок, вы отвечаете на вызов, а далее вам воспроизводится какое-то голосовое приветствие и спрашивают: «Хотите связаться с оператором, оставайтесь на линии.» За разработку данного функционала, была взята именно эта схема. Но я её решил немного доработать и прикрутить к ней функционал распознавания речи. Т.е. схема примерно такая:
— … Если хотите связаться с оператором, скажите «Да»
— Да
Далее вызов направляется к оператору.
Для реализации текущей задачи воспользуемся платным сервисом Yandex SpeechKit.
Далее в этой статье будем рассматривать как пользоваться API Yandex SpeechKit. Как привязать функционал TTS и STT к астериску.
Регистрация в Яндекс.Облако и получение API ключа
Сперва потребуется создать аккаунт в сервисе Яндекс.Облако. Для этого необходимо перейти на их сайт https://cloud.yandex.ru/. В правом верхнем углу нажать кнопку «Войти». Для лиц не зарегистрированных она будет серого цвета. Вас перекинет на окно, где вам будет предложено ввести логин и пароль от вашего аккаунта или зарегистрироваться, как новый пользователь. Далее будем проводить все действия, как новый пользователь сервисов яндекс, поэтому чтобы пройти регистрация необходимо нажать «Зарегистрироваться»
![Регистрация в Яндекс](https://voxlink.ru/wp-content/uploads/2019/12/pic1yandex_registration.png)
Далее следуя инструкция создаем аккаунт. Завершив регистрацию, вас снова перекинет на основную страницу http://cloud.yandex.ru/. На текущей странице вы сможете увидеть приглашение подключиться к «Облаку». Для этого нажимаем на желтую кнопку «Подключиться».
![Подключение к «Облаку»](https://voxlink.ru/wp-content/uploads/2019/12/pic2sign_in.png)
После того, как вы проделаете этот шаг, вас поприветствует консоль сервиса. И для дальнейшей работы необходимо будет заполнить некоторые данные в Яндекс.Паспорт. А именно — привязать мобильный номер к вашему аккаунту. И для быстрого доступа к паспорту в приветствии есть ссылка на «Паспорт». Она выделена синим цветом.
![Приветствие консоли «Облака»](https://voxlink.ru/wp-content/uploads/2019/12/pic3yandex_passport.png)
После перехода по ссылке вас попросят ввести ваш номер телефона. Нажав на «Добавить». Необходимо будет ввести 6ти значный код безопасности, который придёт в СМС сообщении на указанный ранее номер телефона и пароль указанный при регистрации.
![Мобильная аутентификация](https://voxlink.ru/wp-content/uploads/2019/12/pic4mobile_auth.png)
После привязки мобильного номера вы снова окажетесь в окне консоли «Облака». Нужно привязать банковскую карту к аккаунту. Данные действия также выполняются в «Паспорте». Чтобы попасть в настройки «Яндекс.Паспорт» щелкните мышкой по значку человека в правом верхнем углу, в появившейся «шторке» выберем пункт «Настройки».
![Настройки аккаунта Яндекс](https://voxlink.ru/wp-content/uploads/2019/12/pic5yandex_settings.png)
Теперь перейдем в раздел «Паспорт» расположенный сверху в меню.
![Меню «Паспорт»](https://voxlink.ru/wp-content/uploads/2019/12/pic6pasport_settings.png)
На открывшейся странице пролистнём вниз до радела «Банковские карты». Теперь надо нажать «Добавить карту».
![Добавить карту](https://voxlink.ru/wp-content/uploads/2019/12/pic7add_credit_card.png)
Далее, следуя инструкциям, добавляем банковскую карту, с которой будете оплачивать услуги «Яндекс.Облако».
Завершив добавление карты, перейдем в консоль управления «Яндекс.Облако». Теперь необходимо создать сервисный аккаунт, для получения API ключа. Для этого в правом верхнем углу выберем нужное облако.
![Добавление сервисного аккаунта](https://voxlink.ru/wp-content/uploads/2019/12/pic8add_service_account.png)
В появившейся странице, у вас отобразится список «каталогов». Изначально он там один. Поэтому кликаем по нему, чтобы перейти в его детальные настройки.
![Список «каталогов»](https://voxlink.ru/wp-content/uploads/2019/12/pic9all_catalogs-1024x93.png)
И слева в меню нужно выбрать «Сервисные аккаунты». Именно в этом разделе мы будем создавать нужный нам аккаунт для получения API ключа.
![«Сервисные аккаунты» в меню](https://voxlink.ru/wp-content/uploads/2019/12/pic10service_accounts.png)
Справа в окне вы увидите желтую кнопку «Создать сервисный аккаунт». Кликаем по ней и переходим в форму, для заполнения данных по создаваемому аккаунту. Здесь нужно указать Имя аккаунта и роль пользователя, выбираем роль admin. После указания всех данных нажимаем «Создать». Также вас попросит добавить банковскую карту. Следуя инструкциям добавляем карту.
![Начало создания сервисного аккаунта](https://voxlink.ru/wp-content/uploads/2019/12/pic11add_service_accounts-1024x235.png)
![Создание сервисного аккаунта](https://voxlink.ru/wp-content/uploads/2019/12/pic14your_service_accounts.png)
Теперь в списке сервисных аккаунтов мы можем видеть добавленный нами «акк». Перейдем в его настройки, кликнув по его имени.
![Настройки аккаунта](https://voxlink.ru/wp-content/uploads/2019/12/pic12addedr_service_accounts.png)
Передвами появится информация аккаунта: его идентификатор, имя сервисного аккаунта, дата создания и роль в каталоге. Правее вы увидите раздел «Создать новый ключ». В выпавшей вкладке выбираем «Создать API-ключ».
![Начало создания API ключа](https://voxlink.ru/wp-content/uploads/2019/12/pic13create_a_new_key-1024x197.png)
![Создание API ключа.](https://voxlink.ru/wp-content/uploads/2019/12/pic15create_API_key.png)
Сначала диалоговое окно вам предложит ввести описание этого API ключа. И нажимаем «Создать».
![Описание ключа](https://voxlink.ru/wp-content/uploads/2019/12/pic16finish_create_API_key.png)
Далее выведется информация о идентификаторе API ключа и сам ключ.
![API ключ](https://voxlink.ru/wp-content/uploads/2019/12/pic17API_key.png)
Использование скрипта для конвертации текста в речь
Для конвертирования текста в речь, будем использовать скрипт на языке python версии 3. Но чтобы все заработало необходимо установить необходимые пакеты. Для этого выполним следующие команды
# yum install epel-release
# yum insatll python34 python34-dev python34-setuptools
# pip3.4 install requests sox
![Установка requests и sox](https://voxlink.ru/wp-content/uploads/2019/12/pic18install_requrements-1024x222.png)
Далее, создадим директорию, из которой будут работать наши скрипты. Команда mkdir поможет нам в этом.
# mkdir /opt/yandex_speech/
Создадим файл speech.py со следующим содержимым.
#!/usr/bin/env python3.4
import argparse
import requests
import sox
import os
def synthesize(output, text):
url = 'https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize'
headers = {
'Authorization': 'Api-Key ' + 'ВАШ API КЛЮЧ',
}
data = {
'text': text,
'lang': 'ru-RU',
'voice': 'alyss',
'emotion': 'good',
'format': 'lpcm',
'sampleRateHertz': '8000'
}
with requests.post(url, headers=headers, data=data, stream=True, verify=False) as resp:
if resp.status_code != 200:
raise RuntimeError("Invalid response received: code: %d, message: %s" % (resp.status_code, resp.text))
for chunk in resp.iter_content(chunk_size=None):
yield chunk
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--text", required=True, help="Text for synthesize")
parser.add_argument("--output", required=True, help="Output file name")
args = parser.parse_args()
with open(args.output, "wb") as f:
for audio_content in synthesize(args.output, args.text):
f.write(audio_content)
tfm = sox.Transformer()
tfm.set_input_format(file_type='raw', rate=8000, bits=16, channels=1, encoding='signed-integer')
tfm.build(args.output, args.output+'.wav')
os.remove(args.output)
Этот файл будет принимать два параметра:
- text – указывается текст который мы хотим конвертировать в речь
- output – полный путь к сохраняемому звуковому файлу
Сохраним изменения в файле и дадим этому файлу права на исполнение с помощью chmod.
# chmod +x /opt/yandex_speech/speech.py
![speech.py](https://voxlink.ru/wp-content/uploads/2019/12/pic19yandex_api_script-1024x821.png)
Теперь синтезируем текст для нашего примера под каждый шаг нашей логики: приветствие, информирование клиента, прощание
# /opt/yandex_speech/speech.py --output='/var/lib/asterisk/sounds/ru/custom/hello' --text='Добрый день. Вас приветствует фирма Рога и Копыта.'
# /opt/yandex_speech/speech.py --output='/var/lib/asterisk/sounds/ru/custom/operator' –text='Если хотите связаться с оператором произнесите ДА'
# /opt/yandex_speech/speech.py --output='/var/lib/asterisk/sounds/ru/custom/goodbye' –text='Спасибо за обращение. До свидания'
![Синтез текста.](https://voxlink.ru/wp-content/uploads/2019/12/pic20create_wav_file-1024x56.png)
Использование скрипта распознования речи
Ранее мы рассмотрели скрипт для конвертирования текста в речь. Но для правильной работы, нужно также сделать и обратно. Для этого создадим файл stt.py в тойже директории.
#!/usr/bin/env python3.4
import urllib.request
import json
import sys
import os
file=sys.argv[1]
FOLDER_ID = "default"
API = "ВАШ API КЛЮЧ"
with open(file, "rb") as f:
data = f.read()
params = "&".join([
"topic=general",
"format=lpcm",
"sampleRateHertz=8000",
"lang=ru-RU"
])
url = urllib.request.Request("https://stt.api.cloud.yandex.net/speech/v1/stt:recognize?%s" % params, data=data)
url.add_header("Authorization", "Api-Key %s" % API)
responseData = urllib.request.urlopen(url).read().decode('UTF-8')
decodedData = json.loads(responseData)
os.remove(file)
if decodedData.get("error_code") is None:
resp=decodedData.get("result")
if resp.startswith('да') or resp.startswith('хорошо') or resp.startswith('ага') or 'оператор' in resp:
print('yes',end='')
elif resp.startswith('нет'):
print('no',end='')
elif 'абонент' in resp:
print('no',end='')
elif 'авто' in resp:
print('no',end='')
elif resp=='':
print('no',end='')
else:
print('dont',end='')
Этот скрипт обращается к API yandex и передает в сервис записанный аудио файл, этот файл передается в параметре к скрипту, и возвращает ответ с распознанным текстом. Пример использования этого скрипта будет в следующем разделе статьи.
![скрипт stt.py.](https://voxlink.ru/wp-content/uploads/2019/12/pic22caller_response-1024x586.png)
Как и в прошлом разделе скрипту необходимо дать права на исполнение
Правки диалплана для работы с yandex speechkit
По-скольку скрипт будет периодически обзванивать номера, то создадим контекст, в котором будут обрабатываться приветсвия и запись ответа клиента. Для этого в файл /etc/asterisk/extensions_custom.conf добавим следующие строки.
[dialer]
exten => 123,1,Answer()
exten => 123,n,Noop(${ORDER})
exten => 123,n,Playback(/opt/yandex_speech/hello)
exten => 123,n,Playback(/opt/yandex_speech/operator)
exten => 123,n,Monitor(wav,/tmp/${UNIQUEID},o)
exten => 123,n,Wait(2)
exten => 123,n,StopMonitor()
exten => 123,n,Set(RESULT=${SHELL(/usr/bin/python3.4 /opt/yandex_speech/stt.py /tmp/${UNIQUEID}-in.wav)})
exten => 123,n,Noop(${RESULT})
exten => 123,n,GotoIf($["${RESULT}" = "yes"]?yes)
exten => 123,n,Playback(/opt/yandex_speech/goodbye)
exten => 123,n,Hangup()
exten => 123,n(yes),Playback(/opt/yandex_speech/transfer)
exten => 123,n,Goto(ext-queues,600,1)
exten => 123,n,Hangup()
Данные строки сработают сразу после того, как абонент ответит на входящий вызов.
Сначала, воспроизводится приветствие с представлением компании, далее предлагается перевести на оператора.
Сразу включается запись разговора на 2 секунды. Затем останавливается запись. Она передается параметром. Результат выполнения скрипта заносится в переменную RESULT. И в зависимости от результата направляется вызов или на прощание или на очередь операторов.
![Диалплан](https://voxlink.ru/wp-content/uploads/2019/12/pic21dialplan_for_dialer.png)
Скрипт выполняющий AMI запросы
Чтобы вызовы совершались автоматически необходимо написать скрипт, который будет формировать Originate и отправлять его на Asterisk.
from asterisk.ami import AMIClient
from asterisk.ami import SimpleAction
from time import sleep
import logging
client = AMIClient(address='127.0.0.1',port=5038)
try:
client.login(username='username',secret='password')
except:
logging.error("Invalid AMI username or password")
def dialer(client,number):
import re
if re.match(r'(^[78]?9[0-9]{9}$)|(^[78]?495[0-9]{7}$)',number) != None:
action = SimpleAction(
'Originate',
Channel='Local/'+str(number)+'@from-internal',
Exten='2010',
Priority=1,
Context='default',
CallerID='python',
)
client.send_action(action)
else:
logging.info("Number = {} is not equal by pattern _[78]9XXXXXXX or _[78]495XXXXXXX".format(number))
if __name__ == "__main__":
dialer(client,84959898533)
sleep(60)
Здесь используется питоновская библиотека asterisk-ami. Её нужно будет установить командой pip3.4 install asterisk-ami. В данном примере вызов генерируется каждую минуту. Значение можно изменить в параметре sleep().
![Скрипт обзвонщика](https://voxlink.ru/wp-content/uploads/2019/12/pic23caller-1024x452.png)
Осталось запустить скрипт.
/opt/yandex_speech/caller.py
![](/wp-content/uploads/2019/05/Screenshot_2.png)
Остались вопросы?
Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.
Спасибо за познавательную статью! Очень помогло разобраться. Только есть одно уточнение — результат у меня возвращается с первой заглавной буквой. (т.е. человек говорит «иван иванович» после распознавания приходит текст «Иван иванович»)