亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不帶 SDK 的 Amazon Transcribe Streaming API

不帶 SDK 的 Amazon Transcribe Streaming API

Go
侃侃爾雅 2023-05-15 15:19:39
我正在嘗試使用來自 Go 1.11 的亞馬遜新的流式轉錄 API。目前 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()問題是執行請求 ( client.Do(req)) 凍結五分鐘,然后以“意外的 EOF”錯誤結束。知道我做錯了什么嗎?有人在沒有 Java SDK 的情況下成功使用了新的流式轉錄 API 嗎?
查看完整描述

3 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

我聯系了 AWS 支持,他們現在建議盡可能使用 websockets 而不是 HTTP/2(博客文章在這里

如果這適合您的用例,我強烈建議您查看新的示例存儲庫: https: //github.com/aws-samples/amazon-transcribe-websocket-static,它顯示了 JS 中基于瀏覽器的解決方案。

我還注意到該演示的作者在他的個人 Github 上有一個明確的例子: https: //github.com/brandonmwest/amazon-transcribe-websocket-express但我還沒有確認這是否有效。

感謝這些示例不是在 Python 中,但我認為使用 Websocket 客戶端而不是 HTTP/2 會更好(老實說,它仍然有點可怕:P)


查看完整回答
反對 回復 2023-05-15
?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

嘗試不設置內容類型標頭,看看您得到什么響應。我正在嘗試做同樣的事情(但在 Ruby 中)并且“修復”了SerializationException. 仍然無法讓它工作,但我現在有一個新的錯誤需要考慮:)

更新:我現在已經開始工作了。我的問題是簽名。如果同時傳遞了標頭host和標頭,則在檢查簽名時,它們將與服務器端連接并被視為在服務器端,因此簽名永遠不會匹配。這在 AWS 方面似乎不是正確的行為,但在 Go 中它看起來不會成為您的問題。authority,host


查看完整回答
反對 回復 2023-05-15
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

我也在與 Node.js 作斗爭。文檔不清楚的是,在一個地方它說不應該Content-Typeapplication/json,但在其他地方,它使有效負載看起來應該編碼為application/vnd.amazon.eventstream.?看起來有效負載應該仔細格式化為二進制格式而不是 JSON 對象,如下所示:

Amazon Transcribe 使用一種稱為事件流編碼的格式進行流式轉錄。這種格式使用描述每個事件內容的標頭信息對二進制數據進行編碼。您可以將此信息用于在不使用 Amazon Transcribe SDK 的情況下調用 Amazon Transcribe 終端節點的應用程序。Amazon Transcribe 使用 HTTP/2 協議進行流式轉錄。流式請求的關鍵組件是:

  • 標題框架。這包含請求的 HTTP 標頭,以及授權標頭中的簽名,Amazon Transcribe 將其用作種子簽名來簽署以下數據幀。

  • 事件流編碼中的一個或消息幀。該幀包含元數據和原始音頻字節。

  • 結束幀。這是一個帶有空主體的事件流編碼中的簽名消息。

查看完整回答
反對 回復 2023-05-15
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

我對在節點 js 中將 AWS 轉錄服務與他們的 WebSocket API 一起使用有類似的要求。鑒于目前官方包中還沒有對此提供支持,我已經繼續編寫了一個名為 AWS-transcribe 的包,可以在此處找到。我希望這有幫助。


它提供了一個圍繞 WebSocket 的流接口,可以像下面的例子一樣使用


import { AwsTranscribe, StreamingClient } from "aws-transcribe"


const client = new AwsTranscribe({

    // if these aren't provided, they will be taken from the environment

    accessKeyId: "ACCESS KEY HERE",

    secretAccessKey: "SECRET KEY HERE",

})


const transcribeStream = client

    .createStreamingClient({

        region: "eu-west-1",

        sampleRate,

        languageCode: "en-US",

    })

    // enums for returning the event names which the stream will emit

    .on(StreamingClient.EVENTS.OPEN, () => console.log(`transcribe connection opened`))

    .on(StreamingClient.EVENTS.ERROR, console.error)

    .on(StreamingClient.EVENTS.CLOSE, () => console.log(`transcribe connection closed`))

    .on(StreamingClient.EVENTS.DATA, (data) => {

        const results = data.Transcript.Results


        if (!results || results.length === 0) {

            return

        }


        const result = results[0]

        const final = !result.IsPartial

        const prefix = final ? "recognized" : "recognizing"

        const text = result.Alternatives[0].Transcript

        console.log(`${prefix} text: ${text}`)

    })


someStream.pipe(transcribeStream)


查看完整回答
反對 回復 2023-05-15
  • 3 回答
  • 0 關注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號