Qt调用Google Speech-to-Text API在Windows报Bad Request求助
Qt调用Google Speech-to-Text API在Windows报Bad Request的解决方法
问题根源分析
代码在Ubuntu正常但Windows报错,核心是跨平台下的二进制文件处理、请求格式、音频参数不匹配这几个点,导致Google API返回Bad Request。
具体修复方案
1. 修复音频文件打开方式
打开音频文件时使用了QIODevice::Text模式,这会在Windows下对二进制FLAC音频进行换行符转换,破坏文件结构。修改为仅只读二进制模式:
if(!audioFile.open(QIODevice::ReadOnly)){ // 移除QIODevice::Text QMessageBox::critical(0,"Error",fileName+" Not found!"); ui->pushButton_4->setText("Speech to text"); return; }
2. 统一音频文件名与编码格式
录制时设置的编码是FLAC,但输出文件名是.wav,Windows下Qt的MediaRecorder无法正确将FLAC内容写入WAV容器,导致音频格式不符合API要求。同步修改文件名:
// 录制部分的文件名修改 QString fileName = QDir::currentPath() + "/audio.flac"; m_audioRecorder->setOutputLocation(QUrl::fromLocalFile(fileName)); // 转文本部分的文件名同步修改 QString fileName = QDir::currentPath() + "/audio.flac";
3. 修正请求的Content-Type
发送请求时设置的audio/x-flac是错误的,因为请求体是包含音频base64的JSON数据,正确的Content-Type应为application/json:
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
4. 确保采样率参数匹配
录制时设置settings.setSampleRate(0)会让系统自动选择采样率,但请求中硬编码了44100,Windows下实际采样率可能不匹配,导致API校验失败。两种解决方式:
方案一:录制时明确设置采样率
// 录制部分修改采样率设置 settings.setSampleRate(44100); // 替换原有的0
方案二:获取实际录制的采样率
录制完成后读取实际采样率,填入请求参数:
// 在speechToTextCall()中添加 int actualSampleRate = m_audioRecorder->actualAudioSettings().sampleRate(); // 修改config中的采样率 config["sampleRateHertz"]=actualSampleRate;
5. 校验API Key的正确性
错误信息中出现key=,myKey>,说明URL参数拼接存在异常。检查query.addQueryItem("key","myKeyHere...")中的API Key是否正确,避免多余的逗号、尖括号等符号。
额外调试建议
- 发送请求前打印
jsonData内容,检查音频base64编码和config参数是否符合预期。 - 使用Google Speech-to-Text的官方测试工具,提交本地生成的FLAC文件和对应JSON请求,验证是否能正常返回结果,排除API Key或音频本身的问题。
内容的提问来源于stack exchange,提问作者Sadam Hussain
相关产品推荐
相关产品推荐

