О практической работе
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 и службы ».
Затем найдите «видение» в поле поиска. Нажмите на Google Cloud Vision API :
Нажмите « Включить », чтобы включить Cloud Vision API:
Подождите несколько секунд, пока он не включится. Вы увидите это, как только он будет включен:
Повторите тот же процесс, чтобы включить Cloud Speech, Cloud Translation и Cloud Natural Language API .
Облачная оболочка
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] на идентификатор вашего проекта. Следующая команда создаст и загрузит ключ как [ИМЯ_ФАЙЛА].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. Для установки введите в облачную оболочку следующее:
pip install --upgrade google-cloud-vision --user
Давай попробуем
Давайте взглянем на примеры кода для Cloud Vision API . Мы заинтересованы в том, чтобы узнать, что находится на указанном изображении. 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
В чем дело?
Вы передали 2 аргумента vision.py
:
- 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. Для установки введите в облачную оболочку следующее:
sudo pip install --upgrade google-cloud-speech
Давай попробуем
Давайте перейдем к примерам кода для Cloud Speech-to-Text . Мы заинтересованы в расшифровке аудио речи. transcribe.py
выглядит хорошим местом для начала, так что давайте воспользуемся им. Скопируйте содержимое transscribe.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 в 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 '你有沒有帶外套'
Перевод должен быть "У тебя есть куртка?".
В чем дело?
Вы передали 3 аргумента для translate.py
:
- 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. Для установки введите в облачную оболочку следующее:
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()
и entity_text entities_text()
из предыдущих шагов в solution.py
.
Операторы импорта
Раскомментируйте и переместите операторы импорта наверх. Обратите внимание, что импортируются как speech.types
, так и language.types
. Это вызовет конфликт, поэтому давайте просто удалим их и изменим каждое отдельное вхождение types
в transscribe_gcs( transcribe_gcs()
и entity_text 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
- Выполнение запросов к Cloud Speech-to-Text API
- Выполнение запросов к Cloud Translation API
- Выполнение запросов к Cloud Natural Language API
- Использование всех вышеперечисленных API вместе
Следующие шаги
- Для лучшего сравнения слов взгляните на word2vec.
- Ознакомьтесь с более подробными лабораторными работами по Vision API , Speech-to-Text API , Translation API и Natural Language API .
- Попробуйте заменить Cloud Vision на Cloud Video Intelligence.
- Синтезируйте речевой звук с помощью Cloud Text-to-Speech API
- Узнайте, как загружать объекты в облачное хранилище