Como integrar APIs de machine learning

Como integrar APIs de machine learning

Sobre este codelab

subjectÚltimo jun. 30, 2021 atualizado
account_circleEscrito por Torry Yang

1. Visão geral

Este codelab oferece um tour rápido por algumas APIs de machine learning. Você usará:

  • Cloud Vision para entender o conteúdo de uma imagem
  • Cloud Speech-to-Text para transcrever áudio em texto
  • O Cloud Translation é usado para traduzir uma string arbitrária para qualquer idioma compatível.
  • Cloud Natural Language para extrair informações do texto

O que você vai criar

Você criará um pipeline que compara uma gravação de áudio com uma imagem e determina a relevância uma da outra. Veja uma prévia de como você fará isso:

e6a57e5def315116.jpeg

O que você vai aprender

  • Como usar as APIs Vision, Speech-to-Text, Translation e Natural Language
  • Onde encontrar amostras de código

Pré-requisitos

  • Um navegador, como o Chrome ou o Firefox
  • Conhecimento básico de Python

2. Configuração e requisitos

Configuração de ambiente personalizada

  1. Faça login no Console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Lembre-se do código do projeto, um nome exclusivo em todos os projetos do Google Cloud. O nome acima já foi escolhido e não servirá para você. Faremos referência a ele mais adiante neste codelab como PROJECT_ID.

  1. Em seguida, será necessário ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.

A execução deste codelab não será muito cara, se for o caso. Siga todas as instruções na seção "Limpeza", que orienta você sobre como encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de teste sem custo financeiro de US$ 300.

Ative as APIs

Clique neste link para ativar todas as APIs necessárias. Depois de fazer isso, ignore as instruções de configuração da autenticação. Vamos fazer isso em breve. Como alternativa, você pode ativar cada API individualmente. Para fazer isso, clique no ícone de menu no canto superior esquerdo da tela.

2bfc27ef9ba2ec7d.png.

Selecione APIs e serviços na lista suspensa e clique em "Painel".

a9546a22581facd5.png

Clique em Ativar APIs e serviços.

eae7ff043d13a35.png.

Depois, procure "vision" na caixa de pesquisa. Clique em API Google Cloud Vision:

a47893f36372ae2f.png

Clique em Ativar para ativar a API Cloud Vision:

a24fd082a22030ad.png

Aguarde até que ele seja ativado. Você verá isto quando estiver ativado:

633e58cbde1b74c6.png

Repita o mesmo processo para ativar as APIs Cloud Speech, Cloud Translation e Cloud Natural Language.

Cloud Shell

O Google Cloud Shell é um ambiente de linha de comando executado no Cloud. Esta máquina virtual baseada em Debian tem todas as ferramentas de desenvolvimento necessárias (gcloud, bq, git e outras) e oferece um diretório principal permanente de 5 GB. Usaremos o Cloud Shell para criar nossa solicitação às APIs de machine learning.

Para começar a usar o Cloud Shell, clique no ícone Screen Shot 2015-06-08 at 5.30.32 PM.png"Ativar o Google Cloud Shell" no canto superior direito da barra de cabeçalho.

24ef50000ca737a4.png.

Uma sessão do Cloud Shell é aberta em um novo frame na parte inferior do console e um prompt de linha de comando é exibido. Aguarde até que a solicitação "user@project:~$" seja exibida.

Opcional: editor de código

Dependendo do seu conforto com a linha de comando, clique no ícone "Launch Code Editor" b885bf07bc1b02e5.png no canto superior direito da barra do Cloud Shell.

de00be9278baf7b8.png

Conta de serviço

Você precisará de uma conta de serviço para a autenticação. Para criar uma, substitua [NAME] pelo nome da conta de serviço que você quer e execute o seguinte comando no Cloud Shell:

gcloud iam service-accounts create [NAME]

Agora você precisará gerar uma chave para usar essa conta de serviço. Substitua [FILE_NAME] pelo nome desejado da chave, [NAME] pelo nome da conta de serviço acima e [PROJECT_ID] pelo ID do seu projeto. O comando a seguir cria e faz o download da chave como [FILE_NAME].json:

gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com

