Google Cloud Translation via gRPC in Delphi

· Componenten

Google Cloud Translation v3 vertaalt tekst tussen meer dan honderd talen en kan de taal van een stuk tekst voor je detecteren. De service wordt aangeboden via gRPC, en sgcWebSockets Enterprise levert een getypeerde Translation gRPC-client gebouwd op TsgcGRPCClient. In plaats van Protocol Buffers met de hand samen te stellen, vul je een request-object, roep je één methode aan, en lees je de vertaalde tekst rechtstreeks uit een getypeerde response. Dit bericht doorloopt hoe het werkt en toont de daadwerkelijke Delphi-code uit de meegeleverde demo.

Hoe het werkt

gRPC bestaat uit Protocol Buffers ingekapseld over HTTP/2, dus de Translation-client draait bovenop de HTTP/2-stack van sgcWebSockets. Je maakt een TsgcHTTP2Client gericht op translate.googleapis.com op poort 443 met TLS, wijst het toe aan een TsgcGRPCClient, en het gRPC-component doet de berichtframing, headers en stream-afhandeling voor je.

De Translation-unit sgcGRPC_Google_Translation voegt de getypeerde berichtklassen toe die de v3-API weerspiegelen: TsgcGRPCTranslationTranslateTextRequest en ...TranslateTextResponse voor vertaling, het DetectLanguage-paar voor taaldetectie, en het GetSupportedLanguages-paar voor het opsommen van talen. Elke request biedt een ToBytes-methode die het serialiseert naar protobuf, en elke response biedt een LoadFromBytes-methode die het antwoord parset. Je geeft die bytes door aan de Call-methode van de gRPC-client en leest het resultaat terug.

Authenticatie

Cloud Translation vereist een Google-service-account-token. De demo authenticeert met een service-account-JSON-sleutel (client email, private key id, private key en project id) en verkrijgt een Bearer-token, dat vervolgens als gRPC-metadata wordt toegevoegd zodat het bij elke call meereist.

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

Eén detail is het vermelden waard: een zelfondertekende service-account-JWT is audience-gebonden, dus het token moet gericht zijn op het Translation-endpoint om door translate.googleapis.com te worden geaccepteerd. De demo stelt JWT.API_Endpoint in op https://translate.googleapis.com/ voordat het token wordt aangevraagd.

De client opzetten

De HTTP/2-transport en de gRPC-client worden eenmalig aan elkaar gekoppeld. De Translation-service verwacht protobuf op de wire, dus het kanaal-contenttype is 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;

Tekst vertalen

Om te vertalen vul je een TsgcGRPCTranslationTranslateTextRequest: stel het Parent-resourcepad in, voeg een of meer strings toe aan Contents, stel de bron- en doeltaalcodes en het MIME-type in. Serialiseer het met ToBytes en geef het door aan Call met de volledig gekwalificeerde servicenaam en methode. Het parent-pad volgt de v3-vorm 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;

Het antwoord komt terug als een TsgcGRPCResponse. Wanneer StatusCode gelijk is aan grpcOK, laad je de ruwe Data-bytes in een getypeerde response en lees je elke vertaling. Elke Translation bevat de TranslatedText en, wanneer de brontaal automatisch is gedetecteerd, de 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;

De taal detecteren

Wanneer je de brontaal niet kent, laat je de vertaling terzijde en roep je DetectLanguage aan. Bouw een TsgcGRPCTranslationDetectLanguageRequest met het parent-pad en de te inspecteren Content, en lees vervolgens de kandidaattalen terug, elk met een LanguageCode en een Confidence-waarde.

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;

Het parsen van de detectie-response geeft je de taalcode en een betrouwbaarheidsscore voor elke kandidaat.

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;

Ondersteunde talen opsommen

De derde bewerking, GetSupportedLanguages, retourneert elke taal die de service ondersteunt. Stel DisplayLanguageCode in op de taal waarin je de weergavenamen wilt, en elke vermelding komt terug met een LanguageCode en een leesbare DisplayName, samen met vlaggen voor of het kan worden gebruikt als bron of doel.

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;

Beschikbaarheid

De Translation gRPC-client maakt deel uit van de sgcWebSockets Enterprise-editie en draait op Windows, macOS, Linux, iOS en Android, op Delphi en C++Builder. Een compleet, kant-en-klaar voorbeeld met het laden van service-accounts en alle drie de bewerkingen staat in Demos\21.GRPC\12.Translation, en de onderliggende gRPC-client is gedocumenteerd op de productpagina van de gRPC Client.

Vragen of feedback? Neem contact op. Je krijgt antwoord van de mensen die de code hebben geschreven.