已满足所有要求,为何Microsoft Cognitive Speech API仍返回Bad Request?
解决Microsoft Speech-to-text API Bad Request问题的关键修正
1. 移除重复认证头
微软语音API仅支持一种认证方式,同时添加Bearer Token和Ocp-Apim-Subscription-Key会导致认证冲突,保留其中一个即可。例如保留订阅密钥:
// 删除此行重复认证: // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken); client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", speechKey);
2. 修正Accept请求头
API返回JSON格式的识别结果,而非音频,需将Accept头改为application/json:
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
3. 取消MultipartFormDataContent包裹
Conversation识别端点要求直接将音频流作为请求体发送,无需用multipart格式封装:
// 替换原multipart相关代码 var audioStream = File.OpenRead(HttpContext.Current.Server.MapPath("~/audios/audio_06012023094443961.wav")); var fileContent = new StreamContent(audioStream); fileContent.Headers.ContentType = new MediaTypeHeaderValue("audio/wav"); // 直接发送音频流作为请求体 var resp = client.PostAsync($"https://{speechRegion}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US", fileContent);
4. 统一文件名(规范优化)
确保读取的文件名与代码引用一致,避免潜在文件读取异常:
string audioFileName = "audio_06012023094443961.wav"; var audioStream = File.OpenRead(HttpContext.Current.Server.MapPath($"~/audios/{audioFileName}"));
5. 优化异步等待逻辑
不要用循环Sleep等待异步操作,改用await(需将方法改为async):
public static async Task<object> MC() { // ... 其他代码 ... var resp = await client.PostAsync(/* 请求地址与内容 */); return resp.ReasonPhrase; }
额外检查:确保音频文件符合API要求——WAV格式、PCM编码、16kHz采样率、16位深度、单声道,且文件大小未超过服务层级限制。
内容的提问来源于stack exchange,提问作者Sarbjit Singh
相关产品推荐
相关产品推荐

