Google Cloud Speech-to-Text przez gRPC w Delphi

· Komponenty

Speech-to-Text zamienia mówiony dźwięk w tekst pisany. Google Cloud udostępnia to jako usługę gRPC, a sgcWebSockets Enterprise dostarcza typowanego klienta Speech zbudowanego na ogólnym TsgcGRPCClient, więc możesz transkrybować dźwięk bezpośrednio z Delphi i C++Builder. Składasz żądanie rozpoznawania z kilku właściwości, wysyłasz je przez gRPC i odczytujesz transkrypcję z powrotem, bez potrzeby zewnętrznego środowiska uruchomieniowego ani ręcznie pisanych protobufów.

Jak to działa

gRPC to komunikaty Protocol Buffers opakowane w HTTP/2, więc klient Speech korzysta z tego samego transportu co reszta biblioteki. TsgcHTTP2Client otwiera połączenie TLS do speech.googleapis.com:443, TsgcGRPCClient obsługuje na jego podstawie opakowywanie gRPC i trailery, a typowane komunikaty Speech w sgcGRPC_Google_Speech serializują i parsują za Ciebie żądanie oraz odpowiedź.

API Google Cloud są uwierzytelniane. Uwierzytelniasz się za pomocą konta usługi, wymieniając jego klucz JSON na krótko żyjący token bearer i wysyłając ten token jako metadane gRPC przy każdym wywołaniu. Samo żądanie to RecognitionConfig (język, kodowanie, częstotliwość próbkowania) plus dźwięk, w postaci bajtów osadzonych w treści lub identyfikatora URI Cloud Storage. Usługa odpowiada jednym lub więcej wynikiem, z których każdy zawiera uszeregowane warianty transkrypcji z oceną pewności.

Uwierzytelnianie za pomocą konta usługi

Klient Google Cloud zamienia klucz JSON konta usługi na token bearer. Wczytaj klucz, ustaw właściwości JWT i powiąż odbiorcę z punktem końcowym Speech, aby samodzielnie podpisany token został zaakceptowany. Gdy token nadejdzie, dodaj go do DefaultMetadata klienta gRPC jako nagłówek authorization, który następnie towarzyszy każdemu wywołaniu.

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

Łączenie klienta gRPC

Kanał to połączenie HTTP/2. Wskaż TsgcHTTP2Client na host Speech z włączonym TLS, przypisz go do właściwości Client komponentu gRPC i wybierz typ zawartości przesyłanej. Usługa Speech mówi w Protocol Buffers, więc użyj grpcProto bez kompresji.

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;

Rozpoznawanie dźwięku i odczyt transkrypcji

Aby transkrybować, zbuduj TsgcGRPCSpeechRecognizeRequest. Wypełnij Config kodem języka, kodowaniem i częstotliwością próbkowania, wskaż Audio.Uri na obiekt Cloud Storage (lub ustaw Audio.Content z bajtami osadzonymi w treści) i wywołaj Recognize na usłudze google.cloud.speech.v1.Speech. Żądanie serializuje się samo za pomocą ToBytes, a odpowiedź parsuje z powrotem do typowanej odpowiedzi, którą możesz przejść w poszukiwaniu wyników i wariantów.

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;

Konfiguracja rozpoznawania

Obiekt Config w żądaniu mapuje się bezpośrednio na komunikat RecognitionConfig firmy Google. Poza językiem i częstotliwością próbkowania możesz ustawić MaxAlternatives, aby poprosić o uszeregowane warianty, ProfanityFilter, aby maskować obraźliwe słowa, AudioChannelCount dla dźwięku wielokanałowego, EnableAutomaticPunctuation dla czytelnego wyniku oraz Model, aby wybrać dostrojony model rozpoznawania. Każda właściwość jest opcjonalna i wysyłana tylko wtedy, gdy jest ustawiona, więc wysyłasz dokładnie to, czego potrzebujesz.

Dźwięk osadzony w treści lub identyfikator URI Cloud Storage

Krótkie nagrania mogą podróżować wewnątrz żądania: przypisz surowe bajty dźwięku do Audio.Content, a klient osadzi je w protobuf. W przypadku dłuższych plików prześlij dźwięk do zasobnika i zamiast tego ustaw Audio.Uri na ścieżkę gs://, co utrzymuje żądanie małym i pozwala Google odczytać obiekt bezpośrednio. Te dwie opcje wzajemnie się wykluczają, ustawiasz jedną albo drugą w danym żądaniu.

Wyniki i warianty

Odpowiedź to lista wyników, po jednym na rozpoznany segment dźwięku. Każdy wynik zawiera jeden lub więcej wariantów uporządkowanych według prawdopodobieństwa, z najbardziej prawdopodobną transkrypcją na początku i oceną Confidence pomiędzy 0 a 1. Iteruj po ResultCount i AlternativeCount, aby odczytać je wszystkie, albo po prostu weź pierwszy wariant pierwszego wyniku jako najlepsze przybliżenie. Typowane funkcje pomocnicze wykonują parsowanie protobuf, więc pracujesz ze zwykłymi łańcuchami i liczbami zmiennoprzecinkowymi Delphi.

Dostępność

Typowany klient gRPC Speech-to-Text jest częścią edycji Enterprise sgcWebSockets i działa na Windows, macOS, Linux, iOS oraz Android. Gotowy do uruchomienia przykład, na którym oparty jest ten artykuł, znajduje się w Demos\21.GRPC\11.Speech_to_Text, a pełna dokumentacja jest na stronie produktu gRPC Client.

Pytania lub uwagi? Skontaktuj się z nami. Otrzymasz odpowiedź od osób, które napisały ten kod.