You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:25:26