Integrar las API de aprendizaje automático

Integrar las API de aprendizaje automático

Acerca de este codelab

subjectÚltima actualización: jun 30, 2021
account_circleEscrito por Torry Yang

1. Descripción general

En este codelab, podrás ver rápidamente algunas de las API de aprendizaje automático. Usarás lo siguiente:

  • Cloud Vision para comprender el contenido de una imagen
  • Cloud Speech-to-Text para transcribir audio a texto
  • Cloud Translation para traducir una string arbitraria a cualquier idioma compatible
  • Cloud Natural Language para extraer información del texto

Qué compilarás

Vas a crear una canalización que compare una grabación de audio con una imagen y que determine su relevancia entre sí. Este es un adelanto de cómo lograrás esto:

e6a57e5def315116.jpeg

Qué aprenderás

  • Cómo usar las API de Vision, Speech-to-Text, Translation y Natural Language
  • Dónde encontrar muestras de código

Requisitos

  • Un navegador, como Chrome o Firefox
  • Conocimientos básicos de Python

2. Configuración y requisitos

Configuración del entorno a su propio ritmo

  1. Accede a Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

96a9c957bc475304.png

b9a10ebdf5b5a415.png

a1e3c01a38fa61c2.png

Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID.

  1. A continuación, deberás habilitar la facturación en Cloud Console para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección "Limpieza" que te aconseja cómo cerrar recursos para no incurrir en facturación más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa de prueba gratuita de USD 300.

Habilitar las API

Puede hacer clic en este vínculo para habilitar todas las API necesarias. Después de hacerlo, puedes ignorar las instrucciones para configurar la autenticación; lo haremos en un momento. Como alternativa, puedes habilitar cada API de forma individual. Para ello, haz clic en el ícono de menú en la parte superior izquierda de la pantalla.

2bfc27ef9ba2ec7d.png

Selecciona API y servicios en la lista desplegable y haz clic en Panel.

a9546a22581facd5.png

Haga clic en Habilitar API y servicios.

eae7ff043d13a35.png

Luego, busca &vision en el cuadro de búsqueda. Haga clic en API de Google Cloud Vision:

a47893f36372ae2f.png

Haga clic en Habilitar para habilitar la API de Cloud Vision:

a24fd082a22030ad.png

Espera a que se habilite. Cuando la habilites, verás lo siguiente:

633e58cbde1b74c6.png

Repita el mismo proceso para habilitar las API de Cloud Speech, Cloud Translation y Cloud Natural Language.

Cloud Shell

Google Cloud Shell es un entorno de línea de comandos que se ejecuta en la nube. Esta máquina virtual basada en Debian está cargada con todas las herramientas para desarrolladores que necesitarás (gcloud, bq, git y otras) y ofrece un directorio principal persistente de 5 GB. Usaremos Cloud Shell para crear nuestra solicitud a las API de aprendizaje automático.

Para comenzar a usar Cloud Shell, haz clic en el ícono "Activar Google Cloud Shell" Captura de pantalla del 2015-06-08 a las 5.30.32 PM.pngen la esquina superior derecha de la barra del encabezado.

24ef50000ca737a4.png

Se abrirá una sesión de Cloud Shell en un marco nuevo en la parte inferior de la consola, que mostrará una línea de comandos. Espera hasta que aparezca el mensaje user@project:~$.

Opcional: Editor de código

Según tu comodidad con la línea de comandos, puedes hacer clic en el ícono de"Iniciar editor de código"b885bf07bc1b02e5.png en la esquina superior derecha de la barra de Cloud Shell.

De00be9278baf7b8.png

Cuenta de servicio

Necesitarás una cuenta de servicio para autenticarte. Para crear una cuenta, reemplace [NAME] por el nombre que desea darle al servicio y ejecute el siguiente comando en Cloud Shell:

gcloud iam service-accounts create [NAME]

