Mengintegrasikan API machine learning

1. Ringkasan

Codelab ini akan memberi Anda tur singkat tentang beberapa API machine learning. Anda akan menggunakan:

  • Cloud Vision untuk memahami konten gambar
  • Cloud Speech-to-Text untuk mentranskripsikan audio menjadi teks
  • Cloud Translation untuk menerjemahkan string arbitrer ke dalam bahasa apa pun yang didukung
  • Cloud Natural Language untuk mengekstrak informasi dari teks

Yang akan Anda bangun

Anda akan membuat pipeline yang membandingkan rekaman audio dengan gambar dan menentukan relevansinya satu sama lain. Berikut pratinjau cara Anda melakukannya:

e6a57e5def315116.jpeg

Yang akan Anda pelajari

  • Cara menggunakan Vision, Speech-to-Text, Translation, dan Natural Language API
  • Tempat menemukan contoh kode

Yang Anda butuhkan

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console lalu buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai$300 USD.

Aktifkan API

Anda dapat mengklik link ini untuk mengaktifkan semua API yang diperlukan. Setelah melakukannya, abaikan petunjuk untuk menyiapkan autentikasi; kita akan melakukannya sebentar lagi. Atau, Anda dapat mengaktifkan setiap API satu per satu. Untuk melakukannya, klik ikon menu di kiri atas layar.

2bfc27ef9ba2ec7d.png

Pilih APIs & services dari drop-down, lalu klik Dashboard

a9546a22581facd5.png

Klik Enable APIs and services.

eae7ff043d13a35.png

Kemudian, telusuri "vision" di kotak penelusuran. Klik Google Cloud Vision API:

a47893f36372ae2f.png

Klik Enable untuk mengaktifkan Cloud Vision API:

a24fd082a22030ad.png

Tunggu beberapa detik hingga tombol diaktifkan. Anda akan melihat ini setelah diaktifkan:

633e58cbde1b74c6.png

Ulangi proses yang sama untuk mengaktifkan Cloud Speech, Cloud Translation, dan Cloud Natural Language API.

Cloud Shell

Google Cloud Shell adalah lingkungan command line yang berjalan di Cloud. Mesin virtual berbasis Debian ini dilengkapi dengan semua alat pengembangan yang akan Anda perlukan (gcloud, bq, git, dan lainnya) serta menawarkan direktori beranda persisten sebesar 5 GB. Kita akan menggunakan Cloud Shell untuk membuat permintaan ke machine learning API.

Untuk mulai menggunakan Cloud Shell, klik ikon "Activate Google Cloud Shell" Screen Shot 2015-06-08 at 5.30.32 PM.png di pojok kanan atas header bar

24ef50000ca737a4.png

Sesi Cloud Shell akan terbuka di dalam frame baru di bagian bawah konsol dan menampilkan perintah command-line. Tunggu hingga perintah user@project:~$ muncul.

Opsional: Editor Kode

Bergantung pada kenyamanan Anda menggunakan command line, Anda dapat mengklik ikon "Launch Code Editor" b885bf07bc1b02e5.png di pojok kanan atas bar Cloud Shell

de00be9278baf7b8.png

Akun Layanan

Anda akan memerlukan akun layanan untuk melakukan autentikasi. Untuk membuatnya, ganti [NAME] dengan nama akun layanan yang diinginkan dan jalankan perintah berikut di Cloud Shell:

gcloud iam service-accounts create [NAME]

Sekarang Anda harus membuat kunci untuk menggunakan akun layanan tersebut. Ganti [FILE_NAME] dengan nama kunci yang diinginkan, [NAME] dengan nama akun layanan dari atas, dan [PROJECT_ID] dengan ID project Anda. Perintah berikut akan membuat dan mendownload kunci sebagai [FILE_NAME].json:

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

Untuk menggunakan akun layanan, Anda harus menetapkan variabel GOOGLE_APPLICATION_CREDENTIALS ke jalur kunci. Untuk melakukannya, jalankan perintah berikut setelah mengganti [PATH_TO_FILE] dan [FILE_NAME]:

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

3. Cloud Vision

Klien Python

