Integración de APIs de aprendizaje automático

1. Descripción general

En este codelab, se te guiará por algunas APIs 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 cadena arbitraria a cualquier idioma admitido
  • Cloud Natural Language para extraer información del texto

Qué compilarás

Construirás una canalización que comparará una grabación de audio con una imagen y determinará su relevancia mutua. Aquí tienes un avance de cómo lo lograrás:

e6a57e5def315116.jpeg

Qué aprenderás

  • Cómo usar las APIs 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 de autoaprendizaje

  1. Accede a la consola de Cloud 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

b9a10ebdf5b5a448.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 la consola de Cloud 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 “Realiza una limpieza”, en la que se indica cómo cerrar los recursos para no incurrir en facturaciones más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Habilitar las API

Puedes hacer clic en este vínculo para habilitar todas las APIs 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ú ubicado en la parte superior izquierda de la pantalla.

2bfc27ef9ba2ec7d.png

Selecciona APIs & services en el menú desplegable y haz clic en Panel.

a9546a22581facd5.png

Haz clic en Habilitar APIs y servicios.

eae7ff043d13a35.png

Luego, busca "visión" en el cuadro de búsqueda. Haz clic en Google Cloud Vision API:

a47893f36372ae2f.png

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

a24fd082a22030ad.png

Espera unos segundos para que se habilite. Verás este mensaje cuando se habilite:

633e58cbde1b74c6.png

Repite el mismo proceso para habilitar las APIs 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 de desarrollo 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 APIs de aprendizaje automático.

Para comenzar a usar Cloud Shell, haz clic en el ícono "Activar Google Cloud Shell" Screen Shot 2015-06-08 at 5.30.32 PM.png en la esquina superior derecha de la barra de 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 nivel de comodidad con la línea de comandos, es posible que desees hacer clic en el ícono b885bf07bc1b02e5.png "Iniciar editor de código" 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, reemplaza [NAME] por el nombre deseado de la cuenta de servicio y ejecuta el siguiente comando en Cloud Shell:

gcloud iam service-accounts create [NAME]

