亚马逊转录没有SDK的Streaming API

she*_*lll 12 go amazon-web-services aws-sdk aws-transcribe

我正在尝试使用Go 1.11中亚马逊的新流式转录API.目前亚马逊只提供Java SDK,所以我尝试的是低级方式.

唯一相关的文档是在这里,但它没有显示端点.我在Java示例中找到了它https://transcribestreaming.<region>.amazonaws.com并且我正在尝试爱尔兰地区,即https://transcribestreaming.eu-west-1.amazonaws.com.这是我打开HTTP/2双向流的代码:

import (
    "crypto/tls"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/aws/external"
    "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
    "golang.org/x/net/http2"
    "io"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "time"
)

const (
    HeaderKeyLanguageCode   = "x-amzn-transcribe-language-code"  // en-US
    HeaderKeyMediaEncoding  = "x-amzn-transcribe-media-encoding" // pcm only
    HeaderKeySampleRate     = "x-amzn-transcribe-sample-rate"    // 8000, 16000 ... 48000
    HeaderKeySessionId      = "x-amzn-transcribe-session-id"     // For retrying a session. Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
    HeaderKeyVocabularyName = "x-amzn-transcribe-vocabulary-name"
    HeaderKeyRequestId = "x-amzn-request-id"
)

...

region := "eu-west-1"

cfg, err := external.LoadDefaultAWSConfig(aws.Config{
    Region: region,
})
if err != nil {
    log.Printf("could not load default AWS config: %v", err)
    return
}

signer := v4.NewSigner(cfg.Credentials)

transport := &http2.Transport{
    TLSClientConfig: &tls.Config{
        // allow insecure just for debugging
        InsecureSkipVerify: true,
    },
}
client := &http.Client{
    Transport: transport,
}

signTime := time.Now()

header := http.Header{}
header.Set(HeaderKeyLanguageCode, "en-US")
header.Set(HeaderKeyMediaEncoding, "pcm")
header.Set(HeaderKeySampleRate, "16000")
header.Set("Content-type", "application/json")

// Bi-directional streaming via a pipe.
pr, pw := io.Pipe()

req, err := http.NewRequest(http.MethodPost, "https://transcribestreaming.eu-west-1.amazonaws.com/stream-transcription", ioutil.NopCloser(pr))
if err != nil {
    log.Printf("err: %+v", err)
    return
}
req.Header = header

_, err = signer.Sign(req, nil, "transcribe", region, signTime)
if err != nil {
    log.Printf("problem signing headers: %+v", err)
    return
}

// This freezes and ends after 5 minutes with "unexpected EOF".
res, err := client.Do(req)
...
Run Code Online (Sandbox Code Playgroud)

问题是执行request(client.Do(req))冻结五分钟然后以"意外的EOF"错误结束.

我有什么想法我做错了吗?有人在没有Java SDK的情况下成功使用了新的流式转录API吗?

gpe*_*eng 1

尝试不设置内容类型标头,看看您会得到什么响应。我正在尝试做同样的事情(但是在 Ruby 中)并且“修复”了SerializationException. 仍然无法让它工作,但我现在有一个新的错误需要考虑:)

更新:我现在已经可以使用了。我的问题是签名。如果hostauthority标头都被传递,则在检查签名时,它们会与服务器端连接,并被视为host在服务器端,因此签名永远不会匹配。在 AWS 方面,这似乎不是正确的行为,但在 Go 中,这似乎不会成为您的问题。