调用Azure Speech to Text API处理Blob存储中音频文件时遭遇415不支持的媒体类型错误
调用Azure Speech to Text API处理Blob存储中音频文件时遭遇415不支持的媒体类型错误
从你的代码和报错信息来看,415错误的核心原因大概率是请求体的格式传递错误,再加上一个字段名的拼写问题,我来帮你逐一梳理并修正:
1. 错误使用data参数传递JSON请求体
在你的requests.post调用中,你用data参数传入了字典格式的请求内容,同时在headers里指定了Content-Type: application/json。但这里有个关键问题:当你用data传字典时,requests库默认会把它编码为application/x-www-form-urlencoded格式,而不是你期望的JSON格式。这就导致Azure的API收到了不符合要求的媒体类型,直接返回415错误。
正确的做法是改用json参数来传递这个字典,requests会自动帮你把字典序列化为JSON字符串,并且自动匹配Content-Type: application/json(当然你保留headers里的这个字段也没问题)。
2. 字段名大小写不符合API要求
你的请求体里写的是"ContentUrls",但Azure Speech批量转录API要求的字段名是**contentUrls**(首字母小写的驼峰命名)。字段名不匹配也会导致API无法正确解析请求内容,加重格式错误的问题。
修正后的代码示例
resp = requests.post( url, json={ # 这里把data改成json参数 "displayName": filename, "locale": "en-GB", "contentContainerUrl": container_uri, "contentUrls": [content_uri], # 修正字段名为小写开头 "properties": { "diarizationEnabled": False, "wordLevelTimestampsEnabled": False, "punctuationMode": "DictatedAndAutomatic", "profanityFilterMode": "Masked" } }, headers={"Ocp-Apim-Subscription-Key": sub_key, "Content-Type": "application/json"} )
额外需要检查的点
除了上面的核心修正,你还可以排查以下两个常见问题:
- Blob文件的访问权限:如果你的存储容器是私有的,直接的Blob URL是无法被Azure Speech服务访问到的,你需要生成带SAS(共享访问签名)的URL,确保Speech服务有读取该Blob的权限。
- 音频文件格式兼容性:虽然你尝试过转换格式,但要确认文件是否符合Speech服务的要求,比如WAV文件推荐使用PCM 16kHz、16位、单声道的编码格式,其他不支持的编码也可能导致后续处理失败(不过这不是当前415错误的直接原因)。
修正后再测试一下,应该能解决415的问题了。
备注:内容来源于stack exchange,提问作者user28741964
相关产品推荐
相关产品推荐

