首页 > 解决方案 > 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 中提供类似的基于轮询的自定义实现?

标签: gogoogle-cloud-platformgrpcgoogle-speech-apilong-running-processes

解决方案


推荐阅读