Эта демонстрация была написана и предоставлена ​​участникам сессий Говорящего внештатного разработчика в Африке. Если вы хотите присоединиться к нам, перейдите по ссылкам внизу этой статьи

Добро пожаловать обратно! Это совершенно новая серия статей о создании потрясающих впечатлений с помощью всего лишь телефонных звонков. Нет причудливого пользовательского интерфейса. Нет реакции. Нет углового. Просто голосовой вызов. Это может показаться очень упрощенным, но на самом деле звонят все. В свете этого можно ли создавать приложения, которые запускаются при телефонных звонках? Да! Этим мы и займемся сегодня.

Мы будем использовать Flask, микрофреймворк Python, и развернем наше приложение на Heroku. На данный момент у нас нет базы данных, но в будущих сериях мы будем сохранять данные из ответов пользователей, так что следите за обновлениями.

Что будет делать приложение

Мы создадим простую игру-угадайку, которая позволит каждому угадать, сколько лет игре «Говорящая Африка»! Это текущий пользовательский поток:

  1. Пользователь позвонит на наш номер и выслушает инструкции
  2. Они будут набирать свой ответ на панели набора номера во время вызова.
  3. Приложение подскажет им, выбрали ли они правильный ответ или нет.

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

Начиная

Чтобы настроить ваш телефонный звонок, мы будем использовать платформу Africa’s Talking. Africa’s Talking предоставляет API-интерфейсы, которые подключаются к телекоммуникационной инфраструктуре и упрощают разработчикам по всей Африке интеграцию таких услуг, как SMS, голосовая связь, USSD, платежи и эфирное время. Также есть совершенно новая платформа IoT, которую вы тоже можете проверить.

Для начала вам понадобится программируемый номер. Africa’s Talking предоставляет эти номера за плату, однако для этого урока вы можете получить номер бесплатно. Все, что вам нужно сделать, это рассказать нам, какую идею вы хотели бы реализовать на платформе Voice, и мы бесплатно предоставим вам номер! Заполните эту форму, чтобы поделиться своими идеями.

Как работает голосовой API Африки

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

Настройка проекта

Чтобы увидеть API в действии, нам нужно создать наше приложение. Я объясню, где мы будем работать с API, по ходу дела. Давайте это!

Создайте каталог проекта в выбранной вами папке с помощью следующих команд:

mkdir voice-python cd voice-python

Далее, поскольку мы пишем python, мы должны настроить нашу виртуальную среду python. Мы сделаем это с помощью следующих команд:

pip3 install virtualenv 
virtualenv venv 
source ./venv/bin/activate

После этого мы можем начать писать код. Запустите текстовый редактор по вашему выбору. Я выбираю VS Code, но Atom с интеграцией Kite действительно хорош для разработки на Python.

Создайте файл с именем app.py в корневом каталоге вашего проекта. Здесь будет жить большая часть нашего кода. В реальном сценарии у нас может быть гораздо больше файлов и модулей, но один файл облегчает написание этой статьи 😂

Прямо сейчас все, что нам нужно, — это микрофреймворк Flask, а также модуль Flask API, которые помогут нам построить наш сервер. Flask предназначен для создания облегченных серверов и идеально подходит для этого, а Flask API просто дает нам некоторые интересные функции, поскольку мы в основном создаем API. Давайте добавим его в наш проект:

pip3 install flask 
pip3 install Flask-API

Установив Flask и Flask API, мы действительно можем писать код. Добавьте следующие строки кода:

Это базовый каркас Flask, который устанавливает первый базовый маршрут и определяет, как приложение будет работать, включая порты и хост. Поскольку мы будем развертывать в Docker, нам нужно установить хост на 0.0.0.0 и получить наш порт непосредственно из ОС, на которой будет выполняться наше приложение.

Теперь мы создаем наше фактическое приложение.

Создание XML-ответов

Поскольку мы говорим о голосовых вызовах, помните, что они все еще являются технологией OG. Звонки существуют уже более 100 лет, поэтому некоторые их аспекты до сих пор окутаны старыми стандартами связи. Мы используем XML для связи с голосовыми серверами и определения некоторых аспектов нашего звонка.

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

Я не нашел подходящей библиотеки XML-конструктора для Python, но не стесняйтесь рассказать всем в комментариях

Давайте приступим к написанию наших первых правильных методов! Чуть ниже строки app=Flask(__name__) добавьте следующие строки кода:

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

entry_phrase()

