go - Google cloud longrunning.WaitOperation 不支持语音 API
问题描述
我正在尝试按照谷歌文档实现google.longrunning.WaitOperation的 GRPC 调用: https ://cloud.google.com/speech-to-text/docs/reference/rpc/google.longrunning#google.longrunning.WaitOperationRequest
这是我的围棋代码:
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/examples/helloworld/google/longrunning"
"os"
)
func clientInterceptor(
ctx context.Context,
method string,
req interface{},
reply interface{},
cc *grpc.ClientConn,
invoker grpc.UnaryInvoker,
opts ...grpc.CallOption,
) error {
md := metadata.New(map[string]string{
"authorization": "Bearer ya29.c.Kp8B_Q...",
})
ctx = metadata.NewOutgoingContext(ctx, md)
return invoker(ctx, method, req, reply, cc, opts...)
}
func main() {
creds, err := credentials.NewClientTLSFromFile("/tmp/roots.pem", "speech.googleapis.com")
if err != nil {
fmt.Fprintf(os.Stderr, "error: %s\n", err.Error())
}
conn, err := grpc.Dial("speech.googleapis.com:443", grpc.WithTransportCredentials(creds), grpc.WithUnaryInterceptor(clientInterceptor))
if err != nil {
fmt.Fprintf(os.Stderr, "error: %s\n", err.Error())
}
defer conn.Close()
longrun := longrunning.NewOperationsClient(conn)
wr := longrunning.WaitOperationRequest{
Name: "2026433631820316715",
}
gor := longrunning.GetOperationRequest {
Name: "2026433631820316715",
}
resp, err := longrun.GetOperation(context.Background(), &gor)
if err != nil {
fmt.Printf("GetOperation ERRRO")
fmt.Fprintf(os.Stderr, "error: %s\n", err.Error())
}
fmt.Printf("GetOperation: %#v\n", resp)
resp, err = longrun.WaitOperation(context.Background(), &wr)
if err != nil {
fmt.Printf("WaitOperation ERRRO")
fmt.Fprintf(os.Stderr, "error: %s\n", err.Error())
}
fmt.Printf("WaitOperation: %#v\n", resp)
}
GetOperation 有效,它将返回如下内容:
*** GetOperation: &longrunning.Operation{state:impl.MessageState{NoUnkeyedLiterals:pragma.NoUnkeyedLiterals{}, DoNotCompare:pragma.DoNotCompare{}, DoNotCopy:pragma.DoNotCopy{}, atomicMessageInfo:( impl.MessageInfo)(0xc0000f1500)} , sizeCache:0, unknownFields:[]uint8(nil), Name:"2026433631820316715", Metadata:( anypb.Any)(0xc000222550), Done:true, Result: (longrunning.Operation_Response)(0xc000224038)}
后续的 WaitOperation 会抛出错误:
* WaitOperation ERRROerror: rpc error: code = Unimplemented desc = 操作未实现、不支持或启用。WaitOperation: (longrunning.Operation )(nil)
任何人都有使用这个低级 GRPC API 等待谷歌云长期运行操作的经验?尝试从 Rust 实现中调用它时,我得到了相同的结果。我可以通过 REST 调用实现等待,但似乎 REST 根本不支持等待操作:https ://cloud.google.com/speech-to-text/docs/reference/rest/v1/operations
我正在尝试实现 Rust 语音到文本库,在受 Go 库设计启发的 GRPC API 上提供更高级别的抽象:https ://cloud.google.com/speech-to-text/docs/async-recognize
在调查此库中op.Wait的底层代码时,它似乎进行了自定义轮询并调用GetOperation。WaitOperation 是直接由谷歌 API 实现的,还是我需要在 Rust lib 中提供类似的基于轮询的自定义实现?
解决方案
推荐阅读
- c - 使用 1 按位设置一个字节的所有位
- android - 如何使用 Android NFC 标签添加和删除密码?
- python - 将两列数据框转换为独立变量以直接调用
- r - 如何使用 R 将 ISO Timestamp 数据列转换为 POSIXt?
- sql - SQL Server CE 格式查询
- php - 从自定义 url 链接将购物车商品数据添加到 woocommerce
- c++ - 移动鼠标时 QCursor::setPos() 不起作用
- swift - 使用 Swift 在 macOS 的 NSStatusBar 上显示图标和文本
- php - Phpinfo() 在 NginX 更新后显示旧 PHP 版本
- javascript - 为什么我的 nodeJS 中的 console.log 没有给出正确的结果?