Google Cloud Speech-to-Text via gRPC dans Delphi

· Composants

Speech-to-Text transforme l'audio parlé en texte écrit. Google Cloud l'expose sous forme de service gRPC, et sgcWebSockets Enterprise fournit un client Speech typé bâti sur le TsgcGRPCClient générique, ce qui vous permet de transcrire l'audio directement depuis Delphi et C++Builder. Vous assemblez une requête de reconnaissance avec quelques propriétés, l'envoyez via gRPC, et lisez la transcription en retour, sans runtime externe ni protobufs écrits à la main.

Comment ça fonctionne

gRPC, ce sont des messages Protocol Buffers encadrés sur HTTP/2, donc le client Speech utilise le même transport que le reste de la bibliothèque. Un TsgcHTTP2Client ouvre une connexion TLS vers speech.googleapis.com:443, un TsgcGRPCClient gère l'encadrement gRPC et les trailers par-dessus, et les messages Speech typés dans sgcGRPC_Google_Speech sérialisent et analysent la requête et la réponse à votre place.

Les API Google Cloud sont authentifiées. Vous vous authentifiez avec un compte de service, en échangeant sa clé JSON contre un jeton bearer de courte durée, et envoyez ce jeton en tant que métadonnées gRPC sur chaque appel. La requête elle-même est un RecognitionConfig (langue, encodage, taux d'échantillonnage) plus l'audio, soit des octets en ligne, soit un URI Cloud Storage. Le service répond avec un ou plusieurs résultats, chacun contenant des alternatives de transcription classées avec un score de confiance.

S'authentifier avec un compte de service

Le client Google Cloud transforme une clé JSON de compte de service en un jeton bearer. Chargez la clé, définissez les propriétés JWT, et liez l'audience à l'endpoint Speech afin que le jeton auto-signé soit accepté. Une fois le jeton arrivé, ajoutez-le au DefaultMetadata du client gRPC en tant qu'en-tête authorization, qui voyage ensuite sur chaque appel.

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);

Connecter le client gRPC

Le canal est une connexion HTTP/2. Pointez un TsgcHTTP2Client vers l'hôte Speech avec TLS activé, affectez-le à la propriété Client du composant gRPC, et sélectionnez le type de contenu transmis. Le service Speech parle Protocol Buffers, donc utilisez grpcProto sans compression.

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;

Reconnaître l'audio et lire la transcription

Pour transcrire, construisez un TsgcGRPCSpeechRecognizeRequest. Renseignez le Config avec le code de langue, l'encodage et le taux d'échantillonnage, pointez Audio.Uri vers un objet Cloud Storage (ou définissez Audio.Content avec des octets en ligne), et appelez Recognize sur le service google.cloud.speech.v1.Speech. La requête se sérialise avec ToBytes, et la réponse s'analyse dans une réponse typée que vous pouvez parcourir pour les résultats et les alternatives.

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;

Configuration de reconnaissance

L'objet Config de la requête correspond directement au message RecognitionConfig de Google. Au-delà de la langue et du taux d'échantillonnage, vous pouvez définir MaxAlternatives pour demander des variantes classées, ProfanityFilter pour masquer les mots offensants, AudioChannelCount pour l'audio multicanal, EnableAutomaticPunctuation pour une sortie lisible, et Model pour choisir un modèle de reconnaissance affiné. Chaque propriété est optionnelle et n'est émise sur le fil que lorsqu'elle est définie, donc vous n'envoyez que ce dont vous avez besoin.

Audio en ligne ou URI Cloud Storage

Les courts extraits peuvent voyager à l'intérieur de la requête : affectez les octets audio bruts à Audio.Content et le client les intègre dans le protobuf. Pour les fichiers plus longs, téléversez l'audio dans un bucket et définissez plutôt Audio.Uri sur un chemin gs://, ce qui garde la requête légère et laisse Google lire l'objet directement. Les deux sont mutuellement exclusifs, vous définissez l'un ou l'autre sur une requête donnée.

Résultats et alternatives

Une réponse est une liste de résultats, un par segment d'audio reconnu. Chaque résultat porte une ou plusieurs alternatives classées par vraisemblance, avec la transcription la plus probable en premier et un score de Confidence entre 0 et 1. Parcourez ResultCount et AlternativeCount pour les lire tous, ou prenez simplement la première alternative du premier résultat pour la meilleure estimation. Les assistants typés effectuent l'analyse protobuf, donc vous travaillez avec de simples chaînes et flottants Delphi.

Disponibilité

Le client gRPC Speech-to-Text typé fait partie de l'édition Enterprise de sgcWebSockets et fonctionne sous Windows, macOS, Linux, iOS et Android. Un exemple prêt à l'emploi, celui sur lequel cet article est basé, se trouve dans Demos\21.GRPC\11.Speech_to_Text, et la référence complète est sur la page produit du client gRPC.

Des questions ou des commentaires ? Contactez-nous. Vous recevrez une réponse des personnes qui ont écrit le code.