FOLDER_ID = "default" # Идентификатор каталога
API = "AQVN33ioCUgKDF-XXXXXXXXX-oWqt7zIrX0ZW-"
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 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='')
Здесь, в принципе, все понятно без комментариев - мы по-прежнему указываем в данных, что именно мы передаем, подсовываем файл с записью и получаем результат. В зависимости от того, что было распознано, мы получаем от скрипта в stdout yes, no или dont, соответственно, Да, Нет и Не понял.
В рассматриваемом примере, к сожалению, никакой интеграции asterisk с crm-системой нет, так что пойдем по пути наименьшего сопротивления, и будем принимать данные через get-запрос. Сделать это можно по-разному: от написания собственного мультипоточного socket-сервера до использования django, но я решил использовать супер-легковесный web-фреймворк под названием bottle. Так что начинаем с
pip install bottle
Сам фреймворк целиком состоит из единственного файла, так что можно его просто скачать и положить в каталог со своим приложением. Итак, перейдем к коду:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from bottle import run, request, get
import os
from syn import synthesize
def autodial(mobile,order):
with open('/tmp/'+str(mobile)+str(order), 'w') as callfile:
callfile.write('Channel: Local/'+mobile+'@from-internal'+'\n')
callfile.write('Callerid: Autodial <'+mobile+'>\n')
callfile.write('Context: from-internal\n')
callfile.write('Extension: 900\n')
callfile.write('Priority: 1\n')
callfile.write('WaitTime: 25000\n')
callfile.write('Set: __ORDER='+str(order)+'\n')
os.rename('/tmp/'+str(mobile)+str(order), '/var/spool/asterisk/outgoing/'+str(mobile)+str(order))
@get('/msg')
def index():
postdata =
request.body.read()
name = request.query.get("name")
surname = request.query.get("surname")
number = request.query.get("number")
order = request.query.get("order")
address = request.query.get("address")
synthesize(output='/tmp/'+str(order)+'-name',text=str(name)+' '+str(surname))
synthesize(output='/tmp/'+str(order)+'-order',text=str(order))
synthesize(output='/tmp/'+str(order)+'-address',text=str(address))
autodial(mobile=number,order=order)
run(host='
192.168.0.22', port=8000, debug=False)
Итак, после запуска сервера на указанном адресе и порту, мы отслеживаем исключительно get-запросы в /msg. Функция autodial в данном случае формирует callfile для asterisk, причем только после того, как мы сформировали необходимые файлы. Функция synthesize импортируется из первого скрипта. Запустим скрипт и в браузере откроем ссылку
http://192.168.0.22:8000/msg?name=Иван&surname=Петров&order=23232&address=Ленина 1&number=89278555666
Результатом работы данного кода будет:
три файла с названиями вида /tmp/23232-name.wav /tmp/23232-order.wav /tmp/23232-address.wav
callfile, который осуществит вызов клиента, соединит его со служебным номером 900, а также передаст в контекст переменную ORDER, соответствующую номеру заказа.
Теперь нам нужно сгенерировать те части фразы, которые будут неизменны. Сделаем это с помощью нашего скрипта, например,