שילוב של ממשקי API ללמידה חישובית

שילוב של ממשקי API ללמידה חישובית

מידע על Codelab זה

subjectהעדכון האחרון: יוני 30, 2021
account_circleנכתב על ידי Torry Yang

1.‏ סקירה כללית

זהו שיעור Lab שיספק לכם סיור מהיר עם כמה ממשקי API ללמידה חישובית. תשתמשו ב:

  • Cloud Vision כדי להבין את תוכן התמונה
  • Cloud Speech to-text כדי לתמלל אודיו לטקסט
  • תרגום בענן כדי לתרגם מחרוזת שרירותית לכל שפה נתמכת
  • שפה טבעית בענן כדי לחלץ מידע מהטקסט

מה תיצור

עליכם ליצור צינור עיבוד נתונים שמשווה בין הקלטת אודיו לבין תמונה, והוא קובע את הרלוונטיות שלהם זה לזה. אפשר לקבל הצצה מהירה על הדרכים שבהן אפשר לעשות זאת:

e6a57e5def315116.jpeg

מה תלמדו

  • איך משתמשים ב-Vision, המרת דיבור לטקסט (STT), תרגום ושפת שפה טבעית (NLP)
  • איפה אפשר למצוא דוגמאות לקוד?

מה תצטרך להכין

  • דפדפן, למשל Chrome או Firefox
  • ידע בסיסי ב-Python

2.‏ הגדרה ודרישות

הגדרת סביבה בקצב עצמי

  1. נכנסים ל-Cloud Console ויוצרים פרויקט חדש או משתמשים שוב בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

חשוב לזכור את מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם הקודם כבר תפוס, והוא לא יעבוד בשבילך.) נתייחס אליו מאוחר יותר ב-codelab הזה בתור PROJECT_ID.

  1. לאחר מכן, עליך להפעיל חיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

להריץ את קוד שיעור זה לא אמור לעלות הרבה, אם בכלל. הקפידו לפעול לפי ההוראות המפורטות בקטע "ניקוי משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית הניסיון של $300 בחינם.

הפעלת ממשקי API

אתם יכולים ללחוץ על הקישור הזה כדי להפעיל את כל ממשקי ה-API הנחוצים. לאחר מכן, אתם מוזמנים להתעלם מההוראות להגדרת האימות; אנחנו נעשה זאת ברגע. לחלופין, אפשר להפעיל כל API בנפרד. כדי לעשות את זה, לוחצים על סמל התפריט בפינה הימנית העליונה של המסך.

2bfc27ef9ba2ec7d.png

בוחרים באפשרות APIs & Services מתוך התפריט הנפתח ולוחצים על 'מרכז השליטה'.

a9546a22581facd5.png

לוחצים על הפעלת ממשקי API ושירותים.

eae7ff043d13a35.png

לאחר מכן, מחפשים את הביטוי "vision" בתיבת החיפוש. לוחצים על Google Cloud Vision API:

a47893f36372ae2f.png

לוחצים על הפעלה כדי להפעיל את Cloud Vision API:

a24fd082a22030ad.png

ממתינים מספר שניות עד שהיא תופעל. יוצג לך ברגע שהיא תופעל:

633e58cbde1b74c6.png

חוזרים על אותו התהליך כדי להפעיל את ממשקי ה-API של Cloud Speech, תרגום של Cloud ו-Cloud טבעי.

Cloud Shell

התכונה Google Cloud Shell היא סביבת שורת פקודה שפועלת ב-Cloud. המכונה הווירטואלית המבוססת על Debian נטענת עם כל כלי הפיתוח הדרושים לך (gcloud, bq, git ואחרים) וספריית בית קבועה בנפח של 5GB. אנחנו נשתמש ב-Cloud Shell כדי ליצור את הבקשה שלנו לממשקי ה-API של הלמידה החישובית.

כדי להתחיל להשתמש ב-Cloud Shell, לוחצים על הסמל "הפעלת Google Cloud Shell" צילום מסך 2015-06-08 ב-17.30.32 בפינה השמאלית העליונה של סרגל הכותרת

24ef50000ca737a4.png

סשן של Cloud Shell ייפתח בתוך מסגרת חדשה בחלק התחתון של המסוף, ויציג הודעה בשורת הפקודה. ממתינים עד שתופיע ההודעה user@project:~$.

אופציונלי: עורך קוד

בהתאם לנוחות שלכם בשורת הפקודה, מומלץ ללחוץ על הסמל "הפעלת קוד קוד" b885bf07bc1b02e5.png בפינה השמאלית העליונה של סרגל Cloud Shell

de00be9278baf7b8.png

חשבון שירות

נדרש חשבון שירות כדי לבצע אימות. כדי ליצור חשבון, מחליפים את [NAME] בשם הרצוי של חשבון השירות ומפעילים את הפקודה הבאה ב-Cloud Shell:

gcloud iam service-accounts create [NAME]

