1. نظرة عامة
سيقدّم لك هذا الدرس التطبيقي حول الترميز جولة سريعة في بعض واجهات برمجة التطبيقات الخاصة بتعلُّم الآلة. ستستخدم:
- Cloud Vision لفهم محتوى الصورة
- Cloud Speech-to-Text لتحويل الصوت إلى نص
- Cloud Translation لترجمة أي سلسلة عشوائية إلى أي لغة متوافقة
- Cloud Natural Language لاستخراج المعلومات من النص
ما ستنشئه
ستنشئ مسار معالجة يقارن تسجيلاً صوتيًا بصورة ويحدّد مدى صلة كل منهما بالآخر. في ما يلي نظرة خاطفة على كيفية تحقيق ذلك:
أهداف الدورة التعليمية
- كيفية استخدام واجهات برمجة التطبيقات Vision وSpeech-to-Text وTranslation وNatural Language
- أماكن العثور على عيّنات التعليمات البرمجية
المتطلبات
2. الإعداد والمتطلبات
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم PROJECT_ID
.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.
لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن وُجدت تكلفة على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي ينصحك بكيفية إيقاف الموارد حتى لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي. يمكن للمستخدمين الجدد في Google Cloud الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
تفعيل واجهات برمجة التطبيقات
يمكنك النقر على هذا الرابط لتفعيل جميع واجهات برمجة التطبيقات اللازمة. بعد ذلك، يمكنك تجاهل التعليمات المتعلّقة بإعداد المصادقة، وسنتولّى نحن تنفيذ ذلك في لحظة. يمكنك بدلاً من ذلك تفعيل كل واجهة برمجة تطبيقات على حدة. لإجراء ذلك، انقر على رمز القائمة في أعلى يمين الشاشة.
اختَر واجهات برمجة التطبيقات والخدمات من القائمة المنسدلة وانقر على "لوحة البيانات".
انقر على تفعيل واجهات برمجة التطبيقات والخدمات.
بعد ذلك، ابحث عن "الرؤية" في مربّع البحث. انقر على Google Cloud Vision API:
انقر على تفعيل لتفعيل Cloud Vision API:
انتظِر بضع ثوانٍ حتى يتم تفعيلها. سيظهر لك ما يلي بعد تفعيلها:
كرِّر العملية نفسها لتفعيل واجهات Cloud Speech وCloud Translation وCloud Natural Language APIs.
Cloud Shell
Google Cloud Shell هي بيئة سطر أوامر تعمل في السحابة الإلكترونية. تتضمّن هذه الآلة الافتراضية المستندة إلى Debian جميع أدوات التطوير التي تحتاج إليها (gcloud
وbq
وgit
وغيرها)، كما توفّر دليلًا منزليًا ثابتًا بسعة 5 غيغابايت. سنستخدم Cloud Shell لإنشاء طلبنا إلى واجهات برمجة التطبيقات الخاصة بتعلُّم الآلة.
للبدء باستخدام 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_APPLICATION_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
بعد ذلك، استخدِم واجهة برمجة التطبيقات من خلال تنفيذ ما يلي في 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
ما هي المشكلة؟
لقد مرّرت وسيطتَين إلى 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
لنجرّبها
لننتقل إلى نماذج الرموز البرمجية الخاصة بخدمة Cloud Speech-to-Text. نحن مهتمون بتحويل الصوت إلى نص. يبدو أنّ 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
بعد ذلك، استخدِم واجهة برمجة التطبيقات من خلال تنفيذ ما يلي في Cloud Shell:
python speech2text.py gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav
يجب أن تظهر أخطاء تشير إلى الترميز ومعدّل هرتز غير صحيحَين. لا تقلق، انتقِل إلى transcribe_gcs()
في الرمز واحذف إعدادات encoding
وsampe_hertz_rate
من RecognitionConfig()
. أثناء ذلك، غيِّر رمز اللغة إلى "tr-TR" لأنّ 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 Translation. لأغراض هذا الدرس التطبيقي حول الترميز، نريد ترجمة النص إلى الإنجليزية. يبدو أنّ snippets.py
هو ما نريده. انسخ محتوى snippets.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
بعد ذلك، استخدِم واجهة برمجة التطبيقات من خلال تنفيذ ما يلي في Cloud Shell:
python translate.py translate-text en '你有沒有帶外套'
يجب أن تكون الترجمة "هل لديك سترة؟".
ما الذي يحدث؟
لقد مرّرت 3 وسيطات إلى translate.py
:
- يختار translate-text الدالة
translate_text()
لتشغيلها - يتم تمرير en كـ target إلى
translate_text()
ويتم استخدامه لتحديد اللغة التي ستتم الترجمة إليها - ‘你有沒有帶外套' هي السلسلة المطلوب ترجمتها ويتم تمريرها كـ 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 Natural Language. للتثبيت، اكتب ما يلي في Cloud Shell:
sudo pip install --upgrade google-cloud-language
لنجرّبها
أخيرًا، لنلقِ نظرة على عيّنات الرموز البرمجية لواجهة برمجة التطبيقات Cloud Natural Language API. نريد رصد الكيانات في النص. يبدو أنّ snippets.py
يحتوي على تعليمات برمجية تفعل ذلك. انسخ محتوى snippets.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
بعد ذلك، استخدِم واجهة برمجة التطبيقات من خلال تنفيذ ما يلي في Cloud Shell:
python natural_language.py entities-text 'where did you leave my bike'
يجب أن تحدّد واجهة برمجة التطبيقات "الدراجة" ككيان. يمكن أن تكون الكيانات أسماء أعلام (شخصيات عامة، معالم، وما إلى ذلك) أو أسماء شائعة (مطعم، ملعب، وما إلى ذلك).
ما الذي يحدث؟
لقد مرّرت وسيطتَين إلى natural_language.py
:
- يختار entities-text الدالة
entities_text()
المطلوب تنفيذها - "where did you leave my bike" هي السلسلة التي سيتم تحليلها بحثًا عن عناصر، ويتم تمريرها كـ 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 للحصول على ذلك:
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
بالنسبة إلى كل عنصر تم العثور عليه، يجب أن تعرض التعليمات البرمجية "يحتوي كل من الصوت والصورة على: ". في المثال أعلاه، ستكون النتيجة "يحتوي كل من الصوت والصورة على: كرة".
مكافأة: تجربة المزيد
في ما يلي المزيد من المواقع الجغرافية لملفات الصوت والصور التي يمكنك تجربتها.
8. تهانينا!
استكشفت أربع واجهات برمجة تطبيقات لتعلُّم الآلة ودمجتها لتحديد ما إذا كانت عيّنة الكلام تتحدث عن الصورة المقدَّمة. هذه ليست سوى البداية، إذ هناك العديد من الطرق الأخرى لتحسين مسار الإحالة هذا.
المواضيع التي تناولناها
- إرسال طلبات إلى Cloud Vision API
- إرسال طلبات إلى Cloud Speech-to-Text API
- إرسال طلبات إلى Cloud Translation API
- إرسال طلبات إلى Cloud Natural Language API
- استخدام جميع واجهات برمجة التطبيقات المذكورة أعلاه معًا
الخطوات التالية
- لإجراء مقارنة أفضل بين الكلمات، يمكنك الاطّلاع على word2vec.
- يمكنك الاطّلاع على المزيد من الدروس البرمجية المتعمّقة حول Vision API وSpeech-to-Text API وTranslation API وNatural Language API.
- جرِّب استبدال Cloud Vision بخدمة Cloud Video intelligence
- إنشاء ملف صوتي من النص باستخدام Cloud Text-to-Speech API
- كيفية تحميل عناصر إلى Cloud Storage