Informacje o tym ćwiczeniu (w Codelabs)
1. Opis
W ramach tego ćwiczenia poznasz kilka interfejsów API systemów uczących się. Będziesz używać:
- Cloud Vision – informacje o treści obrazu
- Zamiany mowy na tekst umożliwia transkrypcję dźwięku na tekst.
- Cloud Translation – umożliwia tłumaczenie dowolnego ciągu znaków na dowolny obsługiwany język.
- Cloud Natural Language, aby wyodrębniać informacje z tekstu;
Co stworzysz
Zbuduj potok, który porównuje nagranie dźwiękowe z obrazem i określa ich trafność. Oto zapowiedź, jak to zrobić:
Czego się nauczysz
- Jak korzystać z interfejsów API Vision, Speech-to-Text, Translation i Natural Language
- Gdzie można znaleźć przykłady kodu
Czego potrzebujesz
2. Konfiguracja i wymagania
Konfiguracja środowiska we własnym tempie
- Zaloguj się w Cloud Console i utwórz nowy projekt lub ponownie wykorzystaj istniejący. Jeśli nie masz jeszcze konta Gmail lub Google Workspace, musisz je utworzyć.
Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID
.
- Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.
Ukończenie tych ćwiczeń z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie i usuwanie zasobów”, by dowiedzieć się, jak wyłączyć zasoby, aby uniknąć naliczania opłat poza tym samouczkiem. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego w wysokości 300 USD.
Włączanie interfejsów API
Możesz kliknąć ten link, aby włączyć wszystkie wymagane interfejsy API. Gdy to zrobisz, możesz zignorować instrukcje konfigurowania uwierzytelniania. Zajmiemy się tym za chwilę. Możesz też włączyć każdy interfejs API pojedynczo. Aby to zrobić, kliknij ikonę menu w lewym górnym rogu ekranu.
Wybierz w menu Interfejsy API i usługi i kliknij Panel.
Kliknij Włącz interfejsy API i usługi.
Następnie w polu wyszukiwania wpisz "vision". Kliknij Google Cloud Vision API:
Kliknij Włącz, aby włączyć interfejs Cloud Vision API:
Zaczekaj kilka sekund, aż funkcja zostanie włączona. Po włączeniu tej funkcji zobaczysz to:
Powtórz ten sam proces, aby włączyć interfejsy Cloud Speech, Cloud Translation i Cloud Natural Language.
Cloud Shell
Google Cloud Shell to środowisko wiersza poleceń działające w chmurze. Ta maszyna wirtualna oparta na Debianie jest wyposażona we wszystkie potrzebne narzędzia dla programistów (gcloud
, bq
, git
i inne) i oferuje trwały katalog domowy o pojemności 5 GB. Wykorzystamy Cloud Shell do utworzenia żądania do interfejsów API systemów uczących się.
Aby rozpocząć korzystanie z Cloud Shell, kliknij ikonę "Aktywuj Google Cloud Shell" w prawym górnym rogu paska nagłówka
Sesja Cloud Shell otworzy się w nowej ramce u dołu konsoli, zostanie również wyświetlony monit wiersza poleceń. Poczekaj, aż pojawi się monit user@project:~$.
Opcjonalnie: edytor kodu
W zależności od tego, jak dobrze znasz wiersz poleceń, możesz kliknąć ikonę „Uruchom kod edytora” w prawym górnym rogu paska Cloud Shell.
Konto usługi
Aby się uwierzytelnić, musisz mieć konto usługi. Aby je utworzyć, zastąp [NAME] wybraną nazwą konta usługi i uruchom w Cloud Shell to polecenie:
gcloud iam service-accounts create [NAME]
Aby móc korzystać z tego konta usługi, musisz teraz wygenerować klucz. Zastąp [FILE_NAME] odpowiednią nazwą klucza, [NAME] nazwą konta usługi z powyżej i [PROJECT_ID] identyfikatorem projektu. To polecenie spowoduje utworzenie i pobranie klucza jako pliku [FILE_NAME].json:
gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com
Aby korzystać z konta usługi, musisz ustawić zmienną GOOGLE_APPLICATION_CREDENTIALS na ścieżkę do klucza. Aby to zrobić, uruchom następujące polecenie po zastąpieniu pól [PATH_TO_FILE] i [FILE_NAME]:
export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_FILE]/[FILE_NAME].json
3. Cloud Vision
Klient Pythona
Musisz mieć klienta w Pythonie dla Cloud Vision. Aby zainstalować, wpisz w Cloud Shell:
pip install --upgrade google-cloud-vision --user
Wypróbuj
Przyjrzyjmy się przykładom kodu dla interfejsu Cloud Vision API. Chcemy dowiedzieć się, co zawiera konkretny obraz. Program detect.py
wydaje się przydatny, więc zróbmy to. Możesz na przykład skopiować zawartość wykrywania.py, utworzyć w Cloud Shell nowy plik o nazwie vision.py
i wkleić cały kod do vision.py
. Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/vision/cloud-client/detect/detect.py -o vision.py
Gdy to zrobisz, możesz użyć interfejsu API, wykonując te polecenia w Cloud Shell:
python vision.py labels-uri gs://cloud-samples-data/ml-api-codelab/birds.jpg
Dane wyjściowe dotyczące ptaków i strusi powinny być widoczne, ponieważ przeanalizowaliśmy obraz pod adresem: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg
Co jest nie tak?
2 argumenty zostały przekazane do funkcji vision.py
:
- labels-uri wybiera funkcję
detect_labels_uri()
, którą chcesz uruchomić; - gs://cloud-samples-data/ml-api-codelab/birds.jpg to lokalizacja obrazu w Google Cloud Storage i przekazywana jako uri do
detect_labels_uri()
.
Przyjrzyjmy się temu dokładniej: detect_labels_uri()
. Zwróć uwagę na dodatkowe wstawione komentarze.
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
Klient Pythona
Aby używać Cloud Speech-to-Text, musisz mieć klienta Pythona. Aby zainstalować, wpisz w Cloud Shell:
sudo pip install --upgrade google-cloud-speech
Wypróbuj
Przejdźmy do przykładów kodu dla Cloud Speech-to-Text. Chcemy utworzyć transkrypcję mowy. transcribe.py
to dobry punkt wyjścia, więc wykorzystajmy to. Skopiuj zawartość transkrypcji.py, utwórz nowy plik w Cloud Shell o nazwie speech2text.py
i wklej cały kod do speech2text.py
. Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/speech/cloud-client/transcribe.py -o speech2text.py
Gdy to zrobisz, możesz użyć interfejsu API, wykonując te polecenia w Cloud Shell:
python speech2text.py gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav
Powinny pojawić się błędy dotyczące nieprawidłowego kodowania i częstotliwości hercowej. Nie przejmuj się. Otwórz transcribe_gcs()
i usuń ustawienia encoding
oraz sampe_hertz_rate
z urządzenia RecognitionConfig()
. Tymczasem zmień kod języka na „tr-TR'”, ponieważ tr-ostrich.wav
to nagranie mowy po turecku.
config = types.RecognitionConfig(language_code='tr-TR')
Teraz uruchom speech2text.py
ponownie. Wyniki powinny być związane z analizą dźwięku: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav
Co się dzieje?
Udało Ci się przekazać gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, lokalizację pliku audio z Google Cloud Storage do speech2text.py
, który następnie jest przekazywany jako gcs_uri do transcribe_uri()
.
Przyjrzyjmy się zmodyfikowanemu elementowi 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
Klient Pythona
Musisz mieć klienta w Pythonie, aby wykonać tłumaczenie z Cloud. Aby zainstalować Cloud Shell, wpisz:
sudo pip install --upgrade google-cloud-translate
Wypróbuj
Teraz zobacz przykłady kodu do usługi Cloud Translation. W ramach tego ćwiczenia chcemy przetłumaczyć tekst na angielski. snippets.py
wygląda na to, co chcemy. Skopiuj zawartość fragment.py, utwórz nowy plik w Cloud Shell o nazwie translate.py
i wklej cały kod do translate.py
. Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/translate/cloud-client/snippets.py -o translate.py
Gdy to zrobisz, możesz użyć interfejsu API, wykonując te polecenia w Cloud Shell:
python translate.py translate-text en '你有沒有帶外套'
Tłumaczenie powinno mieć postać „Kurtka” czy
Co się dzieje?
3 argumenty zostały przekazane do funkcji translate.py
:
- translate-text wybiera funkcję
translate_text()
do uruchomienia - Parametr en jest przekazywany jako parametr target do języka
translate_text()
. Określa on język, na który ma być tłumaczony. - ‘你有沒有帶外套' to ciąg, który ma zostać przetłumaczony. Przekazuje się go jako tekst do
translate_text()
.
Przyjrzyjmy się temu dokładniej: translate_text()
. Zanotuj dodane komentarze.
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
Klient Pythona
Musisz mieć klienta w języku Python. Aby zainstalować, wpisz w Cloud Shell:
sudo pip install --upgrade google-cloud-language
Wypróbuj
Na koniec zobaczmy przykłady kodu interfejsu Cloud Natural Language API. Chcemy wykrywać elementy w tekście. snippets.py
zawiera kod, który może to powodować. Skopiuj zawartość fragment.py, utwórz nowy plik w Cloud Shell o nazwie natural_language.py
i wklej cały kod do natural_language.py
. Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:
curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/language/cloud-client/v1/snippets.py -o natural_language.py
Gdy to zrobisz, możesz użyć interfejsu API, wykonując te polecenia w Cloud Shell:
python natural_language.py entities-text 'where did you leave my bike'
Interfejs API powinien identyfikować element „bike"”. Encje mogą być prawidłowymi rzeczownikami (postaci publiczne, punkty orientacyjne itp.) lub typowymi rzeczami (restauracjami, stadionem itp.).
Co się dzieje?
2 argumenty zostały przekazane do funkcji natural_language.py
:
- enities-text wybiera funkcję
entities_text()
do uruchomienia - „tam, gdzie opuściłeś mój rower'” jest ciągiem, który ma zostać przeanalizowany przez podmioty i jest przekazywany jako tekst do
entities_text()
.
Przyjrzyjmy się temu dokładniej: entities_text()
. Zwróć uwagę na nowe wstawione komentarze.
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. Integracja
Przypomnijmy sobie, co tworzysz.
No to wszystko razem. Utwórz plik solution.py
. Skopiuj i wklej detect_labels_uri()
, transcribe_gcs()
, translate_text()
i entities_text()
z poprzednich kroków do solution.py
.
Importowanie wyciągów
Usuń komentarz i przenieś instrukcje importowania na górę. Importowane są speech.types
i language.types
. Będzie to powodować konflikty, więc usuń je i zmień każde wystąpienie elementu types
w elementach transcribe_gcs()
i entities_text()
na odpowiednio speech.types
i language.types
. Powinno Ci się wyświetlić:
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
Zwracanie wyników
Funkcje drukowania nie powinny zwracać wyników. Twoja strona powinna wyglądać podobnie do tej:
# 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
Korzystanie z funkcji
Kiedy ciężka praca jest trudna, musisz wywołać te funkcje. Śmiało, zrób to! Oto przykład:
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.')
Obsługa wielu języków
Wcześniej zakodowaliśmy na stałe turecki język transcribe_gcs()
. Zmieńmy go, tak aby można było określić język od compare_audio_to_image()
. Wymagane zmiany:
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)
Wypróbuj
Ostateczny kod można znaleźć w solution.py z tego repozytorium GitHub. Aby je pobrać, użyj tego polecenia curl:
curl https://raw.githubusercontent.com/googlecodelabs/integrating-ml-apis/master/solution.py -O
Wersja na GitHubie zawiera argument argparse, który umożliwia dostęp z poziomu wiersza poleceń:
python solution.py tr-TR gs://cloud-samples-data/ml-api-codelab/tr-ball.wav gs://cloud-samples-data/ml-api-codelab/football.jpg
W przypadku każdego znalezionego elementu kod powinien zawierać wynik „"”. Dźwięk i obraz zawierają „"”. W powyższym przykładzie „&” zawiera dźwięk i obraz „ball”.
Bonus: wypróbuj więcej
Oto więcej lokalizacji plików audio i obrazów do wypróbowania.
8. Gratulacje!
Zbadałeś i zintegrowałeś 4 interfejsy API systemów uczących się, aby określić, czy próbka mowy dotyczy podanego obrazu. To dopiero początek, ponieważ istnieje jeszcze wiele innych możliwości ulepszenia tego potoku.
Omawiane zagadnienia
- Wysyłanie żądań do interfejsu Cloud Vision API
- Wysyłanie żądań do interfejsu Cloud Speech-to-Text API
- Wysyłanie żądań do interfejsu Cloud Translation API
- Wysyłanie żądań do interfejsu Cloud Natural Language API
- Korzystanie ze wszystkich powyższych interfejsów API
Następne kroki
- Więcej informacji na temat porównywania słów znajdziesz na word2vec
- Zapoznaj się z bardziej szczegółowymi ćwiczeniami z programowania na stronach Vision API, Speech-to-Text API, Translation API i Natural Language API.
- Spróbuj zastąpić wersję Cloud Vision inteligentną funkcją Cloud Video
- syntezator mowy za pomocą interfejsu Cloud Text-to Speech API,
- Dowiedz się, jak przesyłać obiekty do Cloud Storage.