Integrowanie interfejsów API systemów uczących się

Integrowanie interfejsów API systemów uczących się

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: cze 30, 2021
account_circleAutorzy: Torry Yang

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ć:

e6a57e5def315116.jpeg

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

  • Przeglądarka, na przykład Chrome lub Firefox.
  • Podstawowa znajomość Pythona

2. Konfiguracja i wymagania

Konfiguracja środowiska we własnym tempie

  1. 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ć.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

A1E3C01a38fa61c2.png

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.

  1. 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.

2bfc27ef9ba2ec7d.png

Wybierz w menu Interfejsy API i usługi i kliknij Panel.

A9546a22581facd5.png

Kliknij Włącz interfejsy API i usługi.

eae7ff043d13a35.png

Następnie w polu wyszukiwania wpisz "vision". Kliknij Google Cloud Vision API:

a47893f36372ae2f.png

Kliknij Włącz, aby włączyć interfejs Cloud Vision API:

A24fd082a22030ad.png

Zaczekaj kilka sekund, aż funkcja zostanie włączona. Po włączeniu tej funkcji zobaczysz to:

633e58cbde1b74c6.png

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" Zrzut ekranu 2015-06-08 o 17:30.32 PM.pngw prawym górnym rogu paska nagłówka

24ef50000ca737a4.png

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” B885bf07bc1b02e5.png w prawym górnym rogu paska Cloud Shell.

de00be9278baf7b8.png

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&#39”, 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.

e6a57e5def315116.jpeg

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 „&quot”. Dźwięk i obraz zawierają „&quot”. 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