Para usar a conta de serviço, defina a variável GOOGLE_APPLICATION_CREDENTIALS como o caminho da chave. Para fazer isso, execute o seguinte comando depois de substituir [PATH_TO_FILE] e [FILE_NAME]:

export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_FILE]/[FILE_NAME].json

3. Cloud Vision

Cliente Python

Você precisará do cliente Python para o Cloud Vision. Para instalar, digite o seguinte no Cloud Shell:

pip install --upgrade google-cloud-vision --user

Vamos fazer um teste

Vamos dar uma olhada nos exemplos de código da API Cloud Vision. Estamos interessados em descobrir o que há em uma imagem especificada. detect.py parece ser útil para isso, portanto, vamos pegá-lo. Uma maneira é copiar o conteúdo de detect.py, criar um novo arquivo no Cloud Shell chamado vision.py e colar todo o código em vision.py. É possível fazer isso manualmente no editor de código do Cloud Shell ou executar este comando curl no Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/vision/cloud-client/detect/detect.py -o vision.py

Depois de fazer isso, use a API executando o seguinte comando no Cloud Shell:

python vision.py labels-uri gs://cloud-samples-data/ml-api-codelab/birds.jpg

Você verá uma resposta sobre pássaros e avestruzes, conforme analisado nesta imagem: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

O que está acontecendo?

Você transmitiu dois argumentos para vision.py:

  • labels-uri seleciona a função detect_labels_uri() a ser executada
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg é o local de uma imagem no Google Cloud Storage e é transmitido como uri para detect_labels_uri().

Vamos ver mais detalhes sobre a detect_labels_uri(). Observe os comentários adicionais que foram inseridos.

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. Cloud Speech-to-Text

Cliente Python

Você precisará do cliente Python para a Cloud Speech-to-Text. Para instalar, digite o seguinte no Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Vamos fazer um teste

Vamos ver as amostras de código da Cloud Speech-to-Text. Estamos interessados em transcrever o áudio de fala. O transcribe.py parece ser um bom ponto de partida, então vamos usá-lo. Copie o conteúdo de tran.py, crie um novo arquivo no Cloud Shell chamado speech2text.py e cole todo o código em speech2text.py. É possível fazer isso manualmente no editor de código do Cloud Shell ou executar este comando curl no Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/speech/cloud-client/transcribe.py -o speech2text.py

Depois de fazer isso, use a API executando o seguinte comando no Cloud Shell:

python speech2text.py gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Podem ocorrer erros referentes à codificação incorreta e à taxa de Hertz da amostra. Não se preocupe, acesse transcribe_gcs() no código e exclua as configurações encoding e sampe_hertz_rate de RecognitionConfig(). Enquanto isso, mude o código do idioma para "tr-TR' já que tr-ostrich.wav é uma gravação de fala em turco.

config = types.RecognitionConfig(language_code='tr-TR')

Agora, execute speech2text.py novamente. A saída precisa ser um texto em turco, conforme o áudio analisado: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

O que está acontecendo?

Você transmitiu o arquivo gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, que é o local de um arquivo de áudio no Google Cloud Storage para speech2text.py, que é transmitido como gcs_uri para transcribe_uri().

Vamos dar uma olhada em nosso transcribe_uri() modificado.

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. Cloud Translation

Cliente Python

Você precisará do cliente Python para o Cloud Translation. Para instalar, digite o seguinte no Cloud Shell:

sudo pip install --upgrade google-cloud-translate

Vamos fazer um teste

Agora vamos conhecer os exemplos de código do Cloud Translation. Para os fins deste codelab, queremos traduzir textos do inglês para o inglês. snippets.py está como queremos. Copie o conteúdo de snippets.py, crie um novo arquivo no Cloud Shell chamado translate.py e cole todo o código em translate.py. É possível fazer isso manualmente no editor de código do Cloud Shell ou executar este comando curl no Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/translate/cloud-client/snippets.py -o translate.py

Depois de fazer isso, use a API executando o seguinte comando no Cloud Shell:

python translate.py translate-text en '你有沒有帶外套'

A tradução deveria ser "Você tem uma jaqueta?

O que está acontecendo?

