使用Google Speech REST API进行语音转文本时收到空白响应
排查Google Speech REST API返回空白响应的问题
我来帮你梳理下可能导致空白响应的几个关键点,结合你提供的代码逐一排查:
1. 音频格式与配置不匹配
你在config里指定了encoding: FLAC和sampleRateHertz: 16000,但首先要确认实际音频文件是否完全符合这个配置:
- 用工具(比如
ffmpeg)检查音频参数:
确保输出里的采样率是16000Hz,编码格式是FLAC。如果录音时是其他格式(比如MP3),转FLAC时参数错误,API会无法解析音频,返回空白结果。ffmpeg -i your_audio_file.flac
2. Base64编码可能存在换行或格式问题
你的代码里用Base64.encodeBase64(bytes)生成字节数组再转字符串,部分Base64实现会自动添加换行符,而Google API要求的是无换行的Base64字符串。建议直接使用专门的方法生成无换行的字符串:
// 替换原Base64编码逻辑 String encodedString = Base64.encodeBase64String(bytes); // 这个方法直接返回无换行的Base64字符串
另外,"" + encodedString这种拼接没必要,直接赋值给audio.put("content", encodedString)即可。
3. 检查HTTP请求的有效性
打印调试信息
在发送请求前,先打印生成的JSON内容,确认audio.content不是空字符串,且格式正确:
System.out.println("Request JSON: " + jsonObject.toString(2)); // 格式化输出方便查看
替换废弃的HttpClient
你用的DefaultHttpClient已经被Apache废弃,建议换成最新的CloseableHttpClient,同时打印响应状态码,判断请求是否成功:
// 替换原HttpClient请求逻辑 try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpPost post = new HttpPost("https://speech.googleapis.com/v1/speech:recognize?key=GOOGLE_API_KEY"); post.setHeader("Content-Type", "application/json; charset=UTF-8"); StringEntity entity = new StringEntity(jsonObject.toString(2), StandardCharsets.UTF_8); post.setEntity(entity); try (CloseableHttpResponse resp = httpClient.execute(post)) { int statusCode = resp.getStatusLine().getStatusCode(); Log.e("Response Status Code", "--------------" + statusCode); s = EntityUtils.toString(resp.getEntity(), StandardCharsets.UTF_8); Log.e("ExecuteTask Response", "--------------" + s); } } catch (Exception e) { e.printStackTrace(); }
如果状态码是200 OK但响应空白,说明音频本身有问题;如果是4xx或5xx,则是权限、参数或API配置问题。
4. 音频文件本身的问题
检查音频文件是否为空,或者录音时没有捕获到声音:
- 打印
encodedString的长度,如果长度极小(比如小于100),说明音频文件可能是空的或者损坏。 - 直接播放音频文件,确认有清晰的语音内容。
5. API密钥与权限验证
确认你的GOOGLE_API_KEY:
- 已经在Google Cloud Console启用了Speech-to-Text API。
- 没有超过API配额(配额不足一般会返回错误信息,但也可以在Cloud Console的配额页面检查)。
- 密钥没有被限制IP或其他访问规则。
内容的提问来源于stack exchange,提问作者Dhirendra Sengar
相关产品推荐
相关产品推荐

