Informazioni su questo codelab
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:
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
- 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.
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
.
- 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.
Seleziona API e servizi dal menu a discesa e fai clic su Dashboard.
Fai clic su Abilita API e servizi.
Cerca quindi "visione". nella casella di ricerca. Fai clic sull'API Google Cloud Vision:
Fai clic su Abilita per abilitare l'API Cloud Vision:
Attendi qualche secondo affinché venga attivata. Quando verrà attivato verrà visualizzato il messaggio:
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" nell'angolo in alto a destra della barra dell'intestazione
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" nell'angolo in alto a destra della barra di Cloud Shell
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.
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: ". 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
- Per confrontare meglio le parole, dai un'occhiata a word2vec
- Dai un'occhiata ai codelab più approfonditi su API Vision, API Speech-to-Text, API Translation e API Natural Language
- Prova a sostituire Cloud Vision con Cloud Video Intelligence
- Sintetizzazione audio vocale con Cloud Text-to-Speech API
- Scopri come caricare oggetti su Cloud Storage