Anda memerlukan klien Python untuk Cloud Vision. Untuk menginstal, ketik perintah berikut di Cloud Shell:

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

Mari kita coba

Mari kita lihat contoh kode untuk Cloud Vision API. Kami tertarik untuk mengetahui konten dalam gambar tertentu. detect.py tampaknya berguna untuk hal ini, jadi mari kita ambil. Salah satu caranya adalah dengan menyalin isi detect.py, membuat file baru di Cloud Shell bernama vision.py, dan menempelkan semua kode ke vision.py. Anda dapat melakukannya secara manual di editor kode Cloud Shell atau menjalankan perintah curl ini di Cloud Shell:

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

Setelah melakukannya, gunakan API dengan menjalankan perintah berikut di Cloud Shell:

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

Anda akan melihat output tentang burung dan burung unta karena gambar ini yang dianalisis: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Apa yang terjadi?

Anda meneruskan 2 argumen ke vision.py:

  • labels-uri memilih fungsi detect_labels_uri() yang akan dijalankan
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg adalah lokasi gambar di Google Cloud Storage dan diteruskan sebagai uri ke detect_labels_uri()

Mari kita pelajari lebih lanjut detect_labels_uri(). Perhatikan komentar tambahan yang telah disisipkan.

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

Klien Python

Anda memerlukan klien Python untuk Cloud Speech-to-Text. Untuk menginstal, ketik perintah berikut di Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Mari kita coba

Buka contoh kode untuk Cloud Speech-to-Text. Kami tertarik untuk mentranskripsikan audio ucapan. transcribe.py tampaknya merupakan tempat yang tepat untuk memulai, jadi mari kita gunakan. Salin isi transcribe.py, buat file baru di Cloud Shell bernama speech2text.py, lalu tempel semua kode ke speech2text.py. Anda dapat melakukannya secara manual di editor kode Cloud Shell atau menjalankan perintah curl ini di Cloud Shell:

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

Setelah melakukannya, gunakan API dengan menjalankan perintah berikut di Cloud Shell:

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

Seharusnya ada error yang mengeluhkan encoding dan frekuensi hertz sampel yang salah. Jangan khawatir, buka transcribe_gcs() dalam kode dan hapus setelan encoding dan sampe_hertz_rate dari RecognitionConfig(). Sekalian saja, ubah kode bahasa menjadi'tr-TR' karena tr-ostrich.wav adalah rekaman ucapan dalam bahasa Turki.

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

Sekarang, jalankan speech2text.py lagi. Outputnya harus berupa teks berbahasa Turki karena audio yang dianalisis adalah: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Apa yang terjadi?

Anda meneruskan gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, lokasi file audio di Google Cloud Storage ke speech2text.py, yang kemudian diteruskan sebagai gcs_uri ke transcribe_uri()

Mari kita lihat lebih dekat transcribe_uri() yang telah diubah.

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

Klien Python

Anda memerlukan klien Python untuk Cloud Translation. Untuk menginstal, ketik perintah berikut ke Cloud Shell:

sudo pip install --upgrade google-cloud-translate

Mari kita coba

Sekarang, mari kita lihat contoh kode untuk Cloud Translation. Untuk tujuan codelab ini, kita ingin menerjemahkan teks ke dalam bahasa Inggris. snippets.py terlihat seperti yang kita inginkan. Salin konten snippets.py, buat file baru di Cloud Shell bernama translate.py, lalu tempelkan semua kode ke translate.py. Anda dapat melakukannya secara manual di editor kode Cloud Shell atau menjalankan perintah curl ini di Cloud Shell:

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

Setelah melakukannya, gunakan API dengan menjalankan perintah berikut di Cloud Shell:

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

Terjemahannya harus "Apakah Anda punya jaket?".

Apa yang terjadi?

Anda meneruskan 3 argumen ke translate.py:

  • translate-text memilih fungsi translate_text() yang akan dijalankan
  • en diteruskan sebagai target ke translate_text() dan berfungsi untuk menentukan bahasa yang akan diterjemahkan
  • ‘你有沒有帶外套' adalah string yang akan diterjemahkan dan diteruskan sebagai text ke translate_text()

Mari kita pelajari lebih lanjut translate_text(). Perhatikan komentar yang telah ditambahkan.

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