עכשיו יהיה עליך ליצור מפתח כדי להשתמש בחשבון השירות הזה. מחליפים את [FILE_NAME] בשם המפתח הרצוי, [NAME] בשם חשבון השירות שלמעלה, וב-[PROJECT_ID] במזהה הפרויקט. הפקודה הבאה תיצור ותוריד את המפתח בתור [FILE_NAME].json:

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

כדי להשתמש בחשבון השירות, עליך להגדיר את המשתנה GOOGLE_APPLY_CREDENTIALS בנתיב של המפתח. כדי לעשות זאת, מריצים את הפקודה הבאה אחרי החלפת [PATH_TO_FILE] ו-[FILE_NAME]:

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

3.‏ Cloud Vision

לקוח Python

צריך את הלקוח של Python ל-Cloud Vision. כדי להתקין, הקלידו את הפרטים הבאים ב-Cloud Shell:

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

זה הזמן לנסות

מומלץ לקרוא את דוגמאות הקוד של Cloud Vision API. אנחנו מעוניינים לברר מה מופיע בתמונה שצוינה. נראה ש-detect.py שימושי לשם כך. אחת הדרכים היא להעתיק את תוכן ה-detect.py, ליצור קובץ חדש ב-Cloud Shell בשם vision.py ולהדביק את כל הקוד ב-vision.py. אפשר לעשות זאת באופן ידני בעורך הקוד של Cloud Shell, או להריץ את פקודת ה-curl הזו ב-Cloud Shell:

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

לאחר מכן, השתמשו ב-API באמצעות הפעלת הפריטים הבאים ב-Cloud Shell:

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

אמורה להופיע פלט על ציפורים ויענים כמו זו שבניתוח התמונה: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

מה קורה?

העברת 2 ארגומנטים אל vision.py:

  • הפרמטר labels-uri בוחר את הפונקציה detect_labels_uri() שירוץ
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg הוא המיקום של תמונה ב-Google Cloud Storage ועובר כ-uri אל detect_labels_uri()

בואו נבחן מקרוב את detect_labels_uri(). שימו לב לתגובות הנוספות שנוספו.

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

לקוח Python

צריך את הלקוח של Python ל-Cloud Speech-to-Text. כדי להתקין, הקלידו את הפרטים הבאים ב-Cloud Shell:

sudo pip install --upgrade google-cloud-speech

זה הזמן לנסות

אנחנו מזמינים אתכם לעבור לדוגמאות הקוד של המרת טקסט לדיבור (TTS). אנחנו רוצים לתמלל אודיו של דיבור. נראה ש-transcribe.py הוא מקום טוב להתחיל בו, לכן כדאי להשתמש בזה. מעתיקים את התוכן של transcribe.py, יוצרים קובץ חדש ב-Cloud Shell שנקרא speech2text.py ומדביקים את כל הקוד ב-speech2text.py. אפשר לעשות זאת באופן ידני בעורך הקוד של Cloud Shell, או להריץ את פקודת ה-curl הזו ב-Cloud Shell:

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

לאחר מכן, השתמשו ב-API באמצעות הפעלת הפריטים הבאים ב-Cloud Shell:

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

אמורים להופיע תלונות על קידוד שגוי ושיעור הרץ לדוגמה. אל דאגה, יש להיכנס אל transcribe_gcs() בקוד ולמחוק את ההגדרות של encoding ו-sampe_hertz_rate מ-RecognitionConfig(). בזמן שאתם מחפשים אותה, יש לשנות את קוד השפה ל-tr-TR&339. בתור tr-ostrich.wav, יש הקלטת דיבור בטורקית.

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

עכשיו יש להריץ שוב את speech2text.py. הפלט צריך להיות טקסט טורקי, כפי שהיה בניתוח של האודיו: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

מה קורה?

עברת אל gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, המיקום של קובץ האודיו ב-Google Cloud Storage אל speech2text.py, לאחר מכן יועבר כ-gcs_uri אל transcribe_uri()

נבחן מקרוב את transcribe_uri() שהשתנה.

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

לקוח Python

צריך את הלקוח של Python לתרגום בענן. כדי להתקין, מקלידים את האפשרויות הבאות ב-Cloud Shell:

sudo pip install --upgrade google-cloud-translate

זה הזמן לנסות

עכשיו נלמד את דוגמאות הקוד לתרגום ב-Cloud. לצורך שיעור ה-Codelab הזה, אנחנו רוצים לתרגם טקסט לאנגלית. snippets.py נראה כמו שאנחנו רוצים. מעתיקים את contents.py, יוצרים קובץ חדש ב-Cloud Shell בשם translate.py ומדביקים את כל הקוד ב-translate.py. אפשר לעשות זאת באופן ידני בעורך הקוד של Cloud Shell, או להריץ את פקודת ה-curl הזו ב-Cloud Shell:

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

