Tích hợp các API học máy

1. Tổng quan

Lớp học lập trình này sẽ giới thiệu nhanh cho bạn một số API học máy. Bạn sẽ sử dụng:

  • Cloud Vision để hiểu nội dung của một hình ảnh
  • Cloud Speech-to-Text để chép lời âm thanh thành văn bản
  • Cloud Translation để dịch một chuỗi bất kỳ sang ngôn ngữ được hỗ trợ
  • Cloud Natural Language để trích xuất thông tin từ văn bản

Sản phẩm bạn sẽ tạo ra

Bạn sẽ tạo một quy trình so sánh bản ghi âm với một hình ảnh và xác định mức độ liên quan của chúng với nhau. Sau đây là thông tin sơ bộ về cách bạn sẽ thực hiện việc đó:

e6a57e5def315116.jpeg

Kiến thức bạn sẽ học được

  • Cách sử dụng API Thị giác, API Chuyển lời nói sang văn bản, API Dịch và API Ngôn ngữ tự nhiên
  • Nơi tìm mã mẫu

Bạn cần có

  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Kiến thức cơ bản về Python

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.

  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Bật các API

Bạn có thể nhấp vào đường liên kết này để bật tất cả các API cần thiết. Sau khi thực hiện, bạn có thể bỏ qua hướng dẫn thiết lập quy trình xác thực; chúng ta sẽ thực hiện quy trình đó sau. Ngoài ra, bạn có thể bật từng API riêng lẻ. Để làm như vậy, hãy nhấp vào biểu tượng trình đơn ở trên cùng bên trái màn hình.

2bfc27ef9ba2ec7d.png

Chọn API và dịch vụ trong trình đơn thả xuống rồi nhấp vào Trang tổng quan

a9546a22581facd5.png

Nhấp vào Bật API và dịch vụ.

eae7ff043d13a35.png

Sau đó, hãy tìm "thị lực" trong hộp tìm kiếm. Nhấp vào Google Cloud Vision API:

a47893f36372ae2f.png

Nhấp vào Bật để bật Cloud Vision API:

a24fd082a22030ad.png

Chờ vài giây để tính năng này bật. Bạn sẽ thấy thông báo này sau khi bật tính năng:

633e58cbde1b74c6.png

Lặp lại quy trình tương tự để bật Cloud Speech API, Cloud Translation API và Cloud Natural Language API.

Cloud Shell

Google Cloud Shell là một môi trường dòng lệnh chạy trên Cloud. Máy ảo dựa trên Debian này được trang bị tất cả các công cụ phát triển mà bạn cần (gcloud, bq, git và các công cụ khác) và cung cấp một thư mục chính có dung lượng 5 GB. Chúng ta sẽ sử dụng Cloud Shell để tạo yêu cầu cho các API học máy.

Để bắt đầu sử dụng Cloud Shell, hãy nhấp vào biểu tượng "Kích hoạt Google Cloud Shell" Screen Shot 2015-06-08 at 5.30.32 PM.png ở góc trên cùng bên phải của thanh tiêu đề

24ef50000ca737a4.png

Một phiên Cloud Shell sẽ mở ra trong một khung hình mới ở cuối bảng điều khiển và hiển thị một dấu nhắc dòng lệnh. Chờ cho đến khi lời nhắc user@project:~$ xuất hiện.

Không bắt buộc: Trình soạn thảo mã

Tuỳ thuộc vào mức độ quen thuộc với dòng lệnh, bạn có thể nhấp vào biểu tượng "Chạy trình chỉnh sửa mã" b885bf07bc1b02e5.png ở góc trên cùng bên phải của thanh Cloud Shell

de00be9278baf7b8.png

Tài khoản dịch vụ

Bạn sẽ cần một tài khoản dịch vụ để xác thực. Để tạo một tài khoản, hãy thay thế [NAME] bằng tên tài khoản dịch vụ mong muốn và chạy lệnh sau trong Cloud Shell:

gcloud iam service-accounts create [NAME]

Bây giờ, bạn cần tạo một khoá để sử dụng tài khoản dịch vụ đó. Thay thế [FILE_NAME] bằng tên khoá mong muốn, [NAME] bằng tên tài khoản dịch vụ ở trên và [PROJECT_ID] bằng mã dự án của bạn. Lệnh sau đây sẽ tạo và tải khoá xuống dưới dạng [FILE_NAME].json:

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

Để sử dụng tài khoản dịch vụ, bạn phải đặt biến GOOGLE_APPLICATION_CREDENTIALS thành đường dẫn của khoá. Để thực hiện việc này, hãy chạy lệnh sau sau khi thay thế [PATH_TO_FILE] và [FILE_NAME]:

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

3. Cloud Vision

Ứng dụng Python