Klien Python

Anda memerlukan klien Python untuk Cloud Natural Language. Untuk menginstal, ketik perintah berikut di Cloud Shell:

sudo pip install --upgrade google-cloud-language

Mari kita coba

Terakhir, mari kita lihat contoh kode untuk Cloud Natural Language API. Kita ingin mendeteksi entitas dalam teks. snippets.py tampaknya berisi kode yang melakukan hal tersebut. Salin konten snippets.py, buat file baru di Cloud Shell bernama natural_language.py, lalu tempelkan semua kode ke natural_language.py. Anda dapat melakukannya secara manual di editor kode Cloud Shell atau menjalankan perintah curl ini di Cloud Shell:

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

Setelah melakukannya, gunakan API dengan menjalankan perintah berikut di Cloud Shell:

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

API harus mengidentifikasi "sepeda" sebagai entitas. Entitas dapat berupa kata benda properti (tokoh masyarakat, bangunan terkenal, dll.) atau kata benda umum (restoran, stadion, dll.).

Apa yang terjadi?

Anda meneruskan 2 argumen ke natural_language.py:

  • entities-text memilih fungsi entities_text() yang akan dijalankan
  • ‘di mana kamu meninggalkan sepedaku' adalah string yang akan dianalisis untuk entity dan diteruskan sebagai text ke entities_text()

Mari kita pelajari lebih lanjut entities_text(). Perhatikan komentar baru yang telah disisipkan.

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. Mari Kita Integrasikan

Mari kita ingatkan diri kita sendiri tentang apa yang Anda buat.

e6a57e5def315116.jpeg

Sekarang mari kita gabungkan semuanya. Buat file solution.py; salin dan tempel detect_labels_uri(), transcribe_gcs(), translate_text(), dan entities_text() dari langkah sebelumnya ke dalam solution.py.

Pernyataan impor

Hapus komentar dan pindahkan pernyataan impor ke bagian atas. Perhatikan bahwa speech.types dan language.types sedang diimpor. Hal ini akan menyebabkan konflik, jadi mari kita hapus saja dan ubah setiap kemunculan types di transcribe_gcs() dan entities_text() menjadi speech.types dan language.types. Anda akan mendapatkan:

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

Hasil yang ditampilkan

Daripada mencetak, buat fungsi menampilkan hasilnya. Anda akan melihat sesuatu yang mirip dengan:

# 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

Menggunakan fungsi

Setelah semua kerja keras itu, Anda dapat memanggil fungsi tersebut. Lanjutkan, lakukan! Berikut contohnya:

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

Mendukung beberapa bahasa

Sebelumnya, kami melakukan hardcode bahasa Turki ke dalam transcribe_gcs(). Mari kita ubah sehingga bahasa dapat ditentukan dari compare_audio_to_image(). Berikut adalah perubahan yang diperlukan:

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)

Cobalah

Kode akhir dapat ditemukan di solution.py di repositori GitHub ini. Berikut adalah perintah curl untuk mengambilnya:

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

Versi di GitHub berisi argparse, yang memungkinkan hal berikut dari command line:

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

Untuk setiap item yang ditemukan, kode harus menampilkan "Audio dan gambar keduanya berisi: ". Dalam contoh di atas, hasilnya adalah "Audio dan gambar keduanya berisi: bola".

Bonus: coba lebih banyak

Berikut adalah lokasi file audio dan gambar lainnya yang dapat dicoba.

Contoh ucapan tr-TR: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

Contoh ucapan de-DE: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

Contoh gambar: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. Selamat!

Anda telah menjelajahi dan mengintegrasikan empat API machine learning untuk menentukan apakah sampel ucapan sedang membicarakan gambar yang diberikan. Ini baru permulaan karena masih banyak cara untuk meningkatkan kualitas pipeline ini.

Yang telah kita bahas

  • Membuat permintaan ke Cloud Vision API
  • Membuat permintaan ke Cloud Speech-to-Text API
  • Membuat permintaan ke Cloud Translation API
  • Membuat permintaan ke Cloud Natural Language API
  • Menggunakan semua API di atas secara bersamaan

Langkah Berikutnya