Speech-to-Text 将口语音频转换为书面文本。Google Cloud 将其作为一个 gRPC 服务对外提供,而 sgcWebSockets Enterprise 提供了一个基于通用 TsgcGRPCClient 构建的强类型 Speech 客户端,因此你可以直接从 Delphi 和 C++Builder 转录音频。你用几个属性组装一个识别请求,通过 gRPC 发送它,然后读回转录文本,无需任何外部运行时或手写的 protobuf。
工作原理
gRPC 是通过 HTTP/2 封帧的 Protocol Buffers 消息,因此 Speech 客户端运行在与库其余部分相同的传输之上。一个 TsgcHTTP2Client 向 speech.googleapis.com:443 打开一个 TLS 连接,一个 TsgcGRPCClient 在其之上处理 gRPC 封帧和尾部,而 sgcGRPC_Google_Speech 中的强类型 Speech 消息则替你序列化和解析请求与响应。
Google Cloud API 是需要身份验证的。你使用服务账号进行身份验证,将它的 JSON 密钥换取一个短期有效的 bearer 令牌,并将该令牌作为 gRPC 元数据随每个调用一起发送。请求本身是一个 RecognitionConfig(语言、编码、采样率)加上音频,可以是内联字节,也可以是一个 Cloud Storage URI。服务回复一个或多个结果,每个结果包含带置信度分数的、按排名排列的转录候选。
使用服务账号进行身份验证
Google Cloud 客户端将服务账号 JSON 密钥转换为一个 bearer 令牌。加载密钥,设置 JWT 属性,并将受众绑定到 Speech 端点,以便自签名令牌被接受。令牌一旦到达,就将它作为 authorization 头添加到 gRPC 客户端的 DefaultMetadata 中,随后它会随每个调用一起传递。
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);
连接 gRPC 客户端
通道就是一个 HTTP/2 连接。将一个 TsgcHTTP2Client 指向 Speech 主机并启用 TLS,将它赋给 gRPC 组件的 Client 属性,然后选择传输内容类型。Speech 服务使用 Protocol Buffers,因此用 grpcProto 且不压缩。
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;
识别音频并读取转录文本
要进行转录,请构建一个 TsgcGRPCSpeechRecognizeRequest。在 Config 中填入语言代码、编码和采样率,将 Audio.Uri 指向一个 Cloud Storage 对象(或用内联字节设置 Audio.Content),然后在 google.cloud.speech.v1.Speech 服务上调用 Recognize。请求用 ToBytes 自我序列化,回复则解析回一个强类型响应,你可以遍历它来读取结果和候选。
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;
识别配置
请求上的 Config 对象直接映射到 Google 的 RecognitionConfig 消息。除了语言和采样率之外,你还可以设置 MaxAlternatives 来请求按排名排列的多个候选,用 ProfanityFilter 屏蔽冒犯性词语,用 AudioChannelCount 处理多声道音频,用 EnableAutomaticPunctuation 获得可读的输出,以及用 Model 选择一个调优过的识别模型。每个属性都是可选的,只有在设置时才会在传输上发出,因此你只发送所需的内容。
内联音频或 Cloud Storage URI
短片段可以放在请求内部传输:将原始音频字节赋给 Audio.Content,客户端会将它们嵌入到 protobuf 中。对于较长的文件,将音频上传到一个存储桶,并改为将 Audio.Uri 设置为一个 gs:// 路径,这样可以让请求保持精简,并让 Google 直接读取该对象。两者是互斥的,对于给定的请求,你设置其中一个。
结果和候选
一个响应是一个结果列表,每个对应一段识别出的音频。每个结果携带一个或多个按可能性排序的候选,最可能的转录在前,并带有一个介于 0 和 1 之间的 Confidence 分数。遍历 ResultCount 和 AlternativeCount 来读取全部,或者直接取第一个结果的第一个候选作为最佳猜测。这些强类型辅助方法完成了 protobuf 解析,因此你处理的是普通的 Delphi 字符串和浮点数。
可用性
强类型 Speech-to-Text gRPC 客户端是 sgcWebSockets Enterprise 版本的一部分,可运行于 Windows、macOS、Linux、iOS 和 Android。一个开箱即用的示例,也就是本文所基于的那个,位于 Demos\21.GRPC\11.Speech_to_Text,完整参考资料请见gRPC Client 产品页面。
有问题或反馈?联系我们。你会收到来自编写这段代码的人的回复。
