尝试从机器人调用 Microsoft Bing Speech API 时出现 403 禁止
403 Forbidden when trying to call Microsoft Bing Speech API from a bot
更新:该代码与 Microsoft 的试用密钥 (f2da0a19f4d94875880e9fbaceabc97d) 完美配合,但无法使用我在 Azure 中生成的自己的密钥。什么?
解决方案:我使用 "Translator Speech API" 的密钥而不是 "Bing Speech API"。那是错误的。哇。浪费了两个小时。
我正在编写一个接受语音输入的机器人。为此,我正在使用 Microsoft 的 Bing Speech API。
我按如下方式发送请求并收到 403 Forbidden 错误。根据官方文档,403 表示身份验证或配额问题。但是,我有一个付费帐户(不是免费帐户)并且似乎正确接收了身份验证令牌。
URL:
Headers:
Authorization: Bearer eyJ0eXAiOiJlV1QiLCJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6Imh0dHBzOi8vZGV2Lm1pY3Jvc29mdHRyYW5zbGF0b3IuY29tLyIsInN1YnNjcmlwdGlvbi1pZCI6ImM4ZWQyMTNlNjUyMTRhYzc4MDFlNGU0M2RjZmQ1ZWZkIiwicHJvZHVjdC1pZCI6IlNwZWVjaFRyYW5zbGF0b3IuUzEiLCJjb2duaXRpdmUtc2VydmljZXMtZW5kcG9pbnQiOiJodHRwczovL2FwaS5jb2duaXRpdmUubWljcm9zb2Z0LmNvbS9pbnRlcm5hbC92MS4wLyIsImF6dXJlLXJlc291cmNlLWlkIjoiL3N1YnNjcmlwdGlvbnMvZmU4ZjI4ZDktZDJlNy00YWY0LxIwOGUtNWU3N2Y5YTc0ODY2L3Jlc291cmNlR3JvdXBzL2JvdHMvcHJvdmlkZXJzL01pY3Jvc29mdC5Db2duaXRpdmVTZXJ2aWNlcy...bWljcm9zb2Z0dHJhbnNsYXRvciIsImV4cCI6MTQ5MTQwNTcxM30.mdFdi98OGyjZ_sDYvd2lMWZqvPMROYyiChQz0JKh7fk}
我得到的响应是 403 Forbidden,没有任何附加信息。
有什么想法吗?我只是在此处使用 Microsoft 的参考实现 - https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/intelligence-SpeechToText - 但使用我自己的订阅密钥。
代码:
public async Task<string> GetTextFromAudioAsync(Stream audiostream)
{
var requestUri = @"https://speech.platform.bing.com/recognize?scenarios=ulm&appid=D4D52672-91D7-4C74-8AD8-42B1D98141A5&locale=en-US&device.os=bot&version=3.0&format=json&instanceid=45d58c78-e2d8-444f-83c8-9a5dca7225ba&requestid=" + Guid.NewGuid();
using (var client = new HttpClient())
{
var token = Authentication.Instance.GetAccessToken();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
//using (var binaryContent = new ByteArrayContent(StreamToBytes(audiostream)))
using (var binaryContent = new ByteArrayContent(File.ReadAllBytes(Environment.GetEnvironmentVariable("HOME").ToString() + "\site\wwwroot\test.wav")))
{
binaryContent.Headers.TryAddWithoutValidation("content-type", "audio/wav; codec=\"audio/pcm\"; samplerate=8000");
var response = await client.PostAsync(requestUri, binaryContent);
var responseString = await response.Content.ReadAsStringAsync();
try
{
dynamic data = JsonConvert.DeserializeObject(responseString);
if (data == null)
{
throw new Exception("Server responded: " + response.StatusCode);
}
return data.header.name;
}
catch (JsonReaderException ex)
{
throw new Exception(responseString, ex);
}
}
}
}
我使用 "Translator Speech API" 的密钥而不是 "Bing Speech API"。那是错误的。哇。浪费了两个小时。
更新:该代码与 Microsoft 的试用密钥 (f2da0a19f4d94875880e9fbaceabc97d) 完美配合,但无法使用我在 Azure 中生成的自己的密钥。什么?
解决方案:我使用 "Translator Speech API" 的密钥而不是 "Bing Speech API"。那是错误的。哇。浪费了两个小时。
我正在编写一个接受语音输入的机器人。为此,我正在使用 Microsoft 的 Bing Speech API。
我按如下方式发送请求并收到 403 Forbidden 错误。根据官方文档,403 表示身份验证或配额问题。但是,我有一个付费帐户(不是免费帐户)并且似乎正确接收了身份验证令牌。
URL:
Headers:
Authorization: Bearer eyJ0eXAiOiJlV1QiLCJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6Imh0dHBzOi8vZGV2Lm1pY3Jvc29mdHRyYW5zbGF0b3IuY29tLyIsInN1YnNjcmlwdGlvbi1pZCI6ImM4ZWQyMTNlNjUyMTRhYzc4MDFlNGU0M2RjZmQ1ZWZkIiwicHJvZHVjdC1pZCI6IlNwZWVjaFRyYW5zbGF0b3IuUzEiLCJjb2duaXRpdmUtc2VydmljZXMtZW5kcG9pbnQiOiJodHRwczovL2FwaS5jb2duaXRpdmUubWljcm9zb2Z0LmNvbS9pbnRlcm5hbC92MS4wLyIsImF6dXJlLXJlc291cmNlLWlkIjoiL3N1YnNjcmlwdGlvbnMvZmU4ZjI4ZDktZDJlNy00YWY0LxIwOGUtNWU3N2Y5YTc0ODY2L3Jlc291cmNlR3JvdXBzL2JvdHMvcHJvdmlkZXJzL01pY3Jvc29mdC5Db2duaXRpdmVTZXJ2aWNlcy...bWljcm9zb2Z0dHJhbnNsYXRvciIsImV4cCI6MTQ5MTQwNTcxM30.mdFdi98OGyjZ_sDYvd2lMWZqvPMROYyiChQz0JKh7fk}
我得到的响应是 403 Forbidden,没有任何附加信息。
有什么想法吗?我只是在此处使用 Microsoft 的参考实现 - https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/intelligence-SpeechToText - 但使用我自己的订阅密钥。
代码:
public async Task<string> GetTextFromAudioAsync(Stream audiostream)
{
var requestUri = @"https://speech.platform.bing.com/recognize?scenarios=ulm&appid=D4D52672-91D7-4C74-8AD8-42B1D98141A5&locale=en-US&device.os=bot&version=3.0&format=json&instanceid=45d58c78-e2d8-444f-83c8-9a5dca7225ba&requestid=" + Guid.NewGuid();
using (var client = new HttpClient())
{
var token = Authentication.Instance.GetAccessToken();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
//using (var binaryContent = new ByteArrayContent(StreamToBytes(audiostream)))
using (var binaryContent = new ByteArrayContent(File.ReadAllBytes(Environment.GetEnvironmentVariable("HOME").ToString() + "\site\wwwroot\test.wav")))
{
binaryContent.Headers.TryAddWithoutValidation("content-type", "audio/wav; codec=\"audio/pcm\"; samplerate=8000");
var response = await client.PostAsync(requestUri, binaryContent);
var responseString = await response.Content.ReadAsStringAsync();
try
{
dynamic data = JsonConvert.DeserializeObject(responseString);
if (data == null)
{
throw new Exception("Server responded: " + response.StatusCode);
}
return data.header.name;
}
catch (JsonReaderException ex)
{
throw new Exception(responseString, ex);
}
}
}
}
我使用 "Translator Speech API" 的密钥而不是 "Bing Speech API"。那是错误的。哇。浪费了两个小时。