לאחר מכן, השתמשו ב-API באמצעות הפעלת הפריטים הבאים ב-Cloud Shell:

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

התרגום צריך להיות "האם יש לך ז'קט {9}?;

מה קורה?

העברת 3 ארגומנטים אל translate.py:

  • הפונקציה translate-text בוחרת את הפונקציה translate_text() שרוצים להריץ
  • en מועבר כ-target אל translate_text() ומשמש לציון השפה שאליה רוצים לתרגם
  • ‘你涉沒晉帶外套' היא המחרוזת שיש לתרגם והיא מועברת כטקסט אל translate_text()

בואו נבחן מקרוב את translate_text(). פרטים על התגובות שנוספו

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

לקוח Python

צריך את לקוח Python לשפה בענן ב-Cloud. כדי להתקין, הקלידו את הפרטים הבאים ב-Cloud Shell:

sudo pip install --upgrade google-cloud-language

זה הזמן לנסות

לבסוף, מעיינים בדוגמאות הקוד של ממשק ה-API לשפת Cloud Cloud. אנחנו רוצים לזהות ישויות בטקסט. נראה ש-snippets.py מכיל קוד לביצוע הפעולה הזו. מעתיקים את contents.py, יוצרים קובץ חדש ב-Cloud Shell בשם natural_language.py ומדביקים את כל הקוד ב-natural_language.py. אפשר לעשות זאת באופן ידני בעורך הקוד של Cloud Shell, או להריץ את פקודת ה-curl הזו ב-Cloud Shell:

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

לאחר מכן, השתמשו ב-API באמצעות הפעלת הפריטים הבאים ב-Cloud Shell:

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

ממשק ה-API צריך לזהות את "bike" בתור ישות. ישויות יכולות להיות שמות עצם נכונים (דמויות ציבוריות, ציוני דרך וכו') או שמות עצם נפוצים (מסעדה, אצטדיון וכו').

מה קורה?

העברת 2 ארגומנטים אל natural_language.py:

  • entities-text בוחר את הפונקציה entities_text() להרצה
  • 'היכן השארת את האופניים שלי' היא המחרוזת לניתוח הנתונים עבור ישויות, והיא מועברת כטקסט אל entities_text()

בואו נבחן מקרוב את entities_text(). שימו לב לתגובות החדשות שנוספו.

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.‏ בואו נשלב אותם

בואו להזכיר לנו מה אתם בונים.

e6a57e5def315116.jpeg

עכשיו נשלב את הכול. יצירת קובץ solution.py. ניתן להעתיק ולהדביק את detect_labels_uri(), transcribe_gcs(), translate_text() ואת entities_text() מהשלבים הקודמים ב-solution.py.

ייבוא דוחות

ביטול התגובה והעברת הצהרות הייבוא לראש הרשימה. לידיעתך, מתבצע ייבוא של speech.types ושל language.types. פעולה זו תגרום להתנגשויות, לכן יש להסיר אותן ולשנות את כל המופעים של types ב-transcribe_gcs() וב-entities_text() ל-speech.types ול-language.types בהתאמה. ללא הופעות:

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

החזרות תוצאות

במקום להדפיס, הפונקציות יחזירו את התוצאות. אמור להיות לכם משהו כמו:

# 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

שימוש בפונקציות

אחרי כל העבודה הקשה, אפשר לקרוא לפונקציות האלה. קדימה, לעבודה! לדוגמה:

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

תמיכה בשפות מרובות

עד כה התאמנו את הקוד לטורקית לtranscribe_gcs(). בואו נשנה את השפה הזו כדי שניתן יהיה לזהות את השפה מהשפה compare_audio_to_image(). הנה השינויים הנדרשים:

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)

רוצים לנסות?

הקוד הסופי נמצא ב-solution.py של מאגר GitHub זה. הנה פקודה תלת-ממדית כדי לקבל את הנתונים הבאים:

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

הגרסה ב-GitHub מכילה argparse, שמאפשר את האפשרות הבאה משורת הפקודה:

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

עבור כל פריט שנמצא, הקוד צריך להיות פלט " האודיו והתמונה כוללים: " בדוגמה שלמעלה, זה יהיה "האודיו והתמונה כוללים את שני הערכים: ball".

בונוס: ניסיון נוסף

הנה עוד מיקומים של קובצי אודיו ותמונות.

8.‏ מעולה!

סקרתם ושולבו ארבעה ממשקי API של למידה חישובית כדי לקבוע אם דגימת דיבור מוקראת על התמונה המוצגת. זאת רק ההתחלה, כי יש עוד הרבה דרכים לשפר את איכות הצינור.

באילו נושאים מדובר?

  • שליחת בקשות ל-Cloud Vision API
  • שליחת בקשות אל Cloud Speech-to-Text API
  • שליחת בקשות ל-Cloud Translate API
  • שליחת בקשות ל-Cloud הטבעי Language API
  • שימוש בכל ממשקי ה-API שלמעלה

השלבים הבאים