Speech-to-Text verwandelt gesprochenes Audio in geschriebenen Text. Google Cloud stellt dies als gRPC-Dienst bereit, und sgcWebSockets Enterprise liefert einen typisierten Speech-Client auf Basis des generischen TsgcGRPCClient, sodass Sie Audio direkt aus Delphi und C++Builder transkribieren können. Sie stellen einen Erkennungs-Request mit ein paar Eigenschaften zusammen, senden ihn über gRPC und lesen das Transkript zurück, ohne externe Laufzeitumgebung oder handgeschriebene Protobufs.
Wie es funktioniert
gRPC sind Protocol-Buffers-Nachrichten, die über HTTP/2 gerahmt werden, daher läuft der Speech-Client über denselben Transport wie der Rest der Bibliothek. Ein TsgcHTTP2Client öffnet eine TLS-Verbindung zu speech.googleapis.com:443, ein TsgcGRPCClient übernimmt darauf das gRPC-Framing und die Trailer, und die typisierten Speech-Nachrichten in sgcGRPC_Google_Speech serialisieren und parsen Request und Response für Sie.
Google-Cloud-APIs sind authentifiziert. Sie authentifizieren sich mit einem Dienstkonto, tauschen dessen JSON-Schlüssel gegen ein kurzlebiges Bearer-Token und senden dieses Token als gRPC-Metadaten bei jedem Aufruf. Der Request selbst ist eine RecognitionConfig (Sprache, Kodierung, Abtastrate) plus das Audio, entweder als Inline-Bytes oder als Cloud-Storage-URI. Der Dienst antwortet mit einem oder mehreren Ergebnissen, von denen jedes nach Wahrscheinlichkeit geordnete Transkript-Alternativen mit einem Konfidenzwert enthält.
Authentifizierung mit einem Dienstkonto
Der Google-Cloud-Client verwandelt einen Dienstkonto-JSON-Schlüssel in ein Bearer-Token. Laden Sie den Schlüssel, setzen Sie die JWT-Eigenschaften und binden Sie die Audience an den Speech-Endpunkt, damit das selbstsignierte Token akzeptiert wird. Sobald das Token eintrifft, fügen Sie es den DefaultMetadata des gRPC-Clients als authorization-Header hinzu, der dann bei jedem Aufruf mitgesendet wird.
uses
sgcHTTP2_Client, sgcGRPC_Client, sgcGRPC_Types,
sgcHTTP_Google_Cloud, sgcGRPC_Google_Speech;
// service-account JWT authentication
Cloud.GoogleCloudOptions.Authentication := gcaJWT;
Cloud.GoogleCloudOptions.JWT.ClientEmail := ClientEmail;
Cloud.GoogleCloudOptions.JWT.PrivateKeyId := PrivateKeyId;
Cloud.GoogleCloudOptions.JWT.PrivateKey.Text := PrivateKey;
Cloud.GoogleCloudOptions.JWT.ProjectId := ProjectId;
// self-signed service-account JWT is audience-bound to the Speech endpoint
Cloud.GoogleCloudOptions.JWT.API_Endpoint := 'https://speech.googleapis.com/';
// once the token is acquired, send it on every gRPC call
GRPC.DefaultMetadata.Clear;
GRPC.DefaultMetadata.Add('authorization', 'Bearer ' + Token);
Den gRPC-Client verbinden
Der Channel ist eine HTTP/2-Verbindung. Richten Sie einen TsgcHTTP2Client mit aktiviertem TLS auf den Speech-Host, weisen Sie ihn der Client-Eigenschaft der gRPC-Komponente zu und wählen Sie den Wire-Content-Type. Der Speech-Dienst spricht Protocol Buffers, verwenden Sie also grpcProto ohne Komprimierung.
HTTP2 := TsgcHTTP2Client.Create(nil);
HTTP2.Host := 'speech.googleapis.com';
HTTP2.Port := 443;
HTTP2.TLS := True;
GRPC := TsgcGRPCClient.Create(nil);
GRPC.Client := HTTP2;
GRPC.ChannelOptions.ContentType := grpcProto;
GRPC.ChannelOptions.Compression := grpcNoCompression;
HTTP2.Active := True;
Audio erkennen und das Transkript auslesen
Zum Transkribieren erstellen Sie einen TsgcGRPCSpeechRecognizeRequest. Füllen Sie die Config mit Sprachcode, Kodierung und Abtastrate, verweisen Sie Audio.Uri auf ein Cloud-Storage-Objekt (oder setzen Sie Audio.Content mit Inline-Bytes) und rufen Sie Recognize des Dienstes google.cloud.speech.v1.Speech auf. Der Request serialisiert sich selbst mit ToBytes, und die Antwort wird in eine typisierte Response geparst, die Sie nach Ergebnissen und Alternativen durchlaufen können.
var
oRequest: TsgcGRPCSpeechRecognizeRequest;
oResponse: TsgcGRPCResponse;
oSpeech: TsgcGRPCSpeechRecognizeResponse;
oResult: TsgcGRPCSpeechRecognitionResult;
oAlt: TsgcGRPCSpeechRecognitionAlternative;
i, j: Integer;
begin
oRequest := TsgcGRPCSpeechRecognizeRequest.Create;
try
oRequest.Config.Encoding := 0; // 0 = ENCODING_UNSPECIFIED, let the API detect
oRequest.Config.SampleRateHertz := 16000;
oRequest.Config.LanguageCode := 'en-US';
oRequest.Config.EnableAutomaticPunctuation := True;
oRequest.Audio.Uri := 'gs://my-bucket/audio.flac';
oResponse := GRPC.Call('google.cloud.speech.v1.Speech', 'Recognize',
oRequest.ToBytes);
finally
oRequest.Free;
end;
if oResponse.StatusCode <> grpcOK then
begin
ShowMessage('gRPC error: ' + oResponse.StatusMessage);
Exit;
end;
oSpeech := TsgcGRPCSpeechRecognizeResponse.Create;
try
oSpeech.LoadFromBytes(oResponse.Data);
for i := 0 to oSpeech.ResultCount - 1 do
begin
oResult := oSpeech.ResultItem(i);
for j := 0 to oResult.AlternativeCount - 1 do
begin
oAlt := oResult.Alternative(j);
Memo1.Lines.Add('Transcript: ' + oAlt.Transcript);
Memo1.Lines.Add('Confidence: ' + FloatToStr(oAlt.Confidence));
end;
end;
finally
oSpeech.Free;
end;
end;
Erkennungskonfiguration
Das Config-Objekt im Request entspricht direkt der RecognitionConfig-Nachricht von Google. Über Sprache und Abtastrate hinaus können Sie MaxAlternatives setzen, um nach geordneten Varianten zu fragen, ProfanityFilter, um anstößige Wörter zu maskieren, AudioChannelCount für Mehrkanal-Audio, EnableAutomaticPunctuation für lesbare Ausgabe und Model, um ein abgestimmtes Erkennungsmodell zu wählen. Jede Eigenschaft ist optional und wird nur dann auf die Leitung gesendet, wenn sie gesetzt ist, sodass Sie genau das senden, was Sie benötigen.
Inline-Audio oder ein Cloud-Storage-URI
Kurze Clips können innerhalb des Requests reisen: Weisen Sie die rohen Audio-Bytes Audio.Content zu, und der Client bettet sie in das Protobuf ein. Bei längeren Dateien laden Sie das Audio in einen Bucket hoch und setzen stattdessen Audio.Uri auf einen gs://-Pfad, was den Request klein hält und es Google ermöglicht, das Objekt direkt zu lesen. Die beiden schließen sich gegenseitig aus, Sie setzen in einem gegebenen Request das eine oder das andere.
Ergebnisse und Alternativen
Eine Response ist eine Liste von Ergebnissen, eines pro erkanntem Audiosegment. Jedes Ergebnis trägt eine oder mehrere nach Wahrscheinlichkeit geordnete Alternativen, mit dem wahrscheinlichsten Transkript zuerst und einem Confidence-Wert zwischen 0 und 1. Durchlaufen Sie ResultCount und AlternativeCount, um sie alle zu lesen, oder nehmen Sie einfach die erste Alternative des ersten Ergebnisses für die beste Schätzung. Die typisierten Helfer übernehmen das Protobuf-Parsing, sodass Sie mit einfachen Delphi-Strings und -Floats arbeiten.
Verfügbarkeit
Der typisierte Speech-to-Text-gRPC-Client ist Teil der sgcWebSockets Enterprise Edition und läuft unter Windows, macOS, Linux, iOS und Android. Ein sofort lauffähiges Beispiel, dasjenige, auf dem dieser Artikel basiert, befindet sich in Demos\21.GRPC\11.Speech_to_Text, und die vollständige Referenz finden Sie auf der gRPC-Client-Produktseite.
Fragen oder Feedback? Nehmen Sie Kontakt auf. Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.
