Если вы пишете мне в Gchat, пока я в Slack, вы увидите это лицо. Пользователи Slack хотят держать всё в Slack, включая конференц-звонки. Джеймс Томас создал Phonebot, который транскрибирует ваши конференц-звонки и публикует их в Slack.
Вот как это работает. Когда вы звоните @Phonebot, вы можете инициировать звонок Twilio с вашей командой. Watson слушает звонок по частям, после того как аудио отправлено в REST API пакетами по 5 секунд. Затем Watson преобразует речь в текст и публикует его в чате Slack. Теперь вы можете отслеживать конференц-звонки прямо в Slack.
Вот описание хака, первоначально опубликованное Джеймсом Томасом в его блоге здесь.
Slack предоставляет множество API для интеграции пользовательских сервисов. Эти API предоставляют всё: от отправки простых сообщений как Slackbot до создания сервиса обмена мгновенными сообщениями в реальном времени.
Phonebot будет слушать сообщения, начинающиеся с *@phonebot*, и содержащие команды пользователя, например, dial (набрать), hangup (повесить трубку). Он будет создавать новые сообщения в канале с результатами транскрибированной речи, а также сообщения о статусе. Пользователи могут использовать следующие команды для управления Phonebot.
Мы используем API Incoming Webhooks для публикации новых сообщений в канале и API Outgoing Webhook для уведомления приложения о пользовательских командах в канале.
При создании нового Outgoing Webhook, сообщения из зарегистрированных каналов, начинающиеся с префикса «@phonebot», будут отправляться по HTTP-URL для приложения IBM Bluemix, обрабатывающего входящие сообщения.
Мы можем создать Outgoing Webhooks для каждого канала, в котором хотим зарегистрировать Phonebot.
Для каждого зарегистрированного канала нам нужно разрешить Phonebot публиковать новые сообщения.
Incoming Webhooks предоставляют обфусцированный HTTP-URL, который позволяет выполнять HTTP-запросы без аутентификации для создания новых сообщений в канале. Создание нового обфусцированного URL для каждого канала, который мы прослушиваем, позволит Phonebot отправлять ответы.
Каждый URL Incoming Webhook будет передан приложению Phonebot через конфигурацию с помощью переменных окружения.
Twilio предоставляет «телефонию как услугу», позволяя приложениям совершать телефонные звонки с помощью REST API.
Twilio доступен на платформе IBM Bluemix. Привязка этой службы к вашему приложению предоставит учетные данные для аутентификации, которые можно использовать с клиентской библиотекой Twilio.
Когда пользователи вводят команду «call» с номером телефона, бот канала, прослушивающий команды пользователя, генерирует пользовательское событие.
В объекте «phone» метод «call» запускает следующий код.
Параметр URL предоставляет HTTP-URL, который Twilio будет использовать для отправки обновленной информации о статусе вызова. HTTP-ответы с этого местоположения сообщат Twilio, как обрабатывать текущий вызов, например, воспроизвести аудиосообщение, нажать следующие цифры, записать аудио с телефонной линии.
Если телефонный звонок успешно установлен, нам нужен аудиопоток телефонной линии для преобразования речи в текст. *К сожалению, Twilio не поддерживает прямой доступ к аудиопотоку в реальном времени. Однако можно записать фрагмент аудио, например, пять секунд, и скачать полученный файл.*
Поэтому мы попросим Twilio записать короткий фрагмент аудио и отправить результаты обратно в наше приложение. Когда это сообщение будет получено, наш ответ будет содержать запрос на запись еще пяти секунд. Этот подход обеспечит полу-реальное время потока аудио телефонных звонков для обработки.
Вот фрагмент кода для создания TwiML-ответа для записи аудиофрагмента. Любые сообщения канала, поставленные в очередь для отправки в виде речи, будут добавлены в исходящий ответ.
Когда у нас будут аудиофайлы, содержащие аудио телефонного звонка, мы можем запланировать их для транскрипции с помощью службы IBM Watson Speech To Text.
Используя службу IBM Watson Speech To Text, мы можем просто транскрибировать телефонные звонки, отправляя аудиофайл в REST API. Клиентская библиотека обрабатывает выполнение фактических API-запросов через простой JavaScript-интерфейс.
Ранее мы занимались преобразованием аудиофайла из формата, созданного Twilio, в формат, необходимый для API Watson, поэтому мы смогли повторно использовать класс translate.js между проектами.
Этот модуль зависит от установленной в нативной среде библиотеки SOX. Мы использовали пользовательский buildpack для поддержки этого.
Когда будет получено новое сообщение Twilio с деталями записи аудио, мы запланируем запрос на транскрипцию. По мере завершения этой фоновой задачи результаты будут опубликованы в соответствующем канале Slack.
Если запрос на транскрипцию занимает больше времени, чем ожидалось, могут быть запланированы дополнительные запросы до завершения первого. Мы по-прежнему хотим поддерживать порядок при публикации новых сообщений в канале, даже если более поздние запросы завершаются раньше.
Используя библиотеку async, создается однопоточная очередь для планирования задач транскрипции.
Каждый раз, когда объект телефона для канала генерирует событие «recording», мы запускаем запрос на транскрипцию и помещаем воркер в очередь канала.
Когда задача попадает в начало очереди, вызывается функция воркера для обработки результата.
Если задача транскрипции завершена, мы сигнализируем очереди о завершении задачи. В противном случае мы ждем событий завершения.
Теперь, когда код завершен, мы можем настроить приложение для развертывания на облачной платформе IBM Bluemix.
Phonebot должен получать настроенные URL входящих веб-хуков, что позволит ему отправлять сообщения в канал. Следуя стандартному соглашению Platform-as-a-Service для передачи конфигурации, мы храним веб-хуки каналов в виде переменных окружения.
Используя CF CLI, мы запускаем следующую команду для настройки локальных параметров среды.
Манифесты приложений настраивают параметры развертывания для приложений Cloud Foundry. Phonebot должен быть привязан к Twilio, IBM Watson и пользовательским сервисам, а также к настройке среды выполнения.
Пользователи могут отправлять сообщения **@phonebot КОМАНДА** для управления телефонными звонками непосредственно из канала Slack.
Для получения дополнительной информации о проекте следите за проектом на Github. Предстоящие функции перечислены на странице issues. **Не стесняйтесь запрашивать новые функции, сообщать об ошибках и оставлять отзывы на Github.**