Это будет первая фраза, которую пользователь услышит, когда приложение загрузится и соберет цифры, которые нажимает пользователь (мы используем# для регистрации пользовательского ввода). Он содержит инструкции о том, что делать, в том числе спрашивая возраст Africa's Talking. Окончательный XML выглядит примерно так:

Мы пока оставим элемент URL обратного вызова пустым, пока не развернем и не получим фактический маршрут, но для тестирования вы можете использовать localhost

success_flow()

Эта часть возвращает XML, который будет прочитан как сообщение об успехе, если кто-то правильно понял сообщение.

error_flow_too_high()

Это будет прочитано, если пользователь угадает больше фактического ответа.

error_flow_too_low()

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

Это будет прочитано, если ввод неверен.

Маршруты и логика

Маршрут index

Самое интересное здесь! На самом деле настроить маршруты, которые мы будем использовать, довольно просто. Большая часть работы действительно сделана.

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

Этот маршрут сделает для нас несколько вещей:

  1. Если HTTP-запрос, который мы получаем, представляет собой GET, то мы показываем код состояния 200, что означает, что все в порядке (по крайней мере, пока)
  2. Если запрос приходит как POST, тогда нам нужно что-то сказать нашему пользователю, и мы возвращаем entry_phrase().
  3. Если мы получаем что-то отличное от POST или GET, мы возвращаем ошибку. На сервере разрешены только запросы POST и GET.

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

Следует отметить, что на этом этапе API Africa’s Take’s будет отправлять данные в ваш API с некоторой базовой информацией. Давайте разберем некоторые данные, которые мы будем получать:

  1. sessionId — однозначно идентифицирует сеанс вызова.
  2. callerNumber — показывает, с какого номера звонят
  3. destinationNumber - это ваш Говорящий номер Африки
  4. dtmfDigits — это пользовательский ввод, который мы собираем, когда пользователь разговаривает по телефону.

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

Следующий маршрут

Далее нам нужно определить новый маршрут, <YOUR_URL>/voice/say.

Вы можете назвать маршрут как угодно.

Этот маршрут проверит, действительно ли введенные пользователем данные из предыдущего маршрута верны. Африканскому разговору 9 лет, и это ценность, с которой мы будем работать. Добавьте приведенный ниже код чуть ниже первого маршрута:

Здесь мы реализуем простую логику операторов if, которая проверяет правильность ввода пользователя, который мы получаем от API. Здесь мы используем только dtmfDigits, но вы можете сохранять ответы пользователей и использовать их как способ отслеживания прогресса в пользовательском потоке.

После этого у нас в основном готово наше голосовое приложение. Далее нам нужно подготовить его к развертыванию. Вы можете протестировать свои конечные точки с помощью Postman или, как я сегодня узнал благодаря Hashnode, Postwoman.

Развертывание в Heroku с помощью контейнера Docker

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

Это регистрирует нас в интерфейсе командной строки Heroku, а вторая команда получает настройку реестра контейнеров Heroku. Чтобы убедиться, что у вас правильно установлен Docker, запустите:

Вы должны увидеть что-то вроде Docker version 19.03.4, build 9013bf5. Это то, что я бегу в настоящее время.

Давайте приступим к развертыванию этого нашего замечательного приложения!

Докер и контейнеры

Docker фактически устраняет проблему «работает на моей машине, но не в рабочей среде», с которой многие из нас сталкивались. Чтобы сделать наше приложение контейнерным, нам нужно создать файл Dockerfile. Для этого создайте новый файл на своем терминале с помощью:

Откройте файл и добавьте следующие строки:

FROM python:3 
WORKDIR /code 
ENV FLASK_APP app.py 
ENV FLASK_RUN_HOST 0.0.0.0 
COPY requirements.txt requirements.txt 
RUN pip install -r requirements.txt 
COPY . . 
CMD ["python","app.py"]

Вот что происходит:

  1. Первая строка создает контейнер, созданный на основе образа Python 3 Alpine, представляющего собой облегченный дистрибутив Linux.
  2. Строка 2 устанавливает рабочий каталог как код
  3. Строка 3 устанавливает приложение фляги по умолчанию как app.py. Это переменная среды
  4. Строка 4 устанавливает хост по умолчанию на 0.0.0.0. Это также переменная среды
  5. Затем мы копируем файл requirements.txt в контейнер.
  6. Мы устанавливаем пакеты, определенные в файле requirements.txt, в контейнер
  7. Мы копируем все файлы проекта в рабочий каталог контейнера /code.
  8. Затем мы выполняем команду python app.py в терминале контейнера.

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

Во-первых, мы встроим наш контейнер в образ. Мы просим докера собрать этот контейнер, пометить его voiceapp и использовать Dockerfile в этой папке.

docker build -t voiceapp .

Во-вторых, мы создадим приложение heroku:

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

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

heroku container:release web

Теперь мы в прямом эфире!!!!

Вы можете просмотреть свое приложение на панели инструментов Heroku или просмотреть логи из контейнера, используя:

Не забудьте добавить ссылку на свой маршрут /voice/say, как только он появится в сети

Подключение к панели Talking Voice в Африке

Теперь, когда наше приложение запущено, мы переходим к панели Africa’s Talking. Если у вас нет учетной записи, зарегистрироваться очень просто. После того, как все настроено, создайте команду и приложение, которое вы будете использовать. В настоящее время мы все еще работаем над выпуском голосовой песочницы, поэтому мы сразу же перейдем к реальной учетной записи. Перейдите на вкладку Голос, и вы сможете увидеть назначенный вам номер. Для этого продукта вам не понадобится API-ключ.

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

Резюме

Сегодня мы создали приложение IVR с некоторыми базовыми функциями. Это вкус силы африканских Talking API. Я хотел бы знать, какие замечательные приложения вы можете создать с помощью этой технологии, и мы будем давать номера разработчикам и стартапам с отличными идеями о том, как использовать эту технологию. Вы можете заполнить эту форму, и мы свяжемся с вами как можно скорее! Не терпится увидеть, какое потрясающее программное обеспечение выйдет из этого.

Следующие шаги

Далее мы рассмотрим немного более продвинутые методы, связанные с голосовой связью и USSD. Если у вас есть крутые приложения, созданные вами на основе Africa’s Talking, поделитесь ими в статье, и мы вас поблагодарим! (и немного влияния тоже!!! 😁)

Первоначально опубликовано на https://anthonylimo.hashnode.dev.