Представьте ситуацию: вы на романтическом вечере со своей второй половинкой и любуетесь красивым закатом. Вам вдруг приходит в голову мысль заработать несколько бонусных очков, описав эту сцену на французском, но вы не знаете языка! Если бы только можно было отправить фотографию в удобный сервис мгновенного перевода, вы бы узнали, что слова любви звучат как «une magnifique coucher de soleil»!
К счастью, используя Twilio-номер с поддержкой MMS и несколько API (CamFind и Microsoft Translator), создать такой сервис перевода довольно просто. После того как я покажу вам, как создать базовый переводчик, вы сможете легко использовать романтические французские фразы или фразы на любом другом языке!
— Аккаунт Twilio — зарегистрироваться можно бесплатно здесь.
— Twilio-номер с поддержкой MMS (доступно в США и Канаде).
— Ruby.
— Библиотека Twilio для Ruby.
— Sinatra.
— Аккаунт Mashape (для CamFind).
— Аккаунт Microsoft Translator.
Первая версия приложения будет поддерживать перевод изображения на пять языков: испанский, французский, итальянский, немецкий и клингонский. Пользователь отправит MMS-сообщение на наш Twilio-номер с фотографией и указанием языка, на который нужно перевести описание изображения. Мы также позволим пользователю отправить слово «list», чтобы получить список поддерживаемых языков.
Как только мы получим корректное MMS-сообщение от пользователя, мы отправим ответ с уведомлением о том, что выполняется анализ изображения и скоро будет готов перевод. URL изображения из MMS-сообщения отправляется в API CamFind для анализа. Результаты вызова CamFind API передаются в API Microsoft Translator для перевода на запрошенный пользователем язык.
После того как все компоненты будут на месте, пользователю отправится SMS с предположительным описанием изображения и его переводом на целевой язык.
Попробуйте прямо сейчас, отправив фотографию на номер:
(202) 800-1180
Не забудьте добавить текст к фотографии, чтобы указать переводчику, на какой язык нужно перевести изображение.
Полный код проекта доступен, если вы хотите следовать за нами: Github
Для начала работы над проектом вам понадобится установить Ruby и Ruby Gems. Если вы используете Mac, это уже должно быть установлено. Пользователям Windows рекомендую ознакомиться с Ruby Installer. Для пользователей Linux, которым может понадобиться освежить знания по управлению пакетами, вот руководство по использованию apt-get в Ubuntu.
Теперь, когда это требование выполнено, откройте окно терминала и создайте новую папку для нашего приложения:
Перейдите в только что созданный каталог, чтобы установить несколько Ruby Gems:
Далее создадим файл, в котором будет храниться наше приложение:
Мы создадим помощника-переводчика с использованием Sinatra — легковесного веб-фреймворка на Ruby. Также мы будем использовать gem Twilio для Ruby, чтобы взаимодействовать с API Twilio и упростить работу. Я использую gem Unirest для выполнения REST-запросов к API CamFind, но вы можете использовать другой способ для этих запросов, если у вас есть предпочтения (например, Rest Client).
Теперь, когда структура проекта готова, давайте переводить изображения!
Наш серверный код будет содержать всего одну конечную точку для обработки входящих MMS-сообщений, поэтому этот проект отлично подходит для легковесного фреймворка, такого как Sinatra. Простота на стороне сервера позволяет сосредоточиться на логике, необходимой для перевода изображений.
Начнем с настройки сервера Sinatra и необходимых зависимостей:
Конечная точка, которую мы настроим на /translate, будет вызываться Twilio при получении сообщения на наш Twilio-номер. Перед запросом мы настроим несколько переменных в фильтре before, которые можно будет использовать на протяжении всего приложения:
Здесь мы сохраняем текст, отправленный пользователем вместе с сообщением. Это может быть либо язык, на который пользователь хочет перевести описание, либо ключевое слово «list». Также мы сохраняем номер телефона пользователя и URL отправленной им фотографии. Первое, что нужно проверить, — отправил ли пользователь язык. Если язык не указан, мы установим перевод по умолчанию на французский:
Далее проверим, отправил ли пользователь ключевое слово «list». В этом случае мы отправим пользователю SMS со списком поддерживаемых языков для перевода:
Теперь, когда мы определили, есть ли текст во входящем сообщении, нужно также проверить, есть ли фотография. Если её нет, переводить будет нечего, поэтому мы уведомим пользователя ответным SMS:
Следующее, что нужно сделать, — сопоставить язык, указанный пользователем, со списком поддерживаемых языков. Добавьте следующий метод в начало файла app.rb сразу после строк require:
Метод check_language сравнивает целевой язык с поддерживаемыми языками. Если совпадение найдено, возвращается сокращенный формат, который ожидает Microsoft Translator в процессе перевода. Теперь нужно вызвать этот метод из нашей конечной точки /translate с запрошенным языком:
Если @language_format равен nil, значит, язык, запрошенный пользователем, не поддерживается. Сообщим об этом пользователю и укажем, какие языки доступны:
Последнее, что нужно сделать перед основной работой по переводу изображения, — уведомить пользователя, что это может занять некоторое время:
Поскольку анализ изображения и процесс перевода займут около минуты, мы должны убедиться, что эта работа выполняется после того, как пользователь получил уведомление о начале процесса. Gem sinatra-run-later позволяет запускать код после возврата конечной точки /translate. Добавьте следующий код в начало конечной точки /translate:
Анализ изображения с помощью API CamFind занимает некоторое время. Выполняется компьютерный анализ изображения, а затем, как правило, человек просматривает изображение и описывает его. Когда мы отправляем запрос в API, мы получаем токен, который можно использовать для запроса деталей анализа изображения позже. Мы сохраним этот токен и подождем минуту, чтобы процесс анализа завершился:
На этом этапе мы можем запросить результаты у API CamFind:
Переменная description будет содержать описание изображения на английском языке от CamFind. Это именно то, что нам нужно передать в API Microsoft Translator, чтобы помочь пользователю сказать это на другом языке. Используем gem bing_translator для отправки запроса в Microsoft Translator с нашим английским текстом и целевым языком, указанным пользователем:
Теперь у нас есть окончательный перевод запроса пользователя. Мы можем использовать gem twilio-ruby для выполнения REST-запроса и отправки SMS пользователю с переведенным текстом. Для сравнения мы также сообщим, что, по мнению CamFind, изображено на фотографии на английском языке:
Вот и всё — теперь вы можете переводить любое изображение в описание на другом языке, просто отправив MMS. Разместите код вашего сервера в общедоступном месте, чтобы Twilio мог связаться с вашим сервером. Я рекомендую использовать Heroku для этого, и это руководство покажет, как развернуть приложение Sinatra на Heroku. Вы можете посмотреть полный проект на Github.
Чтобы наш сервис перевода заработал, нужно подключить приложение к Twilio, чтобы входящие сообщения направлялись в логику нашего приложения. Войдите в Twilio и перейдите в раздел управления номерами. Нажмите на номер, который хотите использовать для переводчика, и настройте URL сообщений так, чтобы он указывал на ваш недавно развернутый сервер Sinatra:
Ваш помощник мгновенного перевода готов к работе! Отправьте фотографию и укажите язык для перевода, и вскоре вы сможете описывать окружающий мир на нескольких языках.
Мне кажется, идея иметь помощника мгновенного перевода в кармане — это здорово, но ещё больше я рад видеть, как вы расширите его возможности. Вот несколько идей для развития того, что мы создали:
— Создайте обучающую игру в виде карточек на основе результатов перевода.
— Реализуйте голосовой звонок через Twilio для озвучивания результатов вместо SMS.
Пока что мы только начали исследовать возможности Twilio MMS. Я думаю, лучшие варианты использования создадут именно вы, удивительные разработчики. Не стесняйтесь делиться тем, что вы создадите. Напишите мне на brent@twilio.com или свяжитесь в Twitter @brentschooley.