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吗?
尝试不设置内容类型标头,看看您会得到什么响应。我正在尝试做同样的事情(但是在 Ruby 中)并且“修复”了SerializationException
. 仍然无法让它工作,但我现在有一个新的错误需要考虑:)
更新:我现在已经可以使用了。我的问题是签名。如果host
和authority
标头都被传递,则在检查签名时,它们会与服务器端连接,
并被视为host
在服务器端,因此签名永远不会匹配。在 AWS 方面,这似乎不是正确的行为,但在 Go 中,这似乎不会成为您的问题。
归档时间: |
|
查看次数: |
1462 次 |
最近记录: |