Você transmitiu três argumentos para translate.py:

  • translate-text seleciona a função translate_text() a ser executada;
  • en é transmitido como destino para translate_text() e serve para especificar o idioma para o qual será traduzido
  • ‘你有沒有帶外套' é a string a ser traduzida e transmitida como text para translate_text().

Vamos ver mais detalhes sobre a translate_text(). Anote os comentários que foram adicionados.

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. Cloud Natural Language

Cliente Python

Você precisará do cliente Python para o Cloud Natural Language. Para instalar, digite o seguinte no Cloud Shell:

sudo pip install --upgrade google-cloud-language

Vamos fazer um teste

Por fim, vamos ver os exemplos de código da API Cloud Natural Language. Queremos detectar entidades no texto. Parece que o snippets.py contém um código que faz isso. Copie o conteúdo de snippets.py, crie um novo arquivo no Cloud Shell chamado natural_language.py e cole todo o código em natural_language.py. É possível fazer isso manualmente no editor de código do Cloud Shell ou executar este comando curl no Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/language/cloud-client/v1/snippets.py -o natural_language.py

Depois de fazer isso, use a API executando o seguinte comando no Cloud Shell:

python natural_language.py entities-text 'where did you leave my bike'

A API deve identificar "bike" como uma entidade. As entidades podem ser substantivos próprios (Figuras públicas, pontos de referência etc.) ou substantivos comuns (restaurante, estádio etc.).

O que está acontecendo?

Você transmitiu dois argumentos para natural_language.py:

  • Entities-text seleciona a função entities_text() a ser executada.
  • "onde você deixou minha bicicleta&: 3 é a string a ser analisada para entidades e passada como texto para entities_text()

Vamos ver mais detalhes sobre a entities_text(). Anote os novos comentários que foram inseridos.

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. Vamos integrá-los

Vamos nos lembrar do que você está construindo.

e6a57e5def315116.jpeg

Agora, vamos reunir tudo. Crie um arquivo solution.py. Copie e cole detect_labels_uri(), transcribe_gcs(), translate_text() e entities_text() das etapas anteriores em solution.py.

Declarações de importação

Remova a marca de comentário e mova as instruções de importação para o topo. Observe que speech.types e language.types estão sendo importados. Isso pode causar conflito. Por isso, vamos removê-los e mudar cada ocorrência de types no transcribe_gcs() e no entities_text() para speech.types e language.types, respectivamente. Você verá:

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

Resultados de retorno

Em vez de imprimir, faça com que as funções retornem os resultados. Você verá algo como:

# 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

Usar as funções

Depois de todo esse trabalho duro, você consegue chamar essas funções. Vá em frente, faça isso! Veja um exemplo:

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.')

Compatibilidade com vários idiomas

Anteriormente, fixamos o código em turco em transcribe_gcs(). Vamos mudar isso para que o idioma seja especificado em compare_audio_to_image(). Veja as mudanças necessárias:

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)

Testar

O código final pode ser encontrado em solution.py neste repositório do GitHub. Aqui está um comando curl para buscar:

curl https://raw.githubusercontent.com/googlecodelabs/integrating-ml-apis/master/solution.py -O

A versão no GitHub contém argparse, que permite o seguinte da linha de comando:

python solution.py tr-TR gs://cloud-samples-data/ml-api-codelab/tr-ball.wav gs://cloud-samples-data/ml-api-codelab/football.jpg

Para cada item encontrado, o código deve gerar "o áudio e a imagem contêm: ". No exemplo acima, seria "o áudio e a imagem contêm: ball".

Bônus: tente mais

Veja mais locais de arquivos de áudio e imagem para testar.

8. Parabéns!

Você explorou e integrou quatro APIs de machine learning para determinar se uma amostra de fala está falando sobre a imagem fornecida. Isso é só o começo. Há muitas outras maneiras de melhorar esse pipeline.

O que vimos

  • Como fazer solicitações para a API Cloud Vision
  • Como fazer solicitações para a API Cloud Speech-to-Text
  • Como fazer solicitações para a API Cloud Translation
  • Como fazer solicitações para a API Cloud Natural Language
  • Usar todas as APIs acima juntas

Próximas etapas