מידע על Codelab זה
1. סקירה כללית
זהו שיעור Lab שיספק לכם סיור מהיר עם כמה ממשקי API ללמידה חישובית. תשתמשו ב:
- Cloud Vision כדי להבין את תוכן התמונה
- Cloud Speech to-text כדי לתמלל אודיו לטקסט
- תרגום בענן כדי לתרגם מחרוזת שרירותית לכל שפה נתמכת
- שפה טבעית בענן כדי לחלץ מידע מהטקסט
מה תיצור
עליכם ליצור צינור עיבוד נתונים שמשווה בין הקלטת אודיו לבין תמונה, והוא קובע את הרלוונטיות שלהם זה לזה. אפשר לקבל הצצה מהירה על הדרכים שבהן אפשר לעשות זאת:
מה תלמדו
- איך משתמשים ב-Vision, המרת דיבור לטקסט (STT), תרגום ושפת שפה טבעית (NLP)
- איפה אפשר למצוא דוגמאות לקוד?
מה תצטרך להכין
2. הגדרה ודרישות
הגדרת סביבה בקצב עצמי
- נכנסים ל-Cloud Console ויוצרים פרויקט חדש או משתמשים שוב בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
חשוב לזכור את מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם הקודם כבר תפוס, והוא לא יעבוד בשבילך.) נתייחס אליו מאוחר יותר ב-codelab הזה בתור PROJECT_ID
.
- לאחר מכן, עליך להפעיל חיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
להריץ את קוד שיעור זה לא אמור לעלות הרבה, אם בכלל. הקפידו לפעול לפי ההוראות המפורטות בקטע "ניקוי משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית הניסיון של $300 בחינם.
הפעלת ממשקי API
אתם יכולים ללחוץ על הקישור הזה כדי להפעיל את כל ממשקי ה-API הנחוצים. לאחר מכן, אתם מוזמנים להתעלם מההוראות להגדרת האימות; אנחנו נעשה זאת ברגע. לחלופין, אפשר להפעיל כל API בנפרד. כדי לעשות את זה, לוחצים על סמל התפריט בפינה הימנית העליונה של המסך.
בוחרים באפשרות APIs & Services מתוך התפריט הנפתח ולוחצים על 'מרכז השליטה'.
לוחצים על הפעלת ממשקי API ושירותים.
לאחר מכן, מחפשים את הביטוי "vision" בתיבת החיפוש. לוחצים על Google Cloud Vision API:
לוחצים על הפעלה כדי להפעיל את Cloud Vision API:
ממתינים מספר שניות עד שהיא תופעל. יוצג לך ברגע שהיא תופעל:
חוזרים על אותו התהליך כדי להפעיל את ממשקי ה-API של Cloud Speech, תרגום של Cloud ו-Cloud טבעי.
Cloud Shell
התכונה Google Cloud Shell היא סביבת שורת פקודה שפועלת ב-Cloud. המכונה הווירטואלית המבוססת על Debian נטענת עם כל כלי הפיתוח הדרושים לך (gcloud
, bq
, git
ואחרים) וספריית בית קבועה בנפח של 5GB. אנחנו נשתמש ב-Cloud Shell כדי ליצור את הבקשה שלנו לממשקי ה-API של הלמידה החישובית.
כדי להתחיל להשתמש ב-Cloud Shell, לוחצים על הסמל "הפעלת Google Cloud Shell" בפינה השמאלית העליונה של סרגל הכותרת
סשן של Cloud Shell ייפתח בתוך מסגרת חדשה בחלק התחתון של המסוף, ויציג הודעה בשורת הפקודה. ממתינים עד שתופיע ההודעה user@project:~$.
אופציונלי: עורך קוד
בהתאם לנוחות שלכם בשורת הפקודה, מומלץ ללחוץ על הסמל "הפעלת קוד קוד" בפינה השמאלית העליונה של סרגל Cloud Shell
חשבון שירות
נדרש חשבון שירות כדי לבצע אימות. כדי ליצור חשבון, מחליפים את [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. בואו נשלב אותם
בואו להזכיר לנו מה אתם בונים.
עכשיו נשלב את הכול. יצירת קובץ 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 שלמעלה
השלבים הבאים
- להשוואה טובה יותר של מילים, יש לעיין ב-word2vec
- אפשר לעיין לעומק במעבדות הקוד ב-Vision API, ב-Speech-to-Text API, ב-Translate API וב-Natral Language API
- כדאי להחליף את Cloud Vision ב-Cloud Video Intelligence-
- סינתזת האודיו באמצעות המרת טקסט לדיבור בענן
- איך מעלים אובייקטים ל-Cloud Storage