Как создать сервис мгновенного перевода с помощью Twilio MMS, CamFind и Microsoft Translator

Автор: | 29.07.2026

Представьте ситуацию: вы на романтическом вечере со своей второй половинкой и любуетесь красивым закатом. Вам вдруг приходит в голову мысль заработать несколько бонусных очков, описав эту сцену на французском, но вы не знаете языка! Если бы только можно было отправить фотографию в удобный сервис мгновенного перевода, вы бы узнали, что слова любви звучат как «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.