Integrazione delle API per il machine learning

Integrazione delle API per il machine learning

Informazioni su questo codelab

subjectUltimo aggiornamento: giu 30, 2021
account_circleScritto da: Torry Yang

1. Panoramica

Questo codelab ti offre un breve tour di alcune API per il machine learning. Utilizzerai:

  • Cloud Vision per comprendere i contenuti di un'immagine.
  • Cloud Speech-to-Text per trascrivere l'audio in testo
  • Cloud Translation per tradurre una stringa arbitraria in qualsiasi lingua supportata
  • Cloud Natural Language per estrarre informazioni dal testo

Cosa imparerai a realizzare

Costruirai una pipeline che confronta una registrazione audio con un'immagine e ne determinerà la pertinenza l'una con l'altra. Ecco un'anteprima del modo in cui raggiungerai questo obiettivo:

e6a57e5def315116.jpeg

Obiettivi didattici

  • Come utilizzare le API Vision, Speech-to-Text, Translation e Natural Language
  • Dove trovare esempi di codice

Che cosa ti serve

2. Configurazione e requisiti

Configurazione automatica dell'ambiente

  1. Accedi a Cloud Console e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome sopra riportato è già stato utilizzato e non funzionerà per te). Vi verrà fatto riferimento più avanti in questo codelab come PROJECT_ID.

  1. Il prossimo passaggio consiste nell'attivare la fatturazione in Cloud Console per poter utilizzare le risorse Google Cloud.

L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Assicurati di seguire le istruzioni nella sezione "Pulizia", che spiega come arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial. I nuovi utenti di Google Cloud sono idonei al programma $300 USD Free Trial.

Abilita le API

Puoi fare clic su questo link per abilitare tutte le API necessarie. Dopo aver eseguito questa operazione, ti invitiamo a ignorare le istruzioni per la configurazione dell'autenticazione; eseguiremo questa operazione tra poco. In alternativa, puoi abilitare ogni API singolarmente. Per farlo, fai clic sull'icona del menu nell'angolo in alto a sinistra dello schermo.

2bfc27ef9ba2ec7d.png

Seleziona API e servizi dal menu a discesa e fai clic su Dashboard.

a9546a22581facd5.png

Fai clic su Abilita API e servizi.

eae7ff043d13a35.png

Cerca quindi "visione". nella casella di ricerca. Fai clic sull'API Google Cloud Vision:

a47893f36372ae2f.png

Fai clic su Abilita per abilitare l'API Cloud Vision:

a24fd082a22030ad.png

Attendi qualche secondo affinché venga attivata. Quando verrà attivato verrà visualizzato il messaggio:

633e58cbde1b74c6.png

Ripeti la stessa procedura per attivare le API Cloud Speech, Cloud Translation e Cloud Natural Language.

Cloud Shell

Google Cloud Shell è un ambiente a riga di comando in esecuzione nel cloud. Questa macchina virtuale basata su Debian viene caricata con tutti gli strumenti di sviluppo di cui avrai bisogno (gcloud, bq, git e altri) e offre una home directory permanente da 5 GB. Useremo Cloud Shell per creare la nostra richiesta alle API per il machine learning.

Per iniziare a utilizzare Cloud Shell, fai clic sull'icona"Attiva Google Cloud Shell"Screen Shot 2015-06-08 alle 17.30.32.png nell'angolo in alto a destra della barra dell'intestazione

24ef50000ca737a4.png

All'interno di un nuovo frame nella parte inferiore della console si apre una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. Attendi finché non viene visualizzato il prompt utente@progetto:~$.

Facoltativo: editor di codice

In base alla tua comodità con la riga di comando, puoi fare clic sull'icona "Avvia editor di codice" b885bf07bc1b02e5.png nell'angolo in alto a destra della barra di Cloud Shell

de00be9278baf7b8.png

Account di servizio

Per eseguire l'autenticazione dovrai avere un account di servizio. Per crearne uno, sostituisci [NAME] con il nome desiderato dell'account di servizio ed esegui il comando seguente in Cloud Shell:

gcloud iam service-accounts create [NAME]

