Intégrer des API de machine learning

1. Présentation

Cet atelier de programmation vous présentera rapidement quelques API de machine learning. Vous utiliserez :

  • Cloud Vision pour comprendre le contenu d'une image
  • Cloud Speech-to-Text pour transcrire des pistes audio en texte
  • Cloud Translation pour traduire une chaîne arbitraire dans n'importe quelle langue compatible
  • Cloud Natural Language pour extraire des informations à partir de texte

Objectifs de l'atelier

Vous allez créer un pipeline qui compare un enregistrement audio à une image et détermine leur pertinence mutuelle. Voici un aperçu de la façon dont vous allez procéder :

e6a57e5def315116.jpeg

Points abordés

  • Utiliser les API Vision, Speech-to-Text, Translation et Natural Language
  • Où trouver des exemples de code ?

Prérequis

  • Un navigateur tel que Chrome ou Firefox
  • Maîtrise des bases de Python

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à la console Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud (le nom ci-dessus est déjà pris ; vous devez en trouver un autre). Il sera désigné par le nom PROJECT_ID tout au long de cet atelier de programmation.

  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

L'exécution de cet atelier de programmation est très peu coûteuse, voire gratuite. Veillez à suivre les instructions de la section "Nettoyer" qui indique comment désactiver les ressources afin d'éviter les frais une fois ce tutoriel terminé. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300$.

Activer les API

Vous pouvez cliquer sur ce lien pour activer toutes les API nécessaires. Une fois que vous l'aurez fait, n'hésitez pas à ignorer les instructions de configuration de l'authentification. Nous le ferons dans un instant. Vous pouvez également activer chaque API individuellement. Pour ce faire, cliquez sur l'icône de menu en haut à gauche de l'écran.

2bfc27ef9ba2ec7d.png

Sélectionnez API et services dans le menu déroulant, puis cliquez sur "Tableau de bord".

a9546a22581facd5.png

Cliquez sur Activer les API et les services.

eae7ff043d13a35.png

Ensuite, recherchez "vision" dans le champ de recherche. Cliquez sur API Google Cloud Vision :

a47893f36372ae2f.png

Cliquez sur Activer pour activer l'API Cloud Vision :

a24fd082a22030ad.png

Patientez quelques secondes jusqu'à ce qu'il soit activé. Une fois la fonctionnalité activée, vous verrez ceci :

633e58cbde1b74c6.png

Répétez la même procédure pour activer les API Cloud Speech, Cloud Translation et Cloud Natural Language.

Cloud Shell

Google Cloud Shell est un environnement de ligne de commande exécuté dans le cloud. Cette machine virtuelle basée sur Debian contient tous les outils de développement dont vous aurez besoin (gcloud, bq, git, etc.) et offre un répertoire de base persistant de 5 Go. Nous allons utiliser Cloud Shell pour créer notre requête pour les API de machine learning.

Pour commencer à utiliser Cloud Shell, cliquez sur l'icône "Activer Google Cloud Shell" Screen Shot 2015-06-08 at 5.30.32 PM.png en haut à droite de la barre d'en-tête.

24ef50000ca737a4.png

Une session Cloud Shell s'ouvre dans un nouveau cadre en bas de la console et affiche une invite de ligne de commande. Attendez que l'invite user@project:~$ s'affiche.

Facultatif : Éditeur de code

Selon votre niveau de confort avec la ligne de commande, vous pouvez cliquer sur l'icône "Lancer l'éditeur de code" b885bf07bc1b02e5.png en haut à droite de la barre Cloud Shell.

de00be9278baf7b8.png

Compte de service

Vous aurez besoin d'un compte de service pour vous authentifier. Pour en créer un, remplacez [NAME] par le nom de compte de service souhaité et exécutez la commande suivante dans Cloud Shell :

gcloud iam service-accounts create [NAME]

Vous devez maintenant générer une clé pour utiliser ce compte de service. Remplacez [FILE_NAME] par le nom de clé souhaité, [NAME] par le nom du compte de service indiqué ci-dessus et [PROJECT_ID] par l'ID de votre projet. La commande suivante permet de créer et de télécharger la clé sous le nom [FILE_NAME].json :

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

