Google Cloud Translation v3 übersetzt Text zwischen mehr als hundert Sprachen und kann für Sie die Sprache eines Textstücks erkennen. Der Dienst wird über gRPC bereitgestellt, und sgcWebSockets Enterprise liefert einen typisierten Translation-gRPC-Client auf Basis von TsgcGRPCClient. Statt Protocol Buffers von Hand zusammenzustellen, füllen Sie ein Request-Objekt, rufen eine Methode auf und lesen den übersetzten Text direkt aus einer typisierten Response. Dieser Beitrag erklärt, wie es funktioniert, und zeigt den tatsächlichen Delphi-Code aus dem mitgelieferten Demo.
Wie es funktioniert
gRPC sind Protocol Buffers, die über HTTP/2 gerahmt werden, daher sitzt der Translation-Client auf dem HTTP/2-Stack von sgcWebSockets. Sie erstellen einen TsgcHTTP2Client, der auf translate.googleapis.com an Port 443 mit TLS verweist, weisen ihn einem TsgcGRPCClient zu, und die gRPC-Komponente übernimmt das Nachrichten-Framing, die Header und die Stream-Verarbeitung für Sie.
Die Translation-Unit sgcGRPC_Google_Translation ergänzt die typisierten Nachrichtenklassen, die die v3-API widerspiegeln: TsgcGRPCTranslationTranslateTextRequest und ...TranslateTextResponse für die Übersetzung, das DetectLanguage-Paar für die Spracherkennung und das GetSupportedLanguages-Paar zum Auflisten von Sprachen. Jeder Request stellt eine ToBytes-Methode bereit, die ihn zu Protobuf serialisiert, und jede Response stellt eine LoadFromBytes-Methode bereit, die die Antwort parst. Sie übergeben diese Bytes der Call-Methode des gRPC-Clients und lesen das Ergebnis zurück.
Authentifizierung
Cloud Translation erfordert ein Google-Dienstkonto-Token. Das Demo authentifiziert sich mit einem Dienstkonto-JSON-Schlüssel (Client-E-Mail, Private-Key-ID, Private Key und Projekt-ID) und bezieht ein Bearer-Token, das dann als gRPC-Metadaten hinzugefügt wird, sodass es bei jedem Aufruf mitgesendet wird.
GetGRPCClient.DefaultMetadata.Clear;
GetGRPCClient.DefaultMetadata.Add('authorization', 'Bearer ' + FToken);
Ein erwähnenswertes Detail: ein selbstsigniertes Dienstkonto-JWT ist audience-gebunden, das Token muss also auf den Translation-Endpunkt ausgerichtet sein, um von translate.googleapis.com akzeptiert zu werden. Das Demo setzt JWT.API_Endpoint auf https://translate.googleapis.com/, bevor es das Token anfordert.
Den Client einrichten
Der HTTP/2-Transport und der gRPC-Client werden einmal miteinander verdrahtet. Der Translation-Dienst erwartet Protobuf auf der Leitung, daher ist der Channel-Content-Type 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;
Text übersetzen
Zum Übersetzen füllen Sie einen TsgcGRPCTranslationTranslateTextRequest: setzen Sie den Parent-Ressourcenpfad, fügen Sie eine oder mehrere Zeichenketten zu Contents hinzu, setzen Sie die Quell- und Zielsprachcodes sowie den MIME-Typ. Serialisieren Sie ihn mit ToBytes und übergeben Sie ihn an Call zusammen mit dem voll qualifizierten Dienstnamen und der Methode. Der Parent-Pfad folgt der v3-Form 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;
Die Antwort kommt als TsgcGRPCResponse zurück. Wenn StatusCode gleich grpcOK ist, laden Sie die rohen Data-Bytes in eine typisierte Response und lesen jede Übersetzung. Jede Translation trägt den TranslatedText und, wenn die Quellsprache automatisch erkannt wurde, den 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;
Die Sprache erkennen
Wenn Sie die Quellsprache nicht kennen, lassen Sie die Übersetzung beiseite und rufen DetectLanguage auf. Erstellen Sie einen TsgcGRPCTranslationDetectLanguageRequest mit dem Parent-Pfad und dem zu prüfenden Content und lesen Sie dann die Kandidatensprachen zurück, jede mit einem LanguageCode und einem Confidence-Wert.
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;
Das Parsen der Erkennungs-Response liefert Ihnen den Sprachcode und einen Konfidenzwert für jeden Kandidaten.
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;
Unterstützte Sprachen auflisten
Die dritte Operation, GetSupportedLanguages, gibt jede vom Dienst unterstützte Sprache zurück. Setzen Sie DisplayLanguageCode auf die Sprache, in der Sie die Anzeigenamen haben möchten, und jeder Eintrag kommt mit einem LanguageCode und einem menschenlesbaren DisplayName zurück, samt Flags dafür, ob er als Quelle oder Ziel verwendet werden kann.
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;
Verfügbarkeit
Der Translation-gRPC-Client ist Teil der sgcWebSockets Enterprise Edition und läuft unter Windows, macOS, Linux, iOS und Android, sowohl in Delphi als auch in C++Builder. Ein vollständiges, sofort lauffähiges Beispiel mit Dienstkonto-Ladevorgang und allen drei Operationen befindet sich in Demos\21.GRPC\12.Translation, und der zugrunde liegende gRPC-Client ist auf der gRPC-Client-Produktseite dokumentiert.
Fragen oder Feedback? Nehmen Sie Kontakt auf. Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.
