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 đó:
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ó
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
- Đă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.
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
.
- 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.
Chọn API và dịch vụ trong trình đơn thả xuống rồi nhấp vào Trang tổng quan
Nhấp vào Bật API và dịch vụ.
Sau đó, hãy tìm "thị lực" trong hộp tìm kiếm. Nhấp vào Google Cloud Vision API:
Nhấp vào Bật để bật Cloud Vision API:
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:
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" ở góc trên cùng bên phải của thanh tiêu đề
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ã" ở góc trên cùng bên phải của thanh Cloud Shell
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 encoding
và sampe_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.
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()
và 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.types
và language.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()
và entities_text()
thành speech.types
và language.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ử.
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
- Để so sánh các từ một cách hiệu quả hơn, hãy xem word2vec
- Hãy xem các lớp học lập trình chuyên sâu hơn về Vision API, Speech-to-Text API, Translation API và Natural Language API
- Hãy thử thay thế Cloud Vision bằng Cloud Video Intelligence
- Tổng hợp âm thanh lời nói bằng Cloud Text-to-Speech API
- Tìm hiểu cách tải các đối tượng lên Cloud Storage