Pour utiliser le compte de service, vous devez définir la variable GOOGLE_APPLICATION_CREDENTIALS sur le chemin d'accès de la clé. Pour ce faire, exécutez la commande suivante après avoir remplacé [PATH_TO_FILE] et [FILE_NAME]:

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

3. Cloud Vision

Client Python

Vous aurez besoin du client Python pour Cloud Vision. Pour l'installer, saisissez la commande suivante dans Cloud Shell :

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

Essayons

Examinons les exemples de code de l'API Cloud Vision. Nous souhaitons savoir ce que contient une image spécifique. detect.py semble utile pour cela, alors récupérons-le. Pour ce faire, vous pouvez copier le contenu de detect.py, créer un fichier dans Cloud Shell appelé vision.py et y coller tout le code.vision.py Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell :

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

Une fois cette opération effectuée, utilisez l'API en exécutant la commande suivante dans Cloud Shell :

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

Vous devriez voir un résultat concernant des oiseaux et des autruches, car il s'agit de l'image analysée : https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg.

Que se passe-t-il ?

Vous avez transmis deux arguments à vision.py :

  • labels-uri sélectionne la fonction detect_labels_uri() à exécuter.
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg correspond à l'emplacement d'une image sur Google Cloud Storage et est transmis en tant que uri dans detect_labels_uri().

Examinons de plus près detect_labels_uri(). Notez les commentaires supplémentaires qui ont été insérés.

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

Client Python

Vous aurez besoin du client Python pour Cloud Speech-to-Text. Pour l'installer, saisissez la commande suivante dans Cloud Shell :

sudo pip install --upgrade google-cloud-speech

Essayons

Accédez aux exemples de code pour Cloud Speech-to-Text. Nous souhaitons transcrire des contenus audio vocaux. transcribe.py semble être un bon point de départ. Utilisons-le. Copiez le contenu de transcribe.py, créez un fichier dans Cloud Shell appelé speech2text.py et collez-y tout le code.speech2text.py Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell :

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

Une fois cette opération effectuée, utilisez l'API en exécutant la commande suivante dans Cloud Shell :

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

Des erreurs devraient s'afficher pour signaler un encodage et une fréquence d'échantillonnage hertzienne incorrects. Ne vous inquiétez pas, accédez à transcribe_gcs() dans le code et supprimez les paramètres encoding et sampe_hertz_rate de RecognitionConfig(). Pendant que vous y êtes, remplacez le code de langue par "tr-TR", car tr-ostrich.wav est un enregistrement vocal en turc.

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

Exécutez à nouveau speech2text.py. Le résultat doit être un texte en turc, car il s'agit de la langue de l'extrait audio analysé : https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav.

Que se passe-t-il ?

Vous avez transmis gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, l'emplacement d'un fichier audio sur Google Cloud Storage, à speech2text.py, qui est ensuite transmis en tant que gcs_uri dans transcribe_uri().

Examinons de plus près notre transcribe_uri() modifié.

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

Client Python

Vous aurez besoin du client Python pour Cloud Translation. Pour l'installer, saisissez la commande suivante dans Cloud Shell :

sudo pip install --upgrade google-cloud-translate

Essayons

Passons maintenant aux exemples de code pour Cloud Translation. Dans cet atelier de programmation, nous souhaitons traduire du texte en anglais. snippets.py ressemble à ce que nous voulons. Copiez le contenu de snippets.py, créez un fichier dans Cloud Shell appelé translate.py et collez-y tout le code.translate.py Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell :

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

Une fois cette opération effectuée, utilisez l'API en exécutant la commande suivante dans Cloud Shell :

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

La traduction devrait être "Avez-vous une veste ?".

Que se passe-t-il ?

Vous avez transmis trois arguments à translate.py :

  • translate-text sélectionne la fonction translate_text() à exécuter.
  • en est transmis en tant que target dans translate_text() et sert à spécifier la langue dans laquelle traduire le texte.
  • 你有沒有帶外套 est la chaîne à traduire et est transmise en tant que text dans translate_text()