Ahora, debes generar una clave para usar esa cuenta de servicio. Reemplaza [FILE_NAME] por el nombre de clave que desees, [NAME] por el nombre de la cuenta de servicio anterior y [PROJECT_ID] por el ID de tu proyecto. El siguiente comando creará y descargará la clave como [FILE_NAME].json:

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

Para usar la cuenta de servicio, tendrás que configurar la variable GOOGLE_APPLICATION_CREDENTIALS en la ruta de acceso de la clave. Para ello, ejecute el siguiente comando después de reemplazar [PATH_TO_FILE] y [FILE_NAME]:

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

3. Cloud Vision

Cliente de Python

Necesitarás el cliente de Python para Cloud Vision. Para realizar la instalación, escribe lo siguiente en Cloud Shell:

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

Probemos

Revisemos las muestras de código para la API de Cloud Vision. Estamos interesados en averiguar qué es lo que aparece en una imagen especificada. detect.py parece ser útil para este fin, así que tomemos esa decisión. Una forma es copiar el contenido de detect.py, crear un archivo nuevo en Cloud Shell llamado vision.py y pegar todo el código en vision.py. Puede hacerlo de forma manual en el editor de código de Cloud Shell o puede ejecutar este comando curl en Cloud Shell:

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

Después de hacerlo, ejecuta lo siguiente en Cloud Shell mediante la API:

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

Debería ver un resultado sobre aves y avestruces, ya que esta fue la imagen analizada: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

¿A qué se debe?

Pasaste 2 argumentos a vision.py:

  • labels-uri selecciona la función detect_labels_uri() para ejecutarla.
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg es la ubicación de una imagen en Google Cloud Storage y se pasa como uri a detect_labels_uri().

Analicemos detect_labels_uri(). Observa los comentarios adicionales que se insertaron.

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 de Python

Necesitarás el cliente Python para Cloud Speech-to-Text. Para realizar la instalación, escribe lo siguiente en Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Probemos

Vayamos a las muestras de código de Cloud Speech-to-Text. Nos interesa transcribir audio de voz. transcribe.py parece ser un buen punto de partida, así que utilízalo. Copia el contenido de transcribe.py, crea un archivo nuevo en Cloud Shell llamado speech2text.py y pega todo el código en speech2text.py. Puede hacerlo de forma manual en el editor de código de Cloud Shell o puede ejecutar este comando curl en Cloud Shell:

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

Después de hacerlo, ejecuta lo siguiente en Cloud Shell mediante la API:

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

Debe haber errores con las quejas sobre la codificación incorrecta y la tasa de hertz de muestra. No te preocupes, ve a transcribe_gcs() en el código y borra la configuración encoding y sampe_hertz_rate de RecognitionConfig(). Mientras lo haces, cambia el código de idioma a "tr-TR' ya que tr-ostrich.wav es una grabación de voz en turco.

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

Ahora, vuelve a ejecutar speech2text.py. El resultado debería ser un texto en turco, ya que este fue el análisis de audio: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

¿A qué se debe?

Pasó gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, la ubicación de un archivo de audio en Google Cloud Storage a speech2text.py, que luego se pasa como gcs_uri a transcribe_uri().

Analicemos con más detalle nuestro 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 de Python

Necesitarás el cliente Python para Cloud Translation. Para instalar, escribe lo siguiente en Cloud Shell:

sudo pip install --upgrade google-cloud-translate

Probemos

Ahora, veamos las muestras de código para Cloud Translation. Para los fines de este codelab, queremos traducir texto al inglés. snippets.py se ve así. Copia el contenido desnippets.py, crea un archivo nuevo en Cloud Shell llamado translate.py y pega todo el código en translate.py. Puede hacerlo de forma manual en el editor de código de Cloud Shell o puede ejecutar este comando curl en Cloud Shell:

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

Después de hacerlo, ejecuta lo siguiente en Cloud Shell mediante la API:

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

La traducción debe ser "¿Tienes una chaqueta?

¿A qué se debe?

Pasaste 3 argumentos a translate.py:

  • translate-text selecciona la función translate_text() para ejecutarla
  • en se pasa como target a translate_text() y sirve para especificar el idioma al que se traducirá.
  • ‘你有沒有帶外套' es la string que se traducirá y se pasa como texto a translate_text().

Analicemos translate_text(). Observe los comentarios que se agregaron.

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 de Python

Necesitarás el cliente de Python para Cloud Natural Language. Para realizar la instalación, escribe lo siguiente en Cloud Shell:

sudo pip install --upgrade google-cloud-language

Probemos

Por último, veamos las muestras de código para la API de Cloud Natural Language. Queremos detectar entidades en el texto. Parece que snippets.py contiene código para realizar esta acción. Copia el contenido desnippets.py, crea un archivo nuevo en Cloud Shell llamado natural_language.py y pega todo el código en natural_language.py. Puede hacerlo de forma manual en el editor de código de Cloud Shell o puede ejecutar este comando curl en Cloud Shell:

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

Después de hacerlo, ejecuta lo siguiente en Cloud Shell mediante la API:

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

La API debe identificar a “bike” como entidad. Las entidades pueden ser sustantivos propios (figuras públicas, puntos de referencia, etc.) o sustantivos comunes (restaurante, estadio, etcétera).

¿A qué se debe?

Pasaste 2 argumentos a natural_language.py:

  • entities-text selecciona la función entities_text() para ejecutarla
  • "where you left my Bike " (dónde dejaste mi bicicleta) es la string que se analizará para las entidades y se pasa como texto a entities_text().

Analicemos entities_text(). Observa los comentarios nuevos que se insertaron.

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. Integrarlos

Repasemos lo que estás compilando.

e6a57e5def315116.jpeg

Ahora vamos a reunir todas las opciones. Crea un archivo solution.py; copia y pega detect_labels_uri(), transcribe_gcs(), translate_text() y entities_text() de los pasos anteriores en solution.py.

Cómo importar declaraciones

Quita los comentarios y mueve las sentencias de importación a la parte superior. Ten en cuenta que se están importando speech.types y language.types. Esto va a causar conflictos, así que quitémoslos y cambiemos cada caso individual de types en transcribe_gcs() y entities_text() a speech.types y language.types, respectivamente. Debería quedarte con lo siguiente:

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

Mostrar resultados

En lugar de imprimir, haz que las funciones muestren los resultados. Debería tener un resultado similar al siguiente:

# 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

Usa las funciones

Después de todo ese arduo trabajo, puedes llamar a esas funciones. Adelante, ¡hazlo! Por ejemplo:

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

Cómo admitir varios idiomas

Anteriormente, codificamos en turco a transcribe_gcs(). Cambiemos eso para que el idioma se pueda especificar desde compare_audio_to_image(). Estos son los cambios necesarios:

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)

Pruébalo

El código final se encuentra en solution.py de este repositorio de GitHub. Este es un comando curl para capturarlo:

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

La versión en GitHub contiene argparse, que permite lo siguiente desde la línea de comandos:

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 elemento encontrado, el código debe mostrar &&t;el audio y la imagen deben contener: " en el ejemplo anterior, sería&audio; la imagen y el audio contienen dos pelotas.

Opción adicional: Prueba más

Aquí se incluyen más ubicaciones para archivos de imagen y audio que puedes probar.

8. ¡Felicitaciones!

Exploraste e integraste cuatro API de aprendizaje automático para determinar si una muestra de voz habla sobre la imagen proporcionada. Esto es solo el comienzo, ya que hay muchas más formas de mejorar esta canalización.

Temas abordados

  • Realiza solicitudes a la API de Cloud Vision
  • Realiza solicitudes a la API de Cloud Speech-to-Text
  • Realiza solicitudes a la API de Cloud Translation
  • Realiza solicitudes a la API de Cloud Natural Language
  • Cómo usar todas las API anteriores

Próximos pasos