À propos de cet atelier de programmation
1. Présentation
Cet atelier de programmation vous explique rapidement comment utiliser certaines 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 vous permet de traduire une chaîne arbitraire dans n'importe quelle langue compatible.
- Cloud Natural Language pour extraire des informations du texte
Objectifs de l'atelier
Vous allez créer un pipeline qui compare un enregistrement audio à une image et détermine leur pertinence. Voici un aperçu de la procédure à suivre pour y parvenir:
Points abordés
- Utiliser les API Vision, Speech-to-Text, Translation et Natural Language
- Où trouver des exemples de code
Ce dont vous avez besoin
2. Prérequis
Configuration de l'environnement au rythme de chacun
- Connectez-vous à Cloud Console, 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.)
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.
- 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 offerte. 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 bénéficier d'un essai offert de 300 USD.
Activer les API
Cliquez sur ce lien pour activer toutes les API nécessaires. Une fois cette opération effectuée, vous pouvez ignorer les instructions concernant la configuration de l'authentification. Nous nous chargerons de le faire dans quelques instants. Vous avez également la possibilité d'activer chaque API individuellement. Pour cela, cliquez sur l'icône de menu en haut à gauche de l'écran.
Sélectionnez API et services dans la liste déroulante, puis cliquez sur "Tableau de bord".
Cliquez sur Enable APIs and services (Activer les API et les services).
Recherchez ensuite "visionnage" dans le champ de recherche. Cliquez sur Google Cloud Vision API (API Google Cloud Vision) :
Cliquez sur Activer pour activer l'API Cloud Vision:
Patientez quelques secondes. Vous verrez ce message s'afficher une fois l'option activée:
Effectuez 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 fonctionnant 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.). Elle offre un répertoire de base persistant de 5 Go. Nous utiliserons Cloud Shell pour créer notre requête auprès des API de machine learning.
Pour commencer à utiliser Cloud Shell, cliquez sur l'icône "Activer Google Cloud Shell" en haut à droite de la barre d'en-tête.
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
En fonction de votre maîtrise de la ligne de commande, vous pouvez cliquer sur l'icône &Launch Éditeur de code en haut à droite de la barre Cloud Shell.
Compte de service
Vous devez disposer d'un compte de service pour vous authentifier. Pour en créer un, remplacez [NOM] 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 à présent générer une clé pour utiliser ce compte de service. Remplacez [NOM_FICHIER] par le nom de clé souhaité, [NOM] par le nom du compte de service ci-dessus et [ID_PROJET] par l'ID de votre projet. La commande suivante crée et télécharge la clé sous la forme [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 pour qu'elle corresponde au 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 en aurez besoin pour Cloud Vision. Pour l'installer, saisissez la commande suivante dans Cloud Shell:
pip install --upgrade google-cloud-vision --user
C'est parti
Examinons les exemples de code pour l'API Cloud Vision. Nous souhaitons savoir ce qui se trouve dans une image spécifiée. detect.py
semble utile pour y parvenir. Vous pouvez copier le contenu de Detect.py, créer un fichier nommé vision.py
dans Cloud Shell et coller tout le code dans 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
Ensuite, 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 obtenir un résultat relatif aux oiseaux et aux autruches, comme dans 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 est l'emplacement d'une image dans Google Cloud Storage. Il 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 en aurez besoin pour Cloud Speech-to-Text. Pour l'installer, saisissez la commande suivante dans Cloud Shell:
sudo pip install --upgrade google-cloud-speech
C'est parti
Passons aux exemples de code pour Cloud Speech-to-Text. Nous souhaitons transcrire des données audio vocales. transcribe.py
semble être un bon point de départ pour votre chaîne. Voyons cela de plus près. Copiez le contenu de transcript.py, créez un fichier dans Cloud Shell appelé speech2text.py
et collez tout le code dans 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
Ensuite, 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 liées à l'encodage et au taux d'échantillons hertz peuvent s'afficher. 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, modifiez le code de langue sur"tr-TR'", car tr-ostrich.wav
est un enregistrement vocal en turc.
config = types.RecognitionConfig(language_code='tr-TR')
Maintenant, exécutez à nouveau speech2text.py
. Le résultat doit contenir du texte turc comme dans l'analyse audio : https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav
Que se passe-t-il ?
Vous avez transmis l'adresse gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav à speech2text.py
, l'emplacement d'un fichier audio de Google Cloud Storage qui est ensuite transmis à gcs_uri.
Examinons de plus près nos transcribe_uri()
modifiées.
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 en aurez besoin pour Cloud Translation. Pour l'installer, saisissez la commande suivante dans Cloud Shell:
sudo pip install --upgrade google-cloud-translate
C'est parti
Passons maintenant aux exemples de code pour Cloud Translation. Dans cet atelier de programmation, nous voulons traduire le texte en anglais. snippets.py
semble être ce que nous voulons. Copiez le contenu des extraits.py, créez un fichier nommé Cloud Shell dans translate.py
et collez tout le code dans 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
Ensuite, utilisez l'API en exécutant la commande suivante dans Cloud Shell:
python translate.py translate-text en '你有沒有帶外套'
La traduction doit être "guère-t-elle ?".
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 cible dans
translate_text()
et sert à spécifier la langue dans laquelle la traduction doit être effectuée. - '你有沒有帶外套' est la chaîne à traduire. Elle est transmise sous forme de texte en
translate_text()
.
Examinons de plus près translate_text()
. Notez les commentaires 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 en aurez besoin pour Cloud Natural Language. Pour l'installer, saisissez la commande suivante dans Cloud Shell:
sudo pip install --upgrade google-cloud-language
C'est parti
Enfin, examinons les exemples de code pour l'API Cloud Natural Language. Nous souhaitons détecter des entités dans le texte. snippets.py
semble contenir du code qui effectue cette opération. Copiez le contenu des extraits.py, créez un fichier nommé Cloud Shell dans natural_language.py
et collez tout le code dans 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
Ensuite, 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" en tant qu'entité. Les entités peuvent être des noms propres (personnages publics, points de repère, etc.) ou des noms courants (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. - 'where youisse mon vélo' est la chaîne à analyser pour les entités et est transmise en tant que texte dans
entities_text()
Examinons de plus près entities_text()
. Notez les nouveaux commentaires 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égrer ces appareils
Souvenez-vous de ce que vous créez.
Maintenant, assemblez-les. 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
.
Importer des instructions
Supprimez les commentaires et déplacez les instructions d'importation en haut. speech.types
et language.types
sont en cours d'importation. Cette opération entraîne des conflits. Nous allons donc les supprimer, puis remplacer chaque occurrence de types
par transcribe_gcs()
et entities_text()
par speech.types
et language.types
, respectivement. Vous devriez voir les éléments suivants:
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 renvoyés
Au lieu d'imprimer, les fonctions renvoient les résultats. Le résultat doit ressembler à ceci:
# 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 acharné, vous pouvez appeler ces fonctions. Allez-y ! 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.')
Langues multiples
Nous avons codé en turc jusqu'à transcribe_gcs()
. Modifiez cette fonction pour que la langue puisse être spécifiée dans 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 dans ce dépôt GitHub. Voici une commande curl pour l'obtenir:
curl https://raw.githubusercontent.com/googlecodelabs/integrating-ml-apis/master/solution.py -O
La version de GitHub contient un élément argparse, qui permet d'effectuer 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 détecté, le code doit renvoyer le code "audio" et l'image (contenant """). Dans l'exemple ci-dessus, il s'agit du champ "audio" et "image" contenant tous les deux.
Bonus: essayez plus
Voici d'autres emplacements pour les fichiers audio et les fichiers image.
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
Étapes suivantes
- Pour mieux comparer les mots, utilisez word2vec.
- Découvrez les ateliers de programmation plus approfondis concernant les API Vision, Speech-to-Text, Translation et Natural Language.
- Essayez de remplacer Cloud Vision par Cloud Video Intelligence.
- Synthétisez des contenus audio vocaux à l'aide de l'API Cloud Text-to-Speech.
- Découvrez comment importer des objets dans Cloud Storage.