Google Cloud Translation przez gRPC w Delphi

· Komponenty

Google Cloud Translation v3 tłumaczy tekst pomiędzy ponad stu językami i potrafi wykryć za Ciebie język danego fragmentu tekstu. Usługa jest udostępniona przez gRPC, a sgcWebSockets Enterprise dostarcza typowanego klienta gRPC Translation zbudowanego na TsgcGRPCClient. Zamiast ręcznie składać Protocol Buffers, wypełniasz obiekt żądania, wywołujesz jedną metodę i odczytujesz przetłumaczony tekst bezpośrednio z typowanej odpowiedzi. Ten wpis przeprowadza przez to, jak to działa, i pokazuje rzeczywisty kod Delphi z dołączonego demo.

Jak to działa

gRPC to Protocol Buffers opakowane w HTTP/2, więc klient Translation działa na stosie HTTP/2 sgcWebSockets. Tworzysz TsgcHTTP2Client wskazujący na translate.googleapis.com na porcie 443 z TLS, przypisujesz go do TsgcGRPCClient, a komponent gRPC wykonuje za Ciebie opakowywanie komunikatów, nagłówki i obsługę strumieni.

Moduł Translation sgcGRPC_Google_Translation dodaje typowane klasy komunikatów, które odzwierciedlają API v3: TsgcGRPCTranslationTranslateTextRequest i ...TranslateTextResponse do tłumaczenia, parę DetectLanguage do wykrywania języka oraz parę GetSupportedLanguages do wyświetlania języków. Każde żądanie udostępnia metodę ToBytes, która serializuje je do protobuf, a każda odpowiedź udostępnia metodę LoadFromBytes, która parsuje odpowiedź. Przekazujesz te bajty do metody Call klienta gRPC i odczytujesz wynik z powrotem.

Uwierzytelnianie

Cloud Translation wymaga tokenu konta usługi Google. Demo uwierzytelnia się za pomocą klucza JSON konta usługi (adres e-mail klienta, identyfikator klucza prywatnego, klucz prywatny i identyfikator projektu) i uzyskuje token Bearer, który jest następnie dodawany jako metadane gRPC, aby towarzyszył każdemu wywołaniu.

GetGRPCClient.DefaultMetadata.Clear;
GetGRPCClient.DefaultMetadata.Add('authorization', 'Bearer ' + FToken);

Jeden szczegół warty odnotowania: samodzielnie podpisany JWT konta usługi jest powiązany z odbiorcą, więc token musi być skierowany na punkt końcowy Translation, aby został zaakceptowany przez translate.googleapis.com. Demo ustawia JWT.API_Endpoint na https://translate.googleapis.com/ przed zażądaniem tokenu.

Konfigurowanie klienta

Transport HTTP/2 i klient gRPC są łączone raz. Usługa Translation oczekuje protobuf na łączu, więc typem zawartości kanału jest grpcProto.

uses
  sgcHTTP2_Client, sgcGRPC_Types, sgcGRPC_Client,
  sgcGRPC_Google_Translation;

FHTTP2Client := TsgcHTTP2Client.Create(nil);
FHTTP2Client.Host := 'translate.googleapis.com';
FHTTP2Client.Port := 443;
FHTTP2Client.TLS  := True;

FGRPCClient := TsgcGRPCClient.Create(nil);
FGRPCClient.Client := FHTTP2Client;
FGRPCClient.ChannelOptions.ContentType  := grpcProto;
FGRPCClient.ChannelOptions.Compression  := grpcNoCompression;

Tłumaczenie tekstu

Aby przetłumaczyć, wypełnij TsgcGRPCTranslationTranslateTextRequest: ustaw ścieżkę zasobu Parent, dodaj jeden lub więcej łańcuchów do Contents, ustaw kody języka źródłowego i docelowego oraz typ MIME. Zserializuj to za pomocą ToBytes i przekaż do Call z w pełni kwalifikowaną nazwą usługi i metody. Ścieżka nadrzędna ma postać v3 projects/<project-id>/locations/global.

var
  oRequest: TsgcGRPCTranslationTranslateTextRequest;
  oResponse: TsgcGRPCResponse;
