Google Cloud Translation su gRPC in Delphi

· Componenti

Google Cloud Translation v3 traduce testo tra più di cento lingue e può rilevare per te la lingua di un brano di testo. Il servizio è esposto su gRPC e sgcWebSockets Enterprise include un client gRPC Translation tipizzato costruito su TsgcGRPCClient. Invece di assemblare a mano i Protocol Buffers, compili un oggetto richiesta, chiami un metodo e leggi il testo tradotto direttamente da una risposta tipizzata. Questo articolo illustra come funziona e mostra il codice Delphi effettivo della demo inclusa.

Come funziona

gRPC è costituito da Protocol Buffers incapsulati su HTTP/2, quindi il client Translation poggia sopra lo stack HTTP/2 di sgcWebSockets. Crei un TsgcHTTP2Client puntato a translate.googleapis.com sulla porta 443 con TLS, lo assegni a un TsgcGRPCClient e il componente gRPC si occupa per te dell'incapsulamento dei messaggi, degli header e della gestione degli stream.

L'unità Translation sgcGRPC_Google_Translation aggiunge le classi di messaggi tipizzate che rispecchiano l'API v3: TsgcGRPCTranslationTranslateTextRequest e ...TranslateTextResponse per la traduzione, la coppia DetectLanguage per il rilevamento della lingua e la coppia GetSupportedLanguages per elencare le lingue. Ogni richiesta espone un metodo ToBytes che la serializza in protobuf e ogni risposta espone un metodo LoadFromBytes che analizza la risposta. Passi quei byte al metodo Call del client gRPC e leggi il risultato di ritorno.

Autenticazione

Cloud Translation richiede un token di account di servizio Google. La demo si autentica con una chiave JSON dell'account di servizio (client email, private key id, private key e project id) e ottiene un token Bearer, che viene poi aggiunto come metadata gRPC in modo che viaggi su ogni chiamata.

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

Un dettaglio degno di nota: un JWT autofirmato dell'account di servizio è vincolato all'audience, quindi il token deve puntare all'endpoint Translation per essere accettato da translate.googleapis.com. La demo imposta JWT.API_Endpoint a https://translate.googleapis.com/ prima di richiedere il token.

Configurare il client

Il trasporto HTTP/2 e il client gRPC vengono cablati insieme una sola volta. Il servizio Translation si aspetta protobuf sul filo, quindi il content type del canale è 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;

Tradurre testo

Per tradurre, compila un TsgcGRPCTranslationTranslateTextRequest: imposta il percorso della risorsa Parent, aggiungi una o più stringhe a Contents, imposta i codici della lingua di origine e di destinazione e il tipo MIME. Serializzalo con ToBytes e passalo a Call con il nome del servizio e del metodo completamente qualificati. Il percorso parent segue la forma 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;

La risposta torna come un TsgcGRPCResponse. Quando StatusCode è grpcOK, carica i byte grezzi di Data in una risposta tipizzata e leggi ogni traduzione. Ogni Translation porta con sé il TranslatedText e, quando la lingua di origine è stata rilevata automaticamente, il 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;

Rilevare la lingua

Quando non conosci la lingua di origine, lascia da parte la traduzione e chiama DetectLanguage. Costruisci un TsgcGRPCTranslationDetectLanguageRequest con il percorso parent e il Content da ispezionare, poi leggi di ritorno le lingue candidate, ognuna con un LanguageCode e un valore di 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;

Analizzare la risposta del rilevamento ti dà il codice lingua e un punteggio di confidenza per ogni candidato.

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;

Elencare le lingue supportate

La terza operazione, GetSupportedLanguages, restituisce ogni lingua supportata dal servizio. Imposta DisplayLanguageCode alla lingua in cui vuoi i nomi visualizzati e ogni voce torna con un LanguageCode e un DisplayName leggibile, insieme ai flag che indicano se può essere usata come origine o destinazione.

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;

Disponibilità

Il client gRPC Translation fa parte dell'edizione Enterprise di sgcWebSockets e gira su Windows, macOS, Linux, iOS e Android, su Delphi e C++Builder. Un esempio completo e pronto all'uso con caricamento dell'account di servizio e tutte e tre le operazioni è in Demos\21.GRPC\12.Translation e il client gRPC sottostante è documentato sulla pagina prodotto gRPC Client.

Domande o feedback? Contattaci. Riceverai una risposta dalle persone che hanno scritto il codice.