Integrazione delle API per il machine learning

1. Panoramica

Questo codelab ti offrirà un rapido tour di alcune API di 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 creerai

Costruirai una pipeline che confronta una registrazione audio con un'immagine e ne determina la pertinenza reciproca. Ecco un'anteprima di come fare:

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

  • Un browser, ad esempio Chrome o Firefox
  • Conoscenza di base di Python

2. Configurazione e requisiti

Configurazione dell'ambiente autonoma

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già un account Gmail o Google Workspace, devi crearne uno.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Ricorda l'ID progetto, un nome univoco per tutti i progetti Google Cloud (il nome riportato sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID.

  1. Successivamente, dovrai abilitare la fatturazione in Cloud Console per 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 ti consiglia come arrestare le risorse in modo da non incorrere in addebiti oltre questo tutorial. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Abilita le API

Puoi fare clic su questo link per abilitare tutte le API necessarie. Dopo averlo fatto, puoi ignorare le istruzioni per la configurazione dell'autenticazione, che eseguiremo tra poco. In alternativa, puoi abilitare ogni API singolarmente. Per farlo, fai clic sull'icona del menu 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 "visione" nella casella di ricerca. Fai clic su API Google Cloud Vision:

a47893f36372ae2f.png

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

a24fd082a22030ad.png

Attendi qualche secondo affinché venga attivato. Una volta attivata, vedrai questo:

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 mette a tua disposizione una home directory permanente di 5 GB. Utilizzeremo Cloud Shell per creare la nostra richiesta alle API di machine learning.

Per iniziare a utilizzare Cloud Shell, fai clic sull'icona "Attiva Google Cloud Shell" Screen Shot 2015-06-08 at 5.30.32 PM.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 che venga visualizzato il prompt user@project:~$

(Facoltativo) Editor di codice

A seconda della tua familiarità con la riga di comando, potresti voler 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 l'autenticazione, devi avere un service account. Per crearne uno, sostituisci [NAME] con il nome desiderato del service account ed esegui il seguente comando in Cloud Shell:

gcloud iam service-accounts create [NAME]

Ora devi generare una chiave per utilizzare l'account di servizio. Sostituisci [FILE_NAME] con il nome che vuoi assegnare alla chiave, [NAME] con il nome del service account riportato sopra e [PROJECT_ID] con l'ID del tuo progetto. Il seguente comando 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 il service account, devi impostare la variabile GOOGLE_APPLICATION_CREDENTIALS sul percorso della chiave. Per farlo, esegui questo comando 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 installare, 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. Ci interessa scoprire cosa contiene un'immagine specifica. detect.py sembra essere utile per questo, quindi prendiamolo. Un modo è copiare i contenuti di detect.py, creare un nuovo file in Cloud Shell chiamato vision.py e incollare tutto il codice in vision.py. Puoi farlo manualmente nell'editor di Cloud Shell o 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

Una volta fatto, utilizza l'API eseguendo il comando seguente in Cloud Shell:

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

Dovresti visualizzare un output relativo a uccelli e struzzi, poiché questa era l'immagine analizzata: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Che cosa succede?

Hai passato due argomenti a vision.py:

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

Diamo un'occhiata più da vicino a detect_labels_uri(). Prendi nota dei commenti aggiuntivi 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 installare, digita quanto segue in Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Proviamo

Passiamo agli esempi di codice per Cloud Speech-to-Text. Siamo interessati alla trascrizione dell'audio del parlato. transcribe.py sembra un buon punto di partenza, quindi usiamolo. Copia i contenuti di transcribe.py, crea un nuovo file in Cloud Shell chiamato speech2text.py e incolla tutto il codice in speech2text.py. Puoi farlo manualmente nell'editor di Cloud Shell o 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

Una volta fatto, utilizza l'API eseguendo il comando seguente in Cloud Shell:

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

Dovrebbero essere presenti errori che segnalano la codifica e la frequenza di campionamento errate. Non preoccuparti, vai su transcribe_gcs()nel codice ed elimina le impostazioni encoding e sampe_hertz_rate da RecognitionConfig(). Già che ci sei, modifica 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 in turco, poiché questo era l'audio analizzato: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Che cosa sta succedendo?

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

Diamo un'occhiata più da vicino al nostro transcribe_uri() modificato.

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 il testo in inglese. snippets.py sembra quello che vogliamo. Copia i contenuti di snippets.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 Cloud Shell o 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

Una volta fatto, utilizza l'API eseguendo il comando seguente in Cloud Shell:

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

La traduzione dovrebbe essere "Hai una giacca?".

Che cosa sta succedendo?

Hai passato tre argomenti a translate.py:

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

Diamo un'occhiata più da vicino a translate_text(). Prendi nota dei commenti 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 installare, digita quanto segue in Cloud Shell:

sudo pip install --upgrade google-cloud-language

Proviamo

Infine, esaminiamo gli esempi di codice per l'API Cloud Natural Language. Vogliamo rilevare le entità nel testo. snippets.py sembra contenere codice che lo fa. Copia i contenuti di snippets.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 Cloud Shell o 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

Una volta fatto, utilizza l'API eseguendo il comando seguente in Cloud Shell:

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

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

Che cosa sta succedendo?

Hai passato due argomenti a natural_language.py:

  • entities-text seleziona la funzione entities_text() da eseguire
  • "where did you leave my bike" è la stringa da analizzare per le entità e viene passata come text in entities_text()

Diamo un'occhiata più da vicino a entities_text(). Prendi nota dei nuovi commenti 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. Integriamoli

Ricordiamo cosa stai creando.

e6a57e5def315116.jpeg

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

Importare gli estratti conto

Rimuovi il commento e sposta le istruzioni di importazione in alto. Tieni presente che vengono importati sia speech.types che language.types. Ciò causerà un conflitto, quindi rimuoviamoli e modifichiamo ogni singola occorrenza di types in transcribe_gcs() e entities_text() in speech.types e language.types rispettivamente. Dovresti avere:

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

Risultati restituiti

Anziché stampare, fai in modo che le funzioni restituiscano i risultati. Dovresti visualizzare un risultato 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, fallo! 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.')

Supportare più lingue

In precedenza abbiamo codificato in modo permanente il turco in transcribe_gcs(). Modifichiamo questa impostazione in modo che la lingua sia specificabile da compare_audio_to_image(). Ecco 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 recuperare queste informazioni:

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 elemento trovato, il codice dovrebbe restituire "The audio and image both contain: ". Nell'esempio precedente, sarebbe "The audio and image both contain: ball".

Bonus: prova altre funzionalità

Ecco altre posizioni di file audio e immagine da provare.

Esempi di sintesi vocale in turco: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

Esempi di sintesi vocale in tedesco: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

Esempi di immagini: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. Complimenti!

Hai esplorato e integrato quattro API di machine learning per determinare se un campione vocale parla dell'immagine fornita. Questo è solo l'inizio, perché ci sono molti altri modi per migliorare questa pipeline.

Argomenti trattati

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

Passaggi successivi