用c#向微软Bing语音API发送HTTP post请求

本文关键字:发送 HTTP post 请求 API 语音 微软 Bing | 更新日期: 2023-09-27 18:01:45

我正在尝试向微软Bing语音API发送HTTP post请求以转录音频文件。首先,我们需要发送一个post请求来获取一个"访问令牌"作为响应,然后在另一个post请求中使用这个令牌(作为授权)来上传实际文件并在响应中获取转录。我可以发送第一个帖子请求并成功获得访问令牌,但我无法为我的第二个帖子请求获得合理的响应。我关注这个页面:https://www.microsoft.com/cognitive-services/en-us/speech-api/documentation/api-reference-rest/bingvoicerecognition

这是第二个post请求:

        Guid requestId = Guid.NewGuid();
        var Uri = @"https://speech.platform.bing.com/recognize?version=3.0&requestid=" + requestId.ToString() + @"&appID=D4D52672-91D7-4C74-8AD8-42B1D981415A&format=json&locale=en-US&device.os=Windows%20OS&scenarios=ulm&instanceid=f1efbd27-25fd-4212-9332-77cd63176112";
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, Uri);
        request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken));
        request.Headers.TryAddWithoutValidation("Content-Type", @"audio/wav; samplerate=16000");
        MemoryStream ms = new MemoryStream();
        using (var fs = System.IO.File.OpenRead("audio.wav"))
        {
            byte[] buffer = new byte[1024 * 8];
            while (fs.Read(buffer, 0, buffer.Length) > 0)
            {
                ms.Write(buffer, 0, buffer.Length);
            }
            fs.Close();
        }
        ms.Seek(0, SeekOrigin.Begin);
        HttpContent _Body = new StreamContent(ms);
        request.Content = _Body;
        var client2 = new HttpClient();
        var response2 = client2.SendAsync(request);

我想问题是我在哪里设置"内容类型"的标题。原因是当我调试时,我没有看到这个属性在请求的Header中被设置。实际上,头部中没有Content-Type。任何帮助都会很感激。本页讨论了等效的curl命令,也可能有所帮助:https://social.msdn.microsoft.com/Forums/en-US/ad73e4f1-e576-4080-9fe7-060cc2f583ca/microsoft-bing-voice-recognition-api-authorization-404resource-not-found?forum=SpeechService

用c#向微软Bing语音API发送HTTP post请求

Content-Type是与内容相关的标头。下面的代码为我工作:

public async Task<string> SendRequestAsync(string url, string bearerToken, string contentType, string fileName)
{
    var content = new StreamContent(File.OpenRead(fileName));
    content.Headers.TryAddWithoutValidation("Content-Type", contentType);
    using (var httpClient = new HttpClient())
    {           
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
        var response = await httpClient.PostAsync(url, content);
        return await response.Content.ReadAsStringAsync();
    }
}

在您的情况下的调用(如果您在同步上下文中工作):

var result = SendRequestAsync(Uri, accessToken, "audio/wav; samplerate=16000", "audio.wav").Result;

您可以发送以下标头,而不必因为令牌而进行2次请求。

如果您不想每次都登录而不是使用'Authorization': 'Bearer {TOKEN}'标头,您可以使用'Ocp-Apim-Subscription-Key': '{YOUR AZURE TOKEN}',以便不必对应用程序进行授权工厂或更多请求,并使其更快

注意:{TOKEN}是一个JWT令牌,如

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6Imh0dHBzOi8vc3BlZWNoLnBsYXRmb3JtLmJpbmcuY29tIiwic3Vic2NyaXB0aW9uLWlkIjoiZmFhZTNlYTkxNmI1NGMxZWEyODY4MDlhYTg3ZWE1MmUiLCJwcm9kdWN0LWlkIjoiQmluZy5TcGVlY2guUHJldmlldyIsImNvZ25pdGl2ZS1zZXJ2aWNlcy1lbmRwb2ludCI6Imh0dHBzOi8vYXBpLmNvZ25pdGl2ZS5taWNyb3NvZnQuY29tL2ludGVybmFsL3YxLjAvIiwiYXp1cmUtcmVzb3VyY2UtaWQiOiIiLCJpc3MiOiJ1cm46bXMuY29nbml0aXZlc2VydmljZXMiLCJhdWQiOiJ1cm46bXMuc3BlZWNoIiwiZXhwIjoxNTAwODgxNjIzfQ.KdlCrIJ_H0jxs1yyeyYxYR7ucbLuFKT__ep7lGJmGbU

注释2:{你的AZURE令牌}就像d5kals90935b40809dc6k38533c21e85,你可以在这里找到它

请求看起来像这样:

curl -v -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=es-ES&locale=es-ES&format=simple&requestid=req_id" -H "Ocp-Apim-Subscription-Key: d5kals90935b40809dc6k38533c21e85" -H 'Transfer-Encoding: chunked'  -H 'Content-type: audio/wav; codec="audio/pcm"; samplerate=8000' --data-binary @"{BINAYFILE}.wav"