Bạn sẽ cần có ứng dụng Python cho Cloud Vision. Để cài đặt, hãy nhập nội dung sau vào Cloud Shell:

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

Hãy thử xem

Hãy xem các mã mẫu cho Cloud Vision API. Chúng ta quan tâm đến việc tìm hiểu nội dung trong một hình ảnh cụ thể. detect.py có vẻ hữu ích cho việc này, vì vậy hãy lấy thông tin đó. Một cách là sao chép nội dung của detect.py, tạo một tệp mới trong Cloud Shell có tên là vision.py rồi dán tất cả mã vào vision.py. Bạn có thể thực hiện việc này theo cách thủ công trong trình chỉnh sửa mã Cloud Shell hoặc chạy lệnh curl này trong Cloud Shell:

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

Sau khi thực hiện xong, hãy sử dụng API bằng cách chạy lệnh sau trong Cloud Shell:

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

Bạn sẽ thấy kết quả về chim và đà điểu vì đây là hình ảnh được phân tích: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Nội dung có vấn đề gì?

Bạn đã truyền 2 đối số đến vision.py:

  • labels-uri chọn hàm detect_labels_uri() để chạy
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg là vị trí của một hình ảnh trên Google Cloud Storage và được truyền dưới dạng uri vào detect_labels_uri()

Hãy cùng tìm hiểu kỹ hơn về detect_labels_uri(). Lưu ý những bình luận bổ sung đã được chèn.

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

Ứng dụng Python

Bạn sẽ cần ứng dụng Python cho Cloud Speech-to-Text. Để cài đặt, hãy nhập nội dung sau vào Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Hãy thử xem

Hãy chuyển đến các mã mẫu cho Cloud Speech-to-Text. Chúng tôi muốn chép lời âm thanh. transcribe.py có vẻ là một nơi phù hợp để bắt đầu, vì vậy, hãy sử dụng hàm này. Sao chép nội dung của transcribe.py, tạo một tệp mới trong Cloud Shell có tên là speech2text.py rồi dán tất cả mã vào speech2text.py. Bạn có thể thực hiện việc này theo cách thủ công trong trình chỉnh sửa mã Cloud Shell hoặc chạy lệnh curl này trong Cloud Shell:

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

Sau khi thực hiện xong, hãy sử dụng API bằng cách chạy lệnh sau trong Cloud Shell:

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

Sẽ có lỗi báo cáo về tốc độ mã hoá và tốc độ lấy mẫu hertz không chính xác. Đừng lo lắng, hãy chuyển đến transcribe_gcs() trong mã và xoá các chế độ cài đặt encodingsampe_hertz_rate khỏi RecognitionConfig(). Trong khi đó, hãy thay đổi mã ngôn ngữ thành "tr-TR" vì tr-ostrich.wav là bản ghi âm giọng nói bằng tiếng Thổ Nhĩ Kỳ.

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

Bây giờ, hãy chạy lại speech2text.py. Kết quả đầu ra phải là một đoạn văn bản tiếng Thổ Nhĩ Kỳ vì đây là đoạn âm thanh được phân tích: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Điều gì đang xảy ra?

Bạn đã truyền gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, vị trí của một tệp âm thanh trên Google Cloud Storage đến speech2text.py, sau đó được truyền dưới dạng gcs_uri vào transcribe_uri()

Hãy xem xét kỹ hơn transcribe_uri() đã được sửa đổi của chúng ta.

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

Ứng dụng Python

Bạn sẽ cần ứng dụng Python cho Cloud Translation. Để cài đặt, hãy nhập nội dung sau vào Cloud Shell:

sudo pip install --upgrade google-cloud-translate

Hãy thử xem

Bây giờ, hãy xem các mã mẫu cho Cloud Translation. Để phục vụ mục đích của lớp học lập trình này, chúng ta muốn dịch văn bản sang tiếng Anh. snippets.py trông giống như những gì chúng ta muốn. Sao chép nội dung của snippets.py, tạo một tệp mới trong Cloud Shell có tên là translate.py rồi dán tất cả mã vào translate.py. Bạn có thể thực hiện việc này theo cách thủ công trong trình chỉnh sửa mã Cloud Shell hoặc chạy lệnh curl này trong Cloud Shell:

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

Sau khi thực hiện xong, hãy sử dụng API bằng cách chạy lệnh sau trong Cloud Shell:

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

Bản dịch phải là "Bạn có áo khoác không?".

Điều gì đang xảy ra?

Bạn đã truyền 3 đối số đến translate.py:

  • translate-text chọn hàm translate_text() để chạy
  • en được truyền dưới dạng target vào translate_text() và dùng để chỉ định ngôn ngữ cần dịch
  • "你有沒有帶外套" là chuỗi cần được dịch và được truyền dưới dạng text vào translate_text()

