Это моя первая публикация на Medium, так что терпите меня (Я уверен, что все будет хорошо).

Меня зовут Том, я изучаю компьютерные науки в Университете Бирмингема. Скорее всего, вы поймаете меня на хакатоне, когда я буду есть торт или спать. В противном случае я, вероятно, буду писать JS, Haskell или Python и медленно рыдать в свои руки, размышляя о том, почему Java является предпочтительным языком в моем курсе.

Итак, я провел прошлые выходные на замечательном Hackference, трехдневном мероприятии, состоящем из пятничной конференции и хакатона на выходных. Вы можете узнать больше о взломе на https://hackference.co.uk - это определенно стоит проверить!

Чтобы подготовить сцену, я был на слишком большом хакатонах за последний год, и, честно говоря, я также провел большую часть из них, болтая с людьми и общаясь. Я не говорю, что это безусловно один из лучших опытов, которые у меня когда-либо были, я не могу сказать, что я развил свои технические навыки настолько, насколько мог бы. готово ... и поэтому я был (и до сих пор остаюсь в некоторой степени) довольно неуверенным в своем техническом мастерстве (или его отсутствии, так сказать). Более того, я никогда не разрабатывал хакер самостоятельно - вместо этого я решил объединиться с моими замечательными друзьями и, следовательно, чувствовать, что они несли меня по пути.

Однако на этот раз я передумал. Вдохновленный удивительным Сэмом Мачином - создателем AlexaPi и Alexa Web - я решил отделиться от своей команды, чтобы преследовать цель - разговаривать в часы и получать ответ от Алексы. .

Звучит просто, правда? Просто передайте Алексе речь из Pebble, и Pebble проиграет ее все. Быстрый, 2-х минутный взлом. Неправильно. Было всего несколько неожиданных препятствий, которые мне пришлось преодолеть. Во-первых, невозможно подключиться к аудиопотоку Pebble, то есть единственный результат диктовки - это открытый текст. Блестяще. Вот где мне пришлось подумать… «нестандартно», где вышеупомянутая коробка - нормальная реальность.

Что ж, я подумал про себя ... Если Алекса хочет wav, у Алексы может быть wav ... , который я получу API Bing Text to Speech от Microsoft, чтобы сгенерировать его для меня . Теперь я хотел, чтобы результат был несколько масштабируемым в долгосрочной перспективе (и мы с Сэмом планируем немного реорганизовать все это, чтобы позволить любому пользователю Amazon использовать свой Alexa ), поэтому я решил, что мне понадобится сервер. Опять же, мне никогда раньше не приходилось писать сервер, но я знал, что могу использовать Python Flask для создания чего-то простого… и я так и сделал.

Создав простой пользовательский интерфейс с помощью PebbleJS, я настроил его для отправки AJAX-запроса на мой сервер и выложил на сервере базовый конвейер, через который я буду передавать текст из Pebble - Текст - ›Речь -› Речь - ›Текст - просто, правда? Или подробнее,

Шаг 1. Сделайте диктовку на камешке и отправьте GET-запрос на сервер Flask с продиктованным текстом в качестве параметра запроса.
Шаг 2
. Используйте Microsoft Bing. Text to Speech API, чтобы получить звуковую волну из текста
Шаг 3. Передайте wav в API Amazon Alexa Voice Service, чтобы получить mp3, содержащий ответ Alexa
Шаг 4. Преобразуйте mp3 в формат wav и передайте его в Google Speech to Text API.
Шаг 5. Передайте текст обратно в Pebble в качестве ответа от GET запрос

Первый шаг был прекрасным (и к этому моменту он тоже был завершен). IDE CloudPebble от Pebble (https://cloudpebble.net) прекрасно работает и действительно оптимизирует процесс разработки. Благодаря некоторой помощи (и Pebble Time) Джона Барлоу Pebble я смог очень быстро все наладить и запустить.

Второй шаг звучит легко, но, честно говоря, документация Microsoft (по крайней мере, для речевых API) в лучшем случае неоднородна *. Хотя он пытался передать процесс, получив пример запроса POST в форме

POST /synthesize
HTTP/1.1
Host: speech.platform.bing.com
Content-Type: audio/wav; samplerate=8000

X-Microsoft-OutputFormat: riff-8khz-8bit-mono-mulaw
Content-Type: text/plain; charset=utf-8
Host: speech.platform.bing.com
Content-Length: 197

<speak version='1.0' xml:lang='en-US'><voice xml:lang='en-US' xml:gender='Female' name='Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)'>Microsoft Bing Voice Output API</voice></speak>

и немного другой информации на самой странице (см. https://www.microsoft.com/cognitive-services/en-us/Speech-api/documentation/API-Reference-REST/BingVoiceOutput), потребовалось Сэм, Джон и Фил Леггеттер около часа возились с Postman (, кстати, прекрасный инструмент ❤), чтобы синтезировать запрос, который действительно сделал то, что мы хотели.

На третьем этапе в основном использовался код Сэма из репозитория alexaweb (см. Https://github.com/sammachin/alexaweb) и его искажение ради MVP путем жесткого кодирования моих учетных данных (включая токен обновления и т. Д.) . Заявление об ограничении ответственности: мы планируем улучшить это в ближайшем будущем за счет oAuth-ing пользователей и хранения их токенов обновления вместе с UUID их устройства Pebble с помощью Redis.

Первоначально я планировал использовать Microsoft Speech Recognition API для преобразования ответа Alexa обратно в открытый текст (для четвертого шага), но снова мне было трудно сделать запрос на основе документации, представленной на сайте * (см. Https: // www.microsoft.com/cognitive-services/en-us/Speech-api/documentation/API-Reference-REST/BingVoiceRecognition ). В конце концов мне удалось сделать запрос (с помощью POST с несколькими параметрами запроса), но время ожидания каждого запроса, которое я делал, составляло 14000 мс, и в конце концов я решил использовать Google Speech to Text API. Честно говоря, особо нечего сказать об этом - им было действительно легко пользоваться, и я определенно рекомендую его.

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

Последнее препятствие, с которым я столкнулся, было связано с PebbleJS, который я использовал для рисования и обработки пользовательского интерфейса. Суть проблемы заключалась в том, что программа пыталась выполнить вызов AJAX (что неудивительно) асинхронно по отношению к диктовке, что означало, что это было с ошибкой ... ну, с ошибкой в ​​стиле JS, что означает, что это просто ' изящно ' продолжал, как ни в чем не бывало.

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

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

tl; dr - я заставил одного «робота» разговаривать с другим «роботом», который разговаривал с другим «роботом», чтобы отвечать на вопросы с часов.

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

* отказ от ответственности - здесь я не пытаюсь критиковать Microsoft, большая часть документации для других сервисов находится на высшем уровне (а иногда и некоторые), но я бы хотел увидеть улучшения в документации, которые упростят эту задачу. чтобы люди могли использовать эту службу в будущем.