使用Microsoft Cognitive Services遇不支持音频格式问题求助
解决方案
1. 修正前端MediaRecorder的录制格式
微软认知服务发音评估要求音频必须是PCM编码的标准WAV格式,参数需满足:16kHz采样率、16位深度、单声道。但浏览器原生MediaRecorder默认输出多为WebM(Chrome/Edge)或其他非PCM编码格式,即便后缀改为.wav,实际编码仍不兼容服务要求。
解决方式:
- 尝试强制指定MediaRecorder的MIME类型为PCM编码的WAV:
const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav; codecs=1' }); - 若浏览器不支持上述MIME类型,改用第三方库(如Recorder.js)直接录制PCM原始数据,再封装为标准WAV文件。
2. 确保后端IFormFile转存的正确性
前端传的Blob若格式正确,转存时需避免流操作失误:
- 转存前重置文件流指针,防止读取不完整:
using (var stream = new FileStream(tempFilePath, FileMode.Create)) { var audioStream = audioFile.OpenReadStream(); audioStream.Position = 0; await audioStream.CopyToAsync(stream); } - 用音频工具(如Audacity)打开转存后的
.wav文件,确认编码参数为PCM 16-bit、16kHz、单声道。
3. 修复Python接口调用的两个问题
3.1 解决"Unsupported audio format"错误
- 调用认知服务时,请求头必须设置
Content-Type: audio/wav,且请求体直接传入二进制音频数据,不能做额外编码; - Python读取临时文件时,务必用二进制模式:
with open(temp_wav_path, 'rb') as f: audio_data = f.read() - 确保代码中指定的音频参数(采样率、声道数)与实际文件完全一致。
3.2 解决JSON解析错误"Expecting value: line 1 column 1 (char 0)"
服务返回b'Unsupported audio format'是纯文本错误,并非JSON格式,直接调用response.json()会报错。需先判断响应状态码:
response = requests.post(api_url, data=audio_data, headers=headers) if response.status_code == 200: result = response.json() else: error_msg = response.text or response.content.decode('utf-8') print(f"错误信息:{error_msg}")
4. 验证中间文件合法性
将后端转存的临时WAV文件,直接上传至Azure门户的认知服务在线测试工具,确认文件本身是否符合服务要求,排除后端转存或前端录制的问题。
内容的提问来源于stack exchange,提问作者CitrusBoy
相关产品推荐
相关产品推荐

