دمج واجهات برمجة تطبيقات تعلُّم الآلة

1. نظرة عامة

سيقدّم لك هذا الدرس التطبيقي حول الترميز جولة سريعة في بعض واجهات برمجة التطبيقات الخاصة بتعلُّم الآلة. ستستخدم:

  • Cloud Vision لفهم محتوى الصورة
  • Cloud Speech-to-Text لتحويل الصوت إلى نص
  • Cloud Translation لترجمة أي سلسلة عشوائية إلى أي لغة متوافقة
  • Cloud Natural Language لاستخراج المعلومات من النص

ما ستنشئه

ستنشئ مسار معالجة يقارن تسجيلاً صوتيًا بصورة ويحدّد مدى صلة كل منهما بالآخر. في ما يلي نظرة خاطفة على كيفية تحقيق ذلك:

e6a57e5def315116.jpeg

أهداف الدورة التعليمية

  • كيفية استخدام واجهات برمجة التطبيقات Vision وSpeech-to-Text وTranslation وNatural Language
  • أماكن العثور على عيّنات التعليمات البرمجية

المتطلبات

  • متصفّح، مثل Chrome أو Firefox
  • معرفة أساسية بلغة Python

2. الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم PROJECT_ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.

لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن وُجدت تكلفة على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي ينصحك بكيفية إيقاف الموارد حتى لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي. يمكن للمستخدمين الجدد في Google Cloud الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

تفعيل واجهات برمجة التطبيقات

يمكنك النقر على هذا الرابط لتفعيل جميع واجهات برمجة التطبيقات اللازمة. بعد ذلك، يمكنك تجاهل التعليمات المتعلّقة بإعداد المصادقة، وسنتولّى نحن تنفيذ ذلك في لحظة. يمكنك بدلاً من ذلك تفعيل كل واجهة برمجة تطبيقات على حدة. لإجراء ذلك، انقر على رمز القائمة في أعلى يمين الشاشة.

2bfc27ef9ba2ec7d.png

اختَر واجهات برمجة التطبيقات والخدمات من القائمة المنسدلة وانقر على "لوحة البيانات".

a9546a22581facd5.png

انقر على تفعيل واجهات برمجة التطبيقات والخدمات.

eae7ff043d13a35.png

بعد ذلك، ابحث عن "الرؤية" في مربّع البحث. انقر على Google Cloud Vision API:

a47893f36372ae2f.png

انقر على تفعيل لتفعيل Cloud Vision API:

a24fd082a22030ad.png

انتظِر بضع ثوانٍ حتى يتم تفعيلها. سيظهر لك ما يلي بعد تفعيلها:

633e58cbde1b74c6.png

كرِّر العملية نفسها لتفعيل واجهات 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" Screen Shot 2015-06-08 at 5.30.32 PM.png في أعلى يسار شريط العنوان.

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_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. لنبدأ عملية الدمج

لنذكّر أنفسنا بما تعمل على إنشائه.

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 للحصول على ذلك:

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

بالنسبة إلى كل عنصر تم العثور عليه، يجب أن تعرض التعليمات البرمجية "يحتوي كل من الصوت والصورة على: ". في المثال أعلاه، ستكون النتيجة "يحتوي كل من الصوت والصورة على: كرة".

مكافأة: تجربة المزيد

في ما يلي المزيد من المواقع الجغرافية لملفات الصوت والصور التي يمكنك تجربتها.

عينات الكلام باللغة التركية: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

عينات صوتية باللغة الألمانية: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

أمثلة على الصور: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. تهانينا!

استكشفت أربع واجهات برمجة تطبيقات لتعلُّم الآلة ودمجتها لتحديد ما إذا كانت عيّنة الكلام تتحدث عن الصورة المقدَّمة. هذه ليست سوى البداية، إذ هناك العديد من الطرق الأخرى لتحسين مسار الإحالة هذا.

المواضيع التي تناولناها

  • إرسال طلبات إلى Cloud Vision API
  • إرسال طلبات إلى Cloud Speech-to-Text API
  • إرسال طلبات إلى Cloud Translation API
  • إرسال طلبات إلى Cloud Natural Language API
  • استخدام جميع واجهات برمجة التطبيقات المذكورة أعلاه معًا

الخطوات التالية