Ora dovrai generare una chiave per utilizzare questo account di servizio. Sostituisci [FILE_NAME] con il nome desiderato della chiave, [NAME] con il nome dell'account di servizio riportato sopra e [PROJECT_ID] con l'ID del progetto. Il comando seguente creerà e scaricherà la chiave come [FILE_NAME].json:

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

Per utilizzare l'account di servizio, devi impostare la variabile GOOGLE_APPLICATION_CREDENTIALS sul percorso della chiave. Per farlo, esegui il comando seguente dopo aver sostituito [PATH_TO_FILE] e [FILE_NAME]:

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

3. Cloud Vision

Client Python

Avrai bisogno del client Python per Cloud Vision. Per eseguire l'installazione, digita quanto segue in Cloud Shell:

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

Proviamo

Diamo un'occhiata agli esempi di codice per l'API Cloud Vision. Siamo interessati a scoprire cosa c'è in un'immagine specificata. detect.py sembra essere utile a questo scopo. Un modo è copiare i contenuti di Detect.py, creare un nuovo file in Cloud Shell denominato vision.py e incollare tutto il codice in vision.py. Puoi farlo manualmente nell'editor di codice Cloud Shell oppure puoi eseguire questo comando curl in Cloud Shell:

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

Dopo aver eseguito questa operazione, utilizza l'API eseguendo questo comando in Cloud Shell:

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

Dovresti vedere un output su uccelli e struzzi, come l'immagine analizzata: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Qual è il problema?

Hai trasmesso 2 argomenti a vision.py:

  • labels-uri seleziona la funzione detect_labels_uri() da eseguire
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg è il percorso di un'immagine in Google Cloud Storage e viene trasmesso come uri a detect_labels_uri()

Diamo un'occhiata più da vicino a detect_labels_uri(). Prendi nota dei commenti aggiuntivi che sono stati inseriti.

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

Avrai bisogno del client Python per Cloud Speech-to-Text. Per eseguire l'installazione, digita quanto segue in Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Proviamo

Diamo un'occhiata agli esempi di codice per Cloud Speech-to-Text. Ci interessa trascrivere l'audio vocale. transcribe.py è un ottimo punto di partenza, quindi usalo. Copia i contenuti di transcribe.py, crea un nuovo file in Cloud Shell denominato speech2text.py e incolla tutto il codice in speech2text.py. Puoi farlo manualmente nell'editor di codice Cloud Shell oppure puoi eseguire questo comando curl in Cloud Shell:

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

Dopo aver eseguito questa operazione, utilizza l'API eseguendo questo comando in Cloud Shell:

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

Devono essere presenti errori relativi al codice di codifica errato e alla frequenza di campionamento di esempio. Non preoccuparti, vai su transcribe_gcs() nel codice ed elimina le impostazioni di encoding e sampe_hertz_rate da RecognitionConfig(). Mentre ci sei, cambia il codice della lingua in "tr-TR' poiché tr-ostrich.wav è una registrazione vocale in turco.

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

Ora esegui di nuovo speech2text.py. L'output dovrebbe essere un testo turco, ovvero l'audio analizzato: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Cosa sta succedendo?

Hai trasmesso gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, il percorso di un file audio su Google Cloud Storage, a speech2text.py, che è poi passato come gcs_uri in transcribe_uri()

Diamo un'occhiata più da vicino alle nostre transcribe_uri() modificate.

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

Avrai bisogno del client Python per Cloud Translation. Per installare, digita quanto segue in Cloud Shell:

sudo pip install --upgrade google-cloud-translate

Proviamo

Ora diamo un'occhiata agli esempi di codice per Cloud Translation. Ai fini di questo codelab, vogliamo tradurre in inglese. snippets.py è simile a quello che vogliamo. Copia i contenuti di snippet.py, crea un nuovo file in Cloud Shell denominato translate.py e incolla tutto il codice in translate.py. Puoi farlo manualmente nell'editor di codice Cloud Shell oppure puoi eseguire questo comando curl in Cloud Shell:

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

Dopo aver eseguito questa operazione, utilizza l'API eseguendo questo comando in Cloud Shell:

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

Deve essere la traduzione "Hai una giacca?"

Cosa sta succedendo?