Examinons de plus près translate_text(). Notez les commentaires qui ont été ajoutés.

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

Client Python

Vous aurez besoin du client Python pour Cloud Natural Language. Pour l'installer, saisissez la commande suivante dans Cloud Shell :

sudo pip install --upgrade google-cloud-language

Essayons

Enfin, examinons les exemples de code de l'API Cloud Natural Language. Nous souhaitons détecter les entités dans le texte. snippets.py semble contenir du code qui fait cela. Copiez le contenu de snippets.py, créez un fichier dans Cloud Shell appelé natural_language.py et collez-y tout le code.natural_language.py Vous pouvez le faire manuellement dans l'éditeur de code Cloud Shell ou exécuter cette commande curl dans Cloud Shell :

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

Une fois cette opération effectuée, utilisez l'API en exécutant la commande suivante dans Cloud Shell :

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

L'API doit identifier "vélo" comme une entité. Les entités peuvent être des noms propres (personnalités publiques, points de repère, etc.) ou des noms communs (restaurant, stade, etc.).

Que se passe-t-il ?

Vous avez transmis deux arguments à natural_language.py :

  • entities-text sélectionne la fonction entities_text() à exécuter.
  • où as-tu laissé mon vélo est la chaîne à analyser pour les entités et est transmise en tant que text dans entities_text()

Examinons de plus près entities_text(). Notez les nouveaux commentaires qui ont été insérés.

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. Intégrons-les

Rappelons ce que vous allez créer.

e6a57e5def315116.jpeg

Maintenant, assemblons le tout. Créez un fichier solution.py, puis copiez et collez detect_labels_uri(), transcribe_gcs(), translate_text() et entities_text() des étapes précédentes dans solution.py.

Instructions d'importation

Décommentez et déplacez les instructions d'importation vers le haut. Notez que speech.types et language.types sont importés. Cela va créer un conflit. Nous allons donc les supprimer et remplacer chaque occurrence de types dans transcribe_gcs() et entities_text() par speech.types et language.types, respectivement. Vous devriez obtenir le résultat suivant :

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

Résultats de retour

Au lieu d'imprimer, faites en sorte que les fonctions renvoient les résultats. Vous devriez obtenir un résultat semblable à celui-ci :

# 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

Utiliser les fonctions

Après tout ce travail, vous pouvez appeler ces fonctions. Allez-y, faites-le ! Exemple :

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

Prise en charge de plusieurs langues

Auparavant, nous avions codé en dur le turc dans transcribe_gcs(). Modifions cela pour que la langue puisse être spécifiée à partir de compare_audio_to_image(). Voici les modifications requises :

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)

Essayer

Le code final se trouve dans solution.py de ce dépôt GitHub. Voici une commande curl pour récupérer ces informations :

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

La version sur GitHub contient argparse, qui permet les opérations suivantes à partir de la ligne de commande :

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

Pour chaque élément trouvé, le code doit générer "L'audio et l'image contiennent tous les deux : ". Dans l'exemple ci-dessus, il s'agirait de "L'audio et l'image contiennent tous les deux : ballon".

Bonus : essayez d'autres fonctionnalités

Voici d'autres emplacements de fichiers audio et d'image à essayer.

Exemples de discours en turc : 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

Exemples de discours en allemand : 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

Exemples d'images : 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. Félicitations !

Vous avez exploré et intégré quatre API de machine learning pour déterminer si un échantillon vocal parle de l'image fournie. Ce n'est que le début, car il existe de nombreuses autres façons d'améliorer ce pipeline.

Points abordés

  • Envoyer des requêtes à l'API Cloud Vision
  • Envoyer des requêtes à l'API Cloud Speech-to-Text
  • Envoyer des requêtes à l'API Cloud Translation
  • Envoyer des requêtes à l'API Cloud Natural Language
  • Utiliser toutes les API ci-dessus ensemble

Étapes suivantes