Hãy cùng tìm hiểu kỹ hơn về translate_text(). Lưu ý những bình luận đã được thêm.

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

Ứng dụng Python

Bạn sẽ cần ứng dụng Python cho Cloud Natural Language. Để cài đặt, hãy nhập nội dung sau vào Cloud Shell:

sudo pip install --upgrade google-cloud-language

Hãy thử xem

Cuối cùng, hãy xem các mã mẫu cho Cloud Natural Language API. Chúng ta muốn phát hiện các thực thể trong văn bản. snippets.py có vẻ như chứa mã thực hiện việc đó. Sao chép nội dung của snippets.py, tạo một tệp mới trong Cloud Shell có tên là natural_language.py rồi dán tất cả mã vào natural_language.py. Bạn có thể thực hiện việc này theo cách thủ công trong trình chỉnh sửa mã Cloud Shell hoặc chạy lệnh curl này trong Cloud Shell:

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

Sau khi thực hiện xong, hãy sử dụng API bằng cách chạy lệnh sau trong Cloud Shell:

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

API phải xác định "xe đạp" là một thực thể. Thực thể có thể là danh từ riêng (nhân vật của công chúng, địa danh, v.v.) hoặc danh từ chung (nhà hàng, sân vận động, v.v.).

Điều gì đang xảy ra?

Bạn đã truyền 2 đối số đến natural_language.py:

  • entities-text chọn hàm entities_text() để chạy
  • "where did you leave my bike" là chuỗi cần phân tích thực thể và được truyền dưới dạng text vào entities_text()

Hãy cùng tìm hiểu kỹ hơn về entities_text(). Lưu ý những bình luận mới đã được chèn.

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. Hãy tích hợp chúng

Hãy cùng nhắc lại những gì bạn đang xây dựng.

e6a57e5def315116.jpeg

Bây giờ, hãy cùng nhau tổng hợp mọi thứ. Tạo tệp solution.py; sao chép và dán detect_labels_uri(), transcribe_gcs(), translate_text()entities_text() từ các bước trước vào solution.py.

Câu lệnh nhập

Xoá dấu nhận xét và di chuyển các câu lệnh nhập lên trên cùng. Xin lưu ý rằng cả speech.typeslanguage.types đều đang được nhập. Điều này sẽ gây ra xung đột, vì vậy, hãy xoá chúng và thay đổi từng lần xuất hiện riêng lẻ của types trong transcribe_gcs()entities_text() thành speech.typeslanguage.types tương ứng. Bạn sẽ còn lại:

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

Trả về kết quả

Thay vì in, hãy để các hàm trả về kết quả. Bạn sẽ thấy nội dung tương tự như sau:

# 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

Sử dụng các hàm

Sau tất cả những nỗ lực đó, bạn có thể gọi các hàm này. Hãy làm đi! Ví dụ:

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

Hỗ trợ nhiều ngôn ngữ

Trước đây, chúng ta đã mã hoá cứng tiếng Thổ Nhĩ Kỳ vào transcribe_gcs(). Hãy thay đổi để có thể chỉ định ngôn ngữ từ compare_audio_to_image(). Sau đây là những thay đổi bắt buộc:

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)

Thử nào

Bạn có thể tìm thấy mã cuối cùng trong solution.py của kho lưu trữ GitHub này. Sau đây là lệnh curl để lấy thông tin đó:

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

Phiên bản trên GitHub có chứa argparse, cho phép thực hiện những thao tác sau qua dòng lệnh:

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

Đối với mỗi mục tìm thấy, mã sẽ xuất ra "The audio and image both contain: " (Cả âm thanh và hình ảnh đều chứa:). Trong ví dụ trên, mã sẽ xuất ra "The audio and image both contain: ball" (Cả âm thanh và hình ảnh đều chứa: quả bóng).

Bật mí thêm cho bạn: thử nhiều cách khác

Sau đây là một số vị trí khác của tệp âm thanh và hình ảnh mà bạn có thể thử.

Các mẫu lời nói bằng tiếng Thổ Nhĩ Kỳ: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

Mẫu lời nói bằng tiếng Đức: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

Mẫu hình ảnh: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. Xin chúc mừng!

Bạn đã khám phá và tích hợp 4 API học máy để xác định xem một mẫu lời nói có nói về hình ảnh được cung cấp hay không. Đây chỉ mới là bước khởi đầu vì còn nhiều cách khác để cải thiện quy trình này!

Nội dung đã đề cập

  • Đưa ra yêu cầu cho Cloud Vision API
  • Đưa ra yêu cầu cho Cloud Speech-to-Text API
  • Đưa ra yêu cầu cho Cloud Translation API
  • Đưa ra yêu cầu cho Cloud Natural Language API
  • Sử dụng tất cả các API trên cùng nhau

Bước tiếp theo