begin
  oRequest := TsgcGRPCTranslationTranslateTextRequest.Create;
  try
    oRequest.Parent := 'projects/' + txtProjectId.Text + '/locations/global';
    oRequest.Contents.Add(txtSourceText.Text);
    oRequest.SourceLanguageCode := txtSourceLang.Text;   // e.g. 'en'
    oRequest.TargetLanguageCode := txtTargetLang.Text;   // e.g. 'es'
    oRequest.MimeType := 'text/plain';

    oResponse := GetGRPCClient.Call
      ('google.cloud.translation.v3.TranslationService', 'TranslateText',
      oRequest.ToBytes);
  finally
    oRequest.Free;
  end;
end;

Odpowiedź wraca jako TsgcGRPCResponse. Gdy StatusCode ma wartość grpcOK, wczytaj surowe bajty Data do typowanej odpowiedzi i odczytaj każde tłumaczenie. Każde Translation zawiera TranslatedText oraz, gdy język źródłowy został automatycznie wykryty, DetectedLanguageCode.

var
  oResponse: TsgcGRPCTranslationTranslateTextResponse;
  i: Integer;
begin
  oResponse := TsgcGRPCTranslationTranslateTextResponse.Create;
  try
    oResponse.LoadFromBytes(aData);
    for i := 0 to oResponse.TranslationCount - 1 do
    begin
      DoLog('Translated: ' + oResponse.Translation(i).TranslatedText);
      if oResponse.Translation(i).DetectedLanguageCode <> '' then
        DoLog('Detected: ' + oResponse.Translation(i).DetectedLanguageCode);
    end;
  finally
    oResponse.Free;
  end;
end;

Wykrywanie języka

Gdy nie znasz języka źródłowego, odłóż tłumaczenie na bok i wywołaj DetectLanguage. Zbuduj TsgcGRPCTranslationDetectLanguageRequest ze ścieżką nadrzędną i zawartością Content do zbadania, a następnie odczytaj kandydujące języki, każdy z LanguageCode i wartością Confidence.

oRequest := TsgcGRPCTranslationDetectLanguageRequest.Create;
try
  oRequest.Parent := GetParentPath;
  oRequest.Content := txtSourceText.Text;
  oRequest.MimeType := 'text/plain';

  oResponse := GetGRPCClient.Call
    ('google.cloud.translation.v3.TranslationService', 'DetectLanguage',
    oRequest.ToBytes);
finally
  oRequest.Free;
end;

Parsowanie odpowiedzi wykrywania daje Ci kod języka i ocenę pewności dla każdego kandydata.

oResponse := TsgcGRPCTranslationDetectLanguageResponse.Create;
try
  oResponse.LoadFromBytes(aData);
  for i := 0 to oResponse.LanguageCount - 1 do
    DoLog('Language: ' + oResponse.Language(i).LanguageCode +
      ' (confidence: ' + FloatToStr(oResponse.Language(i).Confidence) + ')');
finally
  oResponse.Free;
end;

Wyświetlanie obsługiwanych języków

Trzecia operacja, GetSupportedLanguages, zwraca każdy język obsługiwany przez usługę. Ustaw DisplayLanguageCode na język, w którym chcesz otrzymać nazwy wyświetlane, a każdy wpis wraca z LanguageCode oraz czytelną dla człowieka DisplayName, wraz z flagami określającymi, czy może być używany jako źródłowy lub docelowy.

oRequest := TsgcGRPCTranslationGetSupportedLanguagesRequest.Create;
try
  oRequest.Parent := GetParentPath;
  oRequest.DisplayLanguageCode := 'en';

  oResponse := GetGRPCClient.Call
    ('google.cloud.translation.v3.TranslationService',
    'GetSupportedLanguages', oRequest.ToBytes);
finally
  oRequest.Free;
end;

Dostępność

Klient gRPC Translation jest częścią edycji Enterprise sgcWebSockets i działa na Windows, macOS, Linux, iOS oraz Android, w Delphi i C++Builder. Kompletny, gotowy do uruchomienia przykład z wczytywaniem konta usługi i wszystkimi trzema operacjami znajduje się w Demos\21.GRPC\12.Translation, a bazowy klient gRPC jest udokumentowany na stronie produktu gRPC Client.

Pytania lub uwagi? Skontaktuj się z nami. Otrzymasz odpowiedź od osób, które napisały ten kod.