Я пытаюсь использовать Amazon новый API потоковой транскрипции из Go 1.11. В настоящее время Amazon предоставляет только 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)
...
Проблема заключается в том, что выполнение запроса (client.Do(req)
) client.Do(req)
на пять минут, а затем заканчивается ошибкой "неожиданный EOF".
Есть идеи, что я делаю не так? Кто-нибудь успешно использовал новый API потоковой транскрипции без Java SDK?
РЕДАКТИРОВАТЬ (11 марта 2019 г.):
Я проверил это снова, и теперь он не истекает, но сразу возвращает ответ 200 OK
. В теле ответа есть "исключение": {"Output":{"__type":"com.amazon.coral.service#SerializationException"},"Version":"1.0"}
Я попытался открыть поток HTTP2 с помощью io.Pipe
(как в приведенном выше коде), а также с помощью тела JSON, описанного в документации:
{
"AudioStream": {
"AudioEvent": {
"AudioChunk": ""
}
}
}
Результат был таким же.
РЕДАКТИРОВАТЬ (13 марта 2019 г.):
Как уже упоминалось @gpeng, удаление content-type
из заголовков исправит исключение SerializationException
. Но затем возникает исключение IAM, и необходимо добавить разрешение transcription:StartStreamTranscription
вашему пользователю IAM. Это, однако, нигде в консоли AWS IAM и должно быть добавлено вручную как пользовательское разрешение JSON:/
Существует также новый/другая документация документ здесь, который показывает неправильный host
и новый content-type
(не использовать этот content-type
, запрос будет возвращать 404 с ней).
После удаления content-type
и добавления нового разрешения теперь я получаю исключение {"Message":"A complete signal was sent without the preceding empty frame."}
. Также пишу в трубу навсегда, поэтому я снова застрял. Сообщения, описанные в новой документации, отличаются от старых, теперь, наконец, двоичные, но я их не понимаю. Есть идеи, как отправить такие сообщения HTTP2 в Go?
РЕДАКТИРОВАТЬ (Матч 15, 2019): *
Если вы получили ошибку HTTP 403 о несоответствии сигнатур, не устанавливайте HTTP-заголовки x-amz-content-sha256
transfer-encoding
и x-amz-content-sha256
. Когда я их устанавливаю, подписываю запрос с помощью AWS SDK V4, а затем получаю HTTP 403. The request signature we calculated does not match the signature you provided.