gpt4 book ai didi

amazon-web-services - 无 SDK 的 Amazon Transcribe Streaming API

转载 作者:IT老高 更新时间:2023-10-28 13:07:31 27 4
gpt4 key购买 nike

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

唯一相关的文档是 here但它没有显示端点。我在 Java example 中找到了它它是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)
...

问题是执行请求 (client.Do(req)) 会卡住五分钟,然后以“意外 EOF”错误结束。

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

编辑(2019 年 3 月 11 日):

我再次测试了它,现在它不会超时,而是立即返回 200 OK回复。但是响应正文中有一个“异常”:{"Output":{"__type":"com.amazon.coral.service#SerializationException"},"Version":"1.0"}

我尝试使用 io.Pipe 打开 HTTP2 流(如上面的代码)以及文档中描述的 JSON 正文:

{
"AudioStream": {
"AudioEvent": {
"AudioChunk": ""
}
}
}

结果是一样的。

编辑(2019 年 3 月 13 日):

正如@gpeng 所述,删除content-type from headers 将修复 SerializationException .但是有一个IAM异常,需要添加transcription:StartStreamTranscription您的 IAM 用户的权限。虽然这在 AWS IAM 控制台中无处可寻,但必须手动添加为自定义 JSON 权限:/

还有一个新的/另一个文档文档 here显示不正确的 host和一个新的content-type (不要使用 content-type ,请求将返回 404)。

删除 content-type 后,并添加新权限,现在我得到一个异常 {"Message":"A complete signal was sent without the preceding empty frame."} .也永远写入管道 block ,所以我又被卡住了。新文档中描述的消息与旧文档中的消息不同,现在终于二进制了,但我不明白它们。任何想法如何在 Go 中发送此类 HTTP2 消息?

编辑(2019 年第 15 场比赛):*

如果您收到关于签名不匹配的 HTTP 403 错误,请不要设置 transfer-encodingx-amz-content-sha256 HTTP header 。当我设置它们时,使用 AWS SDK 的 V4 签名者对请求进行签名,然后我收到 HTTP 403 The request signature we calculated does not match the signature you provided.

最佳答案

我联系了 AWS 支持,他们现在建议尽可能使用 websockets 而不是 HTTP/2(博文 here)

如果这适合您的用例,我强烈建议您查看新的示例存储库:https://github.com/aws-samples/amazon-transcribe-websocket-static它显示了 JS 中基于浏览器的解决方案。

我还注意到演示的作者在他的个人 Github 上有一个明确的示例:https://github.com/brandonmwest/amazon-transcribe-websocket-express但我还没有确认这是否有效。

感谢这些示例不在 Python 中,但我认为使用 Websocket 客户端而不是 HTTP/2 会更好(说实话,这仍然有点可怕:P)

关于amazon-web-services - 无 SDK 的 Amazon Transcribe Streaming API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com