1. Обзор
В этой лабораторной работе вы кратко познакомитесь с несколькими API машинного обучения. Вам понадобятся:
- Cloud Vision для понимания содержания изображения
- Cloud Speech-to-Text для преобразования аудио в текст
- Cloud Translation для перевода произвольной строки на любой поддерживаемый язык
- Cloud Natural Language для извлечения информации из текста
Что вы построите
Вы создадите конвейер, который сравнивает аудиозапись с изображением и определяет их релевантность друг другу. Вот небольшой краткий обзор того, как это будет реализовано:
Чему вы научитесь
- Как использовать API-интерфейсы Vision, Speech-to-Text, Translation и Natural Language
- Где найти примеры кода
Что вам понадобится
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в Cloud Console и создайте новый проект или используйте существующий. Если у вас ещё нет учётной записи Gmail или Google Workspace, вам необходимо её создать .
Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не будет вам работать, извините!). Далее в этой практической работе он будет обозначаться как PROJECT_ID
.
- Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.
Выполнение этой лабораторной работы не должно обойтись дорого, если вообще обойтись. Обязательно следуйте инструкциям в разделе «Очистка», где рассказывается, как отключить ресурсы, чтобы не платить за них после окончания этого руководства. Новые пользователи Google Cloud могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
Включить API
Вы можете перейти по этой ссылке, чтобы включить все необходимые API . После этого можете игнорировать инструкции по настройке аутентификации — мы сделаем это чуть позже. Вы также можете включить каждый API по отдельности. Для этого нажмите на значок меню в левом верхнем углу экрана.
Выберите API и службы из раскрывающегося списка и нажмите «Панель управления».
Нажмите «Включить API и службы» .
Затем введите «vision» в поле поиска. Нажмите на Google Cloud Vision API :
Нажмите «Включить» , чтобы включить API Cloud Vision:
Подождите несколько секунд, пока он включится. После включения вы увидите следующее:
Повторите тот же процесс, чтобы включить API Cloud Speech, Cloud Translation и Cloud Natural Language .
Cloud Shell
Google Cloud Shell — это среда командной строки, работающая в облаке . Эта виртуальная машина на базе Debian оснащена всеми необходимыми инструментами разработки ( gcloud
, bq
, git
и другими) и предлагает постоянный домашний каталог объёмом 5 ГБ. Мы будем использовать Cloud Shell для создания запросов к API машинного обучения.
Чтобы начать работу с Cloud Shell, нажмите «Активировать Google Cloud Shell». значок в правом верхнем углу панели заголовка
Сеанс Cloud Shell откроется в новом фрейме в нижней части консоли и отобразит приглашение командной строки. Дождитесь появления приглашения user@project:~$.
Дополнительно: редактор кода
В зависимости от того, насколько хорошо вы умеете работать с командной строкой, вы можете нажать «Запустить редактор кода». значок в правом верхнем углу панели Cloud Shell
Учетная запись службы
Для аутентификации вам потребуется учётная запись сервиса. Чтобы создать её, замените [ИМЯ] на имя нужной учётной записи сервиса и выполните следующую команду в Cloud Shell:
gcloud iam service-accounts create [NAME]
Теперь вам нужно сгенерировать ключ для использования этой учётной записи сервиса. Замените [FILE_NAME] на желаемое имя ключа, [NAME] на имя учётной записи сервиса, указанное выше, а [PROJECT_ID] на идентификатор вашего проекта. Следующая команда создаст и скачает ключ в формате [FILE_NAME].json:
gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com
Чтобы использовать учётную запись сервиса, необходимо указать путь к ключу в переменной GOOGLE_APPLICATION_CREDENTIALS. Для этого выполните следующую команду, заменив [PATH_TO_FILE] на [FILE_NAME]:
export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_FILE]/[FILE_NAME].json
3. Облачное видение
Python-клиент
Вам понадобится клиент Python для Cloud Vision. Для установки введите в командной строке Cloud Shell следующее:
pip install --upgrade google-cloud-vision --user
Давайте попробуем
Давайте рассмотрим примеры кода для API Cloud Vision . Нам интересно узнать, что находится на указанном изображении. detect.py
кажется полезным для этого, поэтому давайте его возьмём. Один из способов — скопировать содержимое detect.py , создать новый файл в Cloud Shell с именем vision.py
и вставить весь код в vision.py
. Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/vision/cloud-client/detect/detect.py -o vision.py
После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:
python vision.py labels-uri gs://cloud-samples-data/ml-api-codelab/birds.jpg
Вы должны увидеть вывод о птицах и страусах, поскольку это было проанализированное изображение: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg
Что происходит?
Вы передали vision.py
2 аргумента:
- labels-uri выбирает функцию
detect_labels_uri()
для запуска - gs://cloud-samples-data/ml-api-codelab/birds.jpg — это местоположение изображения в облачном хранилище Google, которое передается как URI в
detect_labels_uri()
Давайте подробнее рассмотрим функцию detect_labels_uri()
. Обратите внимание на добавленные комментарии.
def detect_labels_uri(uri):
"""Detects labels in the file located in Google Cloud Storage or on the
Web."""
# relevant import from above
# from google.cloud import vision
# create ImageAnnotatorClient object
client = vision.ImageAnnotatorClient()
# create Image object
image = vision.types.Image()
# specify location of image
image.source.image_uri = uri
# get label_detection response by passing image to client
response = client.label_detection(image=image)
# get label_annotations portion of response
labels = response.label_annotations
print('Labels:')
for label in labels:
# print the label descriptions
print(label.description)
4. Облачная функция преобразования речи в текст
Python-клиент
Вам понадобится клиент Python для Cloud Speech-to-Text. Для установки введите в командной строке Cloud Shell следующее:
sudo pip install --upgrade google-cloud-speech
Давайте попробуем
Давайте перейдём к примерам кода для Cloud Speech-to-Text . Нас интересует транскрибирование речи. transcribe.py
выглядит как хорошее начало, поэтому давайте его используем. Скопируйте содержимое файла transcribe.py , создайте новый файл в Cloud Shell с именем speech2text.py
и вставьте весь код в speech2text.py
. Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/speech/cloud-client/transcribe.py -o speech2text.py
После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:
python speech2text.py gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav
Должны быть ошибки, сообщающие о неправильной кодировке и частоте дискретизации. Не волнуйтесь, перейдите в transcribe_gcs()
в коде и удалите настройки encoding
и sampe_hertz_rate
из RecognitionConfig()
. Заодно измените код языка на tr-TR, так как tr-ostrich.wav
— это запись речи на турецком языке.
config = types.RecognitionConfig(language_code='tr-TR')
Теперь снова запустите speech2text.py
. На выходе должен быть текст на турецком языке, поскольку анализировался следующий аудиофайл: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav
Что происходит?
Вы передали gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav , местоположение аудиофайла в Google Cloud Storage, в speech2text.py
, который затем передается как gcs_uri в transcribe_uri()
Давайте подробнее рассмотрим наш модифицированный transcribe_uri()
.
def transcribe_gcs(gcs_uri):
"""Transcribes the audio file specified by the gcs_uri."""
from google.cloud import speech
# enums no longer used
# from google.cloud.speech import enums
from google.cloud.speech import types
# create ImageAnnotatorClient object
client = speech.SpeechClient()
# specify location of speech
audio = types.RecognitionAudio(uri=gcs_uri)
# set language to Turkish
# removed encoding and sample_rate_hertz
config = types.RecognitionConfig(language_code='tr-TR')
# get response by passing config and audio settings to client
response = client.recognize(config, audio)
# Each result is for a consecutive portion of the audio. Iterate through
# them to get the transcripts for the entire audio file.
for result in response.results:
# The first alternative is the most likely one for this portion.
# get the transcript of the first alternative
print(u'Transcript: {}'.format(result.alternatives[0].transcript))
5. Облачный перевод
Python-клиент
Вам понадобится клиент Python для Cloud Translation. Чтобы установить его, введите в Cloud Shell следующее:
sudo pip install --upgrade google-cloud-translate
Давайте попробуем
Теперь давайте посмотрим на примеры кода для Cloud Translation . В рамках этой лабораторной работы нам нужно перевести текст на английский язык. Файл snippets.py
выглядит как то, что нам нужно. Скопируйте содержимое snippets.py , создайте новый файл в Cloud Shell с именем translate.py
и вставьте весь код в translate.py
. Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/translate/cloud-client/snippets.py -o translate.py
После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:
python translate.py translate-text en '你有沒有帶外套'
Перевод должен быть таким: «У тебя есть куртка?».
Что происходит?
Вы передали translate.py
3 аргумента:
- translate-text выбирает функцию
translate_text()
для запуска - en передается как цель в
translate_text()
и служит для указания языка, на который нужно перевести - «你有沒有帶外套» — это строка, которую нужно перевести, и она передается в виде текста в
translate_text()
Давайте подробнее рассмотрим translate_text()
. Обратите внимание на добавленные комментарии.
def translate_text(target, text):
"""Translates text into the target language.
Target must be an ISO 639-1 language code.
See https://g.co/cloud/translate/v2/translate-reference#supported_languages
"""
# relevant imports from above
# from google.cloud import translate
# import six
# create Client object
translate_client = translate.Client()
# decode text if it's a binary type
# six is a python 2 and 3 compatibility library
if isinstance(text, six.binary_type):
text = text.decode('utf-8')
# get translation result by passing text and target language to client
# Text can also be a sequence of strings, in which case this method
# will return a sequence of results for each text.
result = translate_client.translate(text, target_language=target)
# print original text, translated text and detected original language
print(u'Text: {}'.format(result['input']))
print(u'Translation: {}'.format(result['translatedText']))
print(u'Detected source language: {}'.format(
result['detectedSourceLanguage']))
6. Облачный естественный язык
Python-клиент
Вам понадобится клиент Python для Cloud Natural Language. Для установки введите в командной строке Cloud Shell следующее:
sudo pip install --upgrade google-cloud-language
Давайте попробуем
Наконец, давайте рассмотрим примеры кода для Cloud Natural Language API . Мы хотим обнаруживать сущности в тексте. Похоже, что snippets.py
содержит код, который это делает. Скопируйте содержимое snippets.py , создайте новый файл в Cloud Shell с именем natural_language.py
и вставьте весь код в natural_language.py
. Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/language/cloud-client/v1/snippets.py -o natural_language.py
После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:
python natural_language.py entities-text 'where did you leave my bike'
API должен идентифицировать «велосипед» как сущность. Сущности могут быть как именами собственными (общественные деятели, достопримечательности и т. д.), так и нарицательными (ресторан, стадион и т. д.).
Что происходит?
Вы передали 2 аргумента в natural_language.py
:
- entity-text выбирает функцию
entities_text()
для запуска - «где ты оставил мой велосипед» — это строка, которая анализируется на наличие сущностей и передается как текст в
entities_text()
Давайте подробнее рассмотрим entities_text()
. Обратите внимание на добавленные новые комментарии.
def entities_text(text):
"""Detects entities in the text."""
# relevant imports from above
# from google.cloud import language
# from google.cloud.language import enums
# from google.cloud.language import types
# import six
# create LanguageServiceClient object
client = language.LanguageServiceClient()
# decode text if it's a binary type
# six is a python 2 and 3 compatibility library
if isinstance(text, six.binary_type):
text = text.decode('utf-8')
# Instantiates a plain text document.
document = types.Document(
content=text,
type=enums.Document.Type.PLAIN_TEXT)
# Detects entities in the document. You can also analyze HTML with:
# document.type == enums.Document.Type.HTML
entities = client.analyze_entities(document).entities
# entity types from enums.Entity.Type
entity_type = ('UNKNOWN', 'PERSON', 'LOCATION', 'ORGANIZATION',
'EVENT', 'WORK_OF_ART', 'CONSUMER_GOOD', 'OTHER')
# print information for each entity found
for entity in entities:
print('=' * 20)
print(u'{:<16}: {}'.format('name', entity.name))
print(u'{:<16}: {}'.format('type', entity_type[entity.type]))
print(u'{:<16}: {}'.format('metadata', entity.metadata))
print(u'{:<16}: {}'.format('salience', entity.salience))
print(u'{:<16}: {}'.format('wikipedia_url',
entity.metadata.get('wikipedia_url', '-')))
7. Давайте их интегрируем
Давайте вспомним, что вы строите.
Теперь соберём всё воедино. Создайте файл solution.py
; скопируйте и вставьте detect_labels_uri()
, transcribe_gcs()
, translate_text()
и entities_text()
из предыдущих шагов в solution.py
.
Импортные заявления
Раскомментируйте и переместите операторы импорта в начало. Обратите внимание, что импортируются как speech.types
, так и language.types
. Это приведёт к конфликту, поэтому давайте просто удалим их и заменим каждое вхождение types
в transcribe_gcs()
и entities_text()
на speech.types
и language.types
соответственно. Должно получиться:
from google.cloud import vision
from google.cloud import speech
from google.cloud import translate
from google.cloud import language
from google.cloud.language import enums
import six
Возврат результатов
Вместо того, чтобы выводить результаты, заставьте функции возвращать их. Должно получиться что-то похожее на:
# import statements
def detect_labels_uri(uri):
# code
# we only need the label descriptions
label_descriptions = []
for label in labels:
label_descriptions.append(label.description)
return label_descriptions
def transcribe_gcs(gcs_uri):
# code
# naive assumption that audio file is short
return response.results[0].alternatives[0].transcript
def translate_text(target, text):
# code
# only interested in translated text
return result['translatedText']
def entities_text(text):
# code
# we only need the entity names
entity_names = []
for entity in entities:
entity_names.append(entity.name)
return entity_names
Используйте функции
После всей этой кропотливой работы вы можете вызывать эти функции. Вперёд, делайте это! Вот пример:
def compare_audio_to_image(audio, image):
"""Checks whether a speech audio is relevant to an image."""
# speech audio -> text
transcription = transcribe_gcs(audio)
# text of any language -> english text
translation = translate_text('en', transcription)
# text -> entities
entities = entities_text(translation)
# image -> labels
labels = detect_labels_uri(image)
# naive check for whether entities intersect with labels
has_match = False
for entity in entities:
if entity in labels:
# print result for each match
print('The audio and image both contain: {}'.format(entity))
has_match = True
# print if there are no matches
if not has_match:
print('The audio and image do not appear to be related.')
Поддержка нескольких языков
Ранее мы жёстко закодировали турецкий язык в transcribe_gcs()
. Давайте изменим это так, чтобы язык можно было указать в compare_audio_to_image()
. Вот необходимые изменения:
def transcribe_gcs(language, gcs_uri):
...
config = speech.types.RecognitionConfig(language_code=language)
def compare_audio_to_image(language, audio, image):
transcription = transcribe_gcs(language, audio)
Попробуй это
Окончательный код можно найти в файле solution.py этого репозитория GitHub . Вот команда curl для его получения:
curl https://raw.githubusercontent.com/googlecodelabs/integrating-ml-apis/master/solution.py -O
Версия на GitHub содержит argparse, который позволяет выполнять следующие действия из командной строки:
python solution.py tr-TR gs://cloud-samples-data/ml-api-codelab/tr-ball.wav gs://cloud-samples-data/ml-api-codelab/football.jpg
Для каждого найденного элемента код должен вывести «И аудио, и изображение содержат:». В примере выше это будет «И аудио, и изображение содержат: мяч».
Бонус: попробуйте еще
Вот еще несколько мест расположения аудиофайлов и файлов изображений, которые можно попробовать.
8. Поздравляем!
Вы изучили и интегрировали четыре API машинного обучения, чтобы определить, соответствует ли образец речи представленному изображению. Это только начало, и есть ещё много способов улучшить этот конвейер!
Что мы рассмотрели
- Выполнение запросов к API Cloud Vision
- Выполнение запросов к API преобразования речи в текст в облаке
- Выполнение запросов к API облачного перевода
- Выполнение запросов к API Cloud Natural Language
- Совместное использование всех вышеперечисленных API
Следующие шаги
- Для лучшего сравнения слов взгляните на word2vec
- Ознакомьтесь с более подробными практическими занятиями по Vision API , Speech-to-Text API , Translation API и Natural Language API.
- Попробуйте заменить Cloud Vision на интеллектуальную систему Cloud Video.
- Синтезируйте речевой звук с помощью API Cloud Text-to-Speech
- Узнайте, как загружать объекты в облачное хранилище