相关文章推荐
威武的馒头  ·  threejs 建筑 - CSDN文库·  1 年前    · 
很酷的生菜  ·  yarn ...·  3 年前    · 

只有在無法使用 Speech SDK 或 快速轉錄 API 的情況下,才用語音轉文字 REST API 來播放短音頻。

在使用語音轉文字 REST API 進行短音頻之前,請考慮以下限制:

  • 使用 REST API 進行短音訊並直接傳送音訊的請求,音訊長度不得超過 60 秒。 發音評估時,音訊長度不應超過30秒。 輸入 音訊格式 比 Speech SDK 限制更多。
  • 短音頻的 REST API 只會回傳最終結果。 它不會提供部分結果。
  • 短音頻的 REST API 不支援 語音翻譯 。 你需要使用 Speech SDK 。
  • REST API 不支援針對短音頻的 批次轉錄 和 自訂語音 。 你應該一直使用 Speech to text REST API 來批次轉錄和自訂語音。
  • 在使用語音轉文字 REST API 進行短音頻之前,請了解你需要完成憑證交換作為認證的一部分,才能存取該服務。 更多資訊請參閱 認證 。

    區域與終點

    短音頻的 REST API 端點格式如下:

    https://YourResourceName.cognitiveservices.azure.com/stt/speech/recognition/conversation/cognitiveservices/v1
    

    用你的語音資源名稱來替代 YourResourceName 。

    關於由21Vianet端點操作的Azure Government與Microsoft Azure,請參見關於主權雲的文章。

    音訊會傳送在 HTTP POST 請求的正文中。 必須是本表中的某一種格式:

    Authorization 一個由字詞Bearer開頭的授權標記。 更多資訊請參閱 認證。 要麼是這個標頭,要麼 Ocp-Apim-Subscription-Key 是必須的。 Pronunciation-Assessment 規定辨識結果中顯示發音分數的參數。 這些分數評估語音輸入的發音品質,指標包括準確性、流暢度與完整性。

    此參數為 Base64 編碼的 JSON,包含多個詳細參數。 想了解如何建立這個標頭,請參閱 發音評估參數。 Content-type 描述所提供音訊資料的格式與編解碼器。 公認的值為 audio/wav; codecs=audio/pcm; samplerate=16000 和 audio/ogg; codecs=opus。 Transfer-Encoding 指定傳送的是分塊音訊資料,而非單一檔案。 只有在你要分區音訊資料時才使用這個標頭。 Expect 如果你用的是分塊傳輸,請傳送 Expect: 100-continue。 語音服務已確認初始請求,並等待更多資料。 如果你要傳送分段音訊資料,這是必須的。 Accept 若提供,必須為 application/json。 Speech 服務提供 JSON 格式的結果。 有些請求框架會提供不相容的預設值。 務必包含 Accept。 可選,但建議這麼做。

    這些參數可能會包含在 REST 請求的查詢字串中。

    你必須在網址後加上語言參數,以避免收到 4xx HTTP 錯誤。 例如,將語言設為美式英文的設定為:https://YourResourceName.cognitiveservices.azure.com/stt/speech/recognition/conversation/cognitiveservices/v1?language=en-US。

    format 指定結果格式。 公認的值為 simple 和 detailed。 簡單結果包括 RecognitionStatus、 DisplayText、 Offset和 Duration。 詳細回應包含四種不同的顯示文字表示方式。 預設設定為 simple。 profanity 說明如何處理識別結果中的髒話。 公認的數值如下:

    masked,該詞將髒話替換為星號。
    removed,結果中刪除了所有髒話。
    raw,結果中包含髒話。

    預設設定為 masked。

    發音評估參數

    此表列出發音評估所需的與可選參數:

    必修或選修 定義輸出標準。 公認的數值如下:

    Basic,僅顯示準確度分數。
    Comprehensive,顯示更多維度的分數(例如全文層級的流暢度分數與完整性分數,以及單字層級的錯誤類型)。

    欲了解不同分數維度及詞錯類型的定義,請參閱 反應屬性。 預設設定為 Basic。 EnableMiscue 啟用誤讀計算。 啟用此參數後,發音詞彙會與參考文本進行比較。 根據比較結果,會以省略或插入標示。 公認的值為 False 和 True。 預設設定為 False。 EnableProsodyAssessment 為您的發音評估啟用韻律評量。 此功能會評估重音、語調、語速與節奏等方面。 此功能能讓你了解你說話的自然與表現力。

    若將此屬性設為 True, ProsodyScore 則返回結果值。 ScenarioId 一個表示自訂點數系統的 GUID。

    這裡有包含發音評估參數的 JSON 範例:

    "ReferenceText": "Good morning.", "GradingSystem": "HundredMark", "Granularity": "Word", "Dimension": "Comprehensive", "EnableProsodyAssessment": "True"

    以下範例程式碼說明如何在標頭中建立發音評估參數 Pronunciation-Assessment :

    var pronAssessmentParamsJson = $"{{\"ReferenceText\":\"Good morning.\",\"GradingSystem\":\"HundredMark\",\"Granularity\":\"Word\",\"Dimension\":\"Comprehensive\",\"EnableProsodyAssessment\":\"True\"}}";
    var pronAssessmentParamsBytes = Encoding.UTF8.GetBytes(pronAssessmentParamsJson);
    var pronAssessmentHeader = Convert.ToBase64String(pronAssessmentParamsBytes);
    

    我們強烈建議在上傳音訊資料時進行串流(分段傳輸)上傳,這能大幅降低延遲。 想了解如何啟用串流,請參閱各種程式語言中的 範例程式碼。

    欲了解更多資訊,請參閱 發音評估。

    以下範例包含主機名稱及所需的標頭。 值得注意的是,該服務也預期音訊資料,但此樣本中未包含音訊資料。 如前所述,建議分塊化,但並非必須。

    POST speech/recognition/conversation/cognitiveservices/v1?language=en-US&format=detailed HTTP/1.1
    Accept: application/json;text/xml
    Content-Type: audio/wav; codecs=audio/pcm; samplerate=16000
    Ocp-Apim-Subscription-Key: YOUR_RESOURCE_KEY
    Host: YourResourceName.cognitiveservices.azure.com
    Transfer-Encoding: chunked
    Expect: 100-continue
    

    為了啟用發音評估,你可以加上以下標頭。 想了解如何建立這個標頭,請參閱 發音評估參數。

    Pronunciation-Assessment: eyJSZWZlcm...
    

    HTTP 狀態碼

    每個回應的 HTTP 狀態碼表示成功或常見錯誤。

    HTTP 狀態碼 "RecognitionStatus": "Success", "DisplayText": "Remind me to buy 5 pencils.", "Offset": "1236645672289", "Duration": "1236645672289"

    以下是典型的detailed識別回應:

    "RecognitionStatus": "Success", "Offset": "1236645672289", "Duration": "1236645672289", "NBest": [ "Confidence": 0.9052885, "Display": "What's the weather like?", "ITN": "what's the weather like", "Lexical": "what's the weather like", "MaskedITN": "what's the weather like" "Confidence": 0.92459863, "Display": "what is the weather like", "ITN": "what is the weather like", "Lexical": "what is the weather like", "MaskedITN": "what is the weather like"

    以下是識別和發音評估中的典型回應:

    "RecognitionStatus": "Success", "Offset": 700000, "Duration": 8400000, "DisplayText": "Good morning.", "SNR": 38.76819, "NBest": [ "Confidence": 0.98503506, "Lexical": "good morning", "ITN": "good morning", "MaskedITN": "good morning", "Display": "Good morning.", "AccuracyScore": 100.0, "FluencyScore": 100.0, "ProsodyScore": 87.8, "CompletenessScore": 100.0, "PronScore": 95.1, "Words": [ "Word": "good", "Offset": 700000, "Duration": 2600000, "Confidence": 0.0, "AccuracyScore": 100.0, "ErrorType": "None", "Feedback": { "Prosody": { "Break": { "ErrorTypes": [ "None" "BreakLength": 0 "Intonation": { "ErrorTypes": [], "Monotone": { "Confidence": 0.0, "WordPitchSlopeConfidence": 0.0, "SyllablePitchDeltaConfidence": 0.91385907 "Word": "morning", "Offset": 3400000, "Duration": 5700000, "Confidence": 0.0, "AccuracyScore": 100.0, "ErrorType": "None", "Feedback": { "Prosody": { "Break": { "ErrorTypes": [ "None" "UnexpectedBreak": { "Confidence": 3.5294118e-08 "MissingBreak": { "Confidence": 1.0 "BreakLength": 0 "Intonation": { "ErrorTypes": [], "Monotone": { "Confidence": 0.0, "WordPitchSlopeConfidence": 0.0, "SyllablePitchDeltaConfidence": 0.91385907

    結果以 JSON 格式提供。 格式 simple 包含以下頂層字段:

    DisplayText 經過大寫、標點、反向正規化及髒話遮蔽程序後,識別出的文字。 只有成功時才會現身。 反向文字正規化是將口語文字轉換為較短的形式,例如將「兩百」轉換成「200」,或將「史密斯醫生」轉換成「Dr. Smith」。 Offset 識別語音在音訊串流中開始的時間(單位為100奈秒)。 Duration 音訊串流中識別語音的持續時間(單位為100奈秒)。 音訊串流中識別語音的訊噪比(SNR)。

    欄位 RecognitionStatus 可能包含以下數值:

    分塊傳輸(Transfer-Encoding: chunked)能幫助降低辨識延遲。 它允許語音服務在音訊檔案傳輸時開始處理。 短音頻的 REST API 不會提供部分或中期結果。

    以下程式碼範例展示了如何分段傳送音訊。 只有第一個區塊應該包含音訊檔案的標頭。 request 是一個 HttpWebRequest 連接到相應 REST 端點的物件。 audioFile 是磁碟上音訊檔案的路徑。

    var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
    request.SendChunked = true;
    request.Accept = @"application/json;text/xml";
    request.Method = "POST";
    request.ProtocolVersion = HttpVersion.Version11;
    request.Host = host;
    request.ContentType = @"audio/wav; codecs=audio/pcm; samplerate=16000";
    request.Headers["Ocp-Apim-Subscription-Key"] = "YOUR_RESOURCE_KEY";
    request.AllowWriteStreamBuffering = false;
    using (var fs = new FileStream(audioFile, FileMode.Open, FileAccess.Read))
        // Open a request stream and write 1,024-byte chunks in the stream one at a time.
        byte[] buffer = null;
        int bytesRead = 0;
        using (var requestStream = request.GetRequestStream())
            // Read 1,024 raw bytes from the input audio file.
            buffer = new Byte[checked((uint)Math.Min(1024, (int)fs.Length))];
            while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);
            requestStream.Flush();
    

    每個請求都需要一個授權標頭。 下表說明每個功能支援哪些標頭:

    支援的授權標頭 語音轉文字 文字轉語音

    使用 Ocp-Apim-Subscription-Key 標頭時,必須只提供你的資源金鑰。 例如:

    'Ocp-Apim-Subscription-Key': 'YourSpeechResourceKey'
    

    如果您使用 STS 持有人權杖流程搭配Authorization: Bearer,請先對issueToken端點提出要求。 在此要求中,要以資源金鑰交換有效期間 10 分鐘的存取權杖。

    另一種選擇是使用 Microsoft Entra 認證,也使用 Authorization: Bearer 標頭,但憑證由 Microsoft Entra ID 發出。 參見 Use Microsoft Entra authentication。

    如何取得 STS 存取令牌

    要取得 STS 存取權杖,請使用 issueToken 和 你的資源金鑰向Ocp-Apim-Subscription-Key端點提出請求。

    issueToken端點格式如下:

    https://YourResourceName.cognitiveservices.azure.com/sts/v1.0/issueToken
    

    用你的語音資源名稱來替代 YourResourceName 。

    這個端點需要你的資源設定 自訂子網域 。 對於沒有自訂網域的資源,請改用區域端點: https://<region>.api.cognitive.microsoft.com/sts/v1.0/issueToken。 將 <region> 替換成資源的Azure區域(例如 eastus)。

    請使用以下範例來建立您的存取權憑證申請。

    HTTP 範例

    這個例子是一個簡單的 HTTP 請求,用來取得一個 token。 用你的語音服務資源金鑰替換 YourSpeechResourceKey 。 用你的語音資源名稱來替代 YourResourceName 。

    POST /sts/v1.0/issueToken HTTP/1.1
    Ocp-Apim-Subscription-Key: YourSpeechResourceKey
    Host: YourResourceName.cognitiveservices.azure.com
    Content-type: application/x-www-form-urlencoded
    Content-Length: 0
    

    回應正文包含以 JSON Web Token (JWT) 格式呈現的存取權杖。

    PowerShell 範例

    這個範例是一個簡單的 PowerShell 腳本,用來取得存取權杖。 用你的語音服務資源金鑰替換 YourSpeechResourceKey 。 用你的語音資源名稱來替代 YourResourceName 。

    $FetchTokenHeader = @{
      'Content-type'='application/x-www-form-urlencoded';
      'Content-Length'= '0';
      'Ocp-Apim-Subscription-Key' = 'YourSpeechResourceKey'
    $OAuthToken = Invoke-RestMethod -Method POST `
        -Uri https://YourResourceName.cognitiveservices.azure.com/sts/v1.0/issueToken `
        -Headers $FetchTokenHeader
    # show the token received
    $OAuthToken
    

    cURL 範例

    cURL 是一個在 Linux(以及 Windows 子系統 Linux 版)中使用的命令列工具。 這個 cURL 指令說明如何取得存取權杖。 用你的語音服務資源金鑰替換 YourSpeechResourceKey 。 用你的語音資源名稱來替代 YourResourceName 。

    curl -v -X POST \
     "https://YourResourceName.cognitiveservices.azure.com/sts/v1.0/issueToken" \
     -H "Content-type: application/x-www-form-urlencoded" \
     -H "Content-Length: 0" \
     -H "Ocp-Apim-Subscription-Key: YourSpeechResourceKey"
    

    C# 範例

    這個 C# 類別示範了如何取得存取權杖。 在實例化類別時,傳遞語音服務的資源金鑰。 用你的語音資源名稱來替代 YourResourceName 。

    public class Authentication
        public static readonly string FetchTokenUri =
            "https://YourResourceName.cognitiveservices.azure.com/sts/v1.0/issueToken";
        private string subscriptionKey;
        private string token;
        public Authentication(string subscriptionKey)
            this.subscriptionKey = subscriptionKey;
            this.token = FetchTokenAsync(FetchTokenUri, subscriptionKey).Result;
        public string GetAccessToken()
            return this.token;
        private async Task<string> FetchTokenAsync(string fetchUri, string subscriptionKey)
            using (var client = new HttpClient())
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
                UriBuilder uriBuilder = new UriBuilder(fetchUri);
                var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, null);
                Console.WriteLine("Token Uri: {0}", uriBuilder.Uri.AbsoluteUri);
                return await result.Content.ReadAsStringAsync();
    

    Python 範例

    # Request module must be installed.
    # Run pip install requests if necessary.
    import requests
    subscription_key = 'REPLACE_WITH_YOUR_KEY'
    def get_token(subscription_key):
        fetch_token_url = 'https://YourResourceName.cognitiveservices.azure.com/sts/v1.0/issueToken'
        headers = {
            'Ocp-Apim-Subscription-Key': subscription_key
        response = requests.post(fetch_token_url, headers=headers)
        access_token = str(response.text)
        print(access_token)
    

    如何使用存取權杖

    存取權杖應該作為 Authorization: Bearer <TOKEN> 標頭傳送給服務。 每個存取權杖有效期為10分鐘。 你可以隨時取得新的令牌,但為了減少網路流量和延遲,我們建議使用相同的令牌九分鐘。

    Important

    持有人權杖的範圍是核發它們的端點。 從YourResourceName.cognitiveservices.azure.com取得的權杖只對同一主機的要求有效。 來自 <region>.api.cognitive.microsoft.com 的權杖只能用於區域性 Speech 端點。 如果您在使用 Bearer 權杖時收到 401 錯誤,請改用 Ocp-Apim-Subscription-Key 搭配您的資源金鑰,這種方式適用於所有端點格式。

    以下是短音頻對語音轉文字 REST API 的 HTTP 請求範例:

    POST /cognitiveservices/v1 HTTP/1.1
    Authorization: Bearer YOUR_ACCESS_TOKEN
    Host: YourResourceName.cognitiveservices.azure.com
    Content-type: application/ssml+xml
    Content-Length: 199
    Connection: Keep-Alive
    // Message body here...
    

    使用 Microsoft Entra 認證

    要使用 Microsoft Entra 認證搭配語音轉文字 REST API 來錄製短音頻,你需要建立一個存取權杖。 取得包含資源 ID 與 Microsoft Entra 存取權杖的步驟與使用 Speech SDK 相同。 請依照此處步驟使用 Microsoft Entra 認證

  • 建立語音鑄造資源
  • 設定語音資源以進行 Microsoft Entra 認證
  • 取得 Microsoft Entra 存取令牌
  • 取得語音資源ID
  • 取得資源 ID 與 Microsoft Entra 存取權杖後,實際的存取權杖可依以下格式建構:

    aad#YOUR_RESOURCE_ID#YOUR_MICROSOFT_ENTRA_ACCESS_TOKEN
    

    你需要在資源識別碼和存取權杖之間加入「aad#」前綴和「#」(哈希)分隔符。

    以下是短音頻對語音轉文字 REST API 的 HTTP 請求範例:

    POST /cognitiveservices/v1 HTTP/1.1
    Authorization: Bearer YOUR_ACCESS_TOKEN
    Host: YourResourceName.cognitiveservices.azure.com
    Content-type: application/ssml+xml
    Content-Length: 199
    Connection: Keep-Alive
    // Message body here...
    

    欲了解更多關於 Microsoft Entra 存取權杖的資訊,包括權杖壽命,請造訪 Microsoft 身分識別平台中的存取權杖。

    快速轉錄 API 自訂語音模型 熟悉批次轉錄