Ahora, deberás generar una clave para usar esa cuenta de servicio. Reemplaza [FILE_NAME] por el nombre deseado de la clave, [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, deberás configurar la variable GOOGLE_APPLICATION_CREDENTIALS en la ruta de acceso de la clave. Para ello, ejecuta 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 instalarlo, escribe lo siguiente en Cloud Shell:

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

Probar

Veamos las muestras de código de la API de Cloud Vision. Nos interesa saber qué hay en una imagen específica. detect.py parece ser útil para esto, así que lo tomaremos. 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. Puedes hacerlo de forma manual en el editor de código de Cloud Shell o 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 para usar la API:

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

Deberías 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

¿Qué sucede?

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 en detect_labels_uri().

Analicemos detect_labels_uri() con más detalle. 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 de Python para Cloud Speech-to-Text. Para instalarlo, escribe lo siguiente en Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Probar

Dirijámonos a las muestras de código de Cloud Speech-to-Text. Nos interesa transcribir el audio de voz. transcribe.py parece ser un buen lugar para comenzar, así que lo usaremos. 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. Puedes hacerlo de forma manual en el editor de código de Cloud Shell o 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 para usar la API:

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

Debería haber errores que indiquen que la codificación y la tasa de Hertz de la muestra son incorrectas. No te preocupes, ve a transcribe_gcs()en el código y borra la configuración de encoding y sampe_hertz_rate de RecognitionConfig(). Ya que estás, 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 ese fue el audio analizado: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

¿Qué sucede?

Pasaste 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 de Python para Cloud Translation. Para instalarlo, escribe lo siguiente en Cloud Shell:

sudo pip install --upgrade google-cloud-translate

Probar

Ahora, veamos las muestras de código de Cloud Translation. Para los fines de este codelab, queremos traducir texto al inglés. snippets.py parece ser lo que queremos. Copia el contenido de snippets.py, crea un archivo nuevo en Cloud Shell llamado translate.py y pega todo el código en translate.py. Puedes hacerlo de forma manual en el editor de código de Cloud Shell o 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 para usar la API:

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

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

¿Qué sucede?

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 cadena que se traducirá y se pasa como texto a translate_text().

Analicemos translate_text() con más detalle. Observa 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 instalarlo, escribe lo siguiente en Cloud Shell:

sudo pip install --upgrade google-cloud-language

Probar

Por último, veamos las muestras de código de la API de Cloud Natural Language. Queremos detectar entidades en el texto. snippets.py parece contener código que hace eso. Copia el contenido de snippets.py, crea un archivo nuevo en Cloud Shell llamado natural_language.py y pega todo el código en natural_language.py. Puedes hacerlo de forma manual en el editor de código de Cloud Shell o 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 para usar la API:

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

La API debe identificar "bicicleta" como una entidad. Las entidades pueden ser nombres propios (figuras públicas, puntos de referencia, etc.) o nombres comunes (restaurante, estadio, etc.).

¿Qué sucede?

Pasaste 2 argumentos a natural_language.py:

  • entities-text selecciona la función entities_text() para ejecutar.
  • "¿Dónde dejaste mi bicicleta?" es la cadena que se analizará para detectar entidades y se pasa como texto a entities_text().

Analicemos entities_text() con más detalle. 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. Integrémoslos

Recordemos qué estás creando.

e6a57e5def315116.jpeg

Ahora, unamos todo. Crea un archivo solution.py, y copia y pega detect_labels_uri(), transcribe_gcs(), translate_text() y entities_text() de los pasos anteriores en solution.py.

Declaraciones de importación

Quita las marcas de comentario y mueve las instrucciones de importación a la parte superior. Ten en cuenta que se importan speech.types y language.types. Esto causará un conflicto, así que quitémoslos y cambiemos cada ocurrencia individual de types en transcribe_gcs() y entities_text() a speech.types y language.types, respectivamente. Deberías obtener 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

Devuelve resultados

En lugar de imprimir, haz que las funciones muestren los resultados. Deberías tener algo similar a lo 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 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.')

Compatibilidad con varios idiomas

Anteriormente, codificamos el turco en 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)

Probar

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

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

La versión de 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 generar el mensaje "El audio y la imagen contienen: ". En el ejemplo anterior, sería "El audio y la imagen contienen: pelota".

Adicional: Prueba más

Aquí tienes más ubicaciones de archivos de audio y de imagen que puedes probar.

Muestras de voz en tr-TR:gs://cloud-samples-data/ml-api-codelab/tr-ball.wavgs://cloud-samples-data/ml-api-codelab/tr-bike.wavgs://cloud-samples-data/ml-api-codelab/tr-jacket.wavgs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Muestras de voz en alemán (Alemania):gs://cloud-samples-data/ml-api-codelab/de-ball.wavgs://cloud-samples-data/ml-api-codelab/de-bike.wavgs://cloud-samples-data/ml-api-codelab/de-jacket.wavgs://cloud-samples-data/ml-api-codelab/de-ostrich.wav

Muestras de imágenes:gs://cloud-samples-data/ml-api-codelab/bicycle.jpggs://cloud-samples-data/ml-api-codelab/birds.jpggs://cloud-samples-data/ml-api-codelab/coat_rack.jpggs://cloud-samples-data/ml-api-codelab/football.jpg

8. ¡Felicitaciones!

Exploraste e integraste cuatro APIs 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

  • Cómo realizar solicitudes a la API de Cloud Vision
  • Cómo realizar solicitudes a la API de Cloud Speech-to-Text
  • Cómo realizar solicitudes a la API de Cloud Translation
  • Cómo realizar solicitudes a la API de Cloud Natural Language
  • Uso de todas las APIs anteriores en conjunto

Próximos pasos