Hai trasmesso 3 argomenti a translate.py:

  • translate-text seleziona la funzione translate_text() da eseguire
  • en viene passato come target in translate_text() e viene utilizzato per specificare la lingua in cui tradurre
  • '你有沒有帶外套' è la stringa da tradurre e viene trasmessa come testo a translate_text()

Diamo un'occhiata più da vicino a translate_text(). Prendi nota dei commenti che sono stati aggiunti.

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

Avrai bisogno del client Python per Cloud Natural Language. Per eseguire l'installazione, digita quanto segue in Cloud Shell:

sudo pip install --upgrade google-cloud-language

Proviamo

Infine, diamo un'occhiata agli esempi di codice per l'API Cloud Natural Language. Vogliamo rilevare le entità nel testo. snippets.py sembra contenere codice che permette di farlo. Copia i contenuti di snippet.py, crea un nuovo file in Cloud Shell denominato natural_language.py e incolla tutto il codice in natural_language.py. Puoi farlo manualmente nell'editor di codice Cloud Shell oppure puoi eseguire questo comando curl in Cloud Shell:

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

Dopo aver eseguito questa operazione, utilizza l'API eseguendo questo comando in Cloud Shell:

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

L'API dovrebbe identificare "bike" come entità. Le entità possono essere nomi propri (personaggi pubblici, punti di riferimento ecc.) o nomi comuni (ristorante, stadio e così via).

Cosa sta succedendo?

Hai trasmesso 2 argomenti a natural_language.py:

  • entities-text seleziona la funzione entities_text() da eseguire
  • dove hai lasciato la mia bicicletta è la stringa da analizzare per le entità e viene trasmessa come testo in entities_text()

Diamo un'occhiata più da vicino a entities_text(). Prendi nota dei nuovi commenti che sono stati inseriti.

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. Inizia a integrarli

Ricordiamoci cosa stai costruendo.

e6a57e5def315116.jpeg

Ora creiamo il tutto. Crea un file solution.py; copia e incolla detect_labels_uri(), transcribe_gcs(), translate_text() e entities_text() dai passaggi precedenti in solution.py.

Importa estratti conto

Rimuovi il commento e sposta le istruzioni di importazione in alto. Tieni presente che stai importando sia speech.types che language.types. Poiché ciò causerà un conflitto, rimuoviamo questi ultimi e modifichi ciascuna occorrenza di types in transcribe_gcs() e entities_text() in speech.types e language.types rispettivamente. Dovrebbe rimanere con:

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

Restituisci i risultati

Invece della stampa, chiedi alle funzioni di restituire i risultati. Il risultato dovrebbe essere simile a questo:

# 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

Utilizzare le funzioni

Dopo tutto questo duro lavoro, puoi chiamare queste funzioni. Vai avanti! Ecco un esempio:

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

Supporto di più lingue

In precedenza abbiamo hardcoded in turco in transcribe_gcs(). Cambiamo questa impostazione in modo che la lingua sia specificabile da compare_audio_to_image(). Di seguito sono riportate le modifiche necessarie:

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)

Prova

Il codice finale è disponibile in solution.py di questo repository GitHub. Ecco un comando curl per recuperarlo:

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

La versione su GitHub contiene argparse, che consente quanto segue dalla riga di 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

Per ogni articolo trovato, il codice dovrebbe restituire "quot;L'audio e l'immagine contengono entrambi: &quot. Nell'esempio precedente, questo sarebbe "L'audio e l'immagine contengono entrambi: ball".

Bonus: prova di più

Di seguito sono riportate ulteriori posizioni per i file audio e immagine da provare.

8. Complimenti!

Hai esplorato e integrato quattro API per il machine learning per determinare se un campione vocale sta parlando dell'immagine fornita. Questo è solo l'inizio perché esistono molti altri modi per migliorare questa pipeline.

Cosa abbiamo trattato

  • Esecuzione di richieste all'API Cloud Vision
  • Esecuzione di richieste all'API Cloud Speech-to-Text
  • Esecuzione di richieste all'API Cloud Translation
  • Esecuzione di richieste all'API Cloud Natural Language
  • Utilizzo combinato di tutte le API precedenti

Passaggi successivi