上一篇
Java如何快速调用百度语音?
- 后端开发
- 2025-06-13
- 4730
使用百度语音识别Java SDK需先注册百度云账号,创建应用获取API Key和Secret Key,导入Java SDK后,编写代码调用语音识别接口,传入音频文件或流及配置参数(如音频格式、采样率),即可获取识别文本结果。
百度语音识别Java接入指南
核心原理与准备工作
百度语音识别(ASR)通过REST API提供音频转文字服务,Java接入需完成以下准备:
-
注册开发者账号
访问百度智能云官网,完成实名认证 -
创建语音技术应用
- 控制台 → 语音技术 → 创建应用
- 记录
API Key
和Secret Key
(后续获取Token必备)
-
音频文件要求
| 参数 | 要求 |
|————|———————–|
| 格式 | pcm/wav/amr/m4a |
| 采样率 | 16000Hz或8000Hz |
| 位深度 | 16bit |
| 声道 | 单声道 |
| 文件大小 | ≤60s(免费版) |
Java实现步骤(基于Spring Boot)
添加Maven依赖
<dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.16.11</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.15</version> </dependency>
获取Access Token(有效期30天)
public String getAccessToken(String apiKey, String secretKey) { String authUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials" + "&client_id=" + apiKey + "&client_secret=" + secretKey; try { URL url = new URL(authUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream())); String result = reader.lines().collect(Collectors.joining()); JsonObject jsonResult = JsonParser.parseString(result).getAsJsonObject(); return jsonResult.get("access_token").getAsString(); } catch (Exception e) { throw new RuntimeException("获取Token失败", e); } }
执行语音识别
public String asrRecognize(File audioFile, String token) { String url = "https://vop.baidu.com/server_api"; try { // 1. 读取音频文件并Base64编码 byte[] data = Files.readAllBytes(audioFile.toPath()); String audioBase64 = Base64.getEncoder().encodeToString(data); // 2. 构建JSON请求体 JsonObject params = new JsonObject(); params.addProperty("format", "wav"); params.addProperty("rate", 16000); params.addProperty("channel", 1); params.addProperty("token", token); params.addProperty("cuid", "YOUR_DEVICE_ID"); // 自定义设备标识 params.addProperty("speech", audioBase64); // 3. 发送HTTP请求 CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/json"); httpPost.setEntity(new StringEntity(params.toString())); // 4. 解析响应 CloseableHttpResponse response = httpClient.execute(httpPost); String result = EntityUtils.toString(response.getEntity()); JsonObject jsonResult = JsonParser.parseString(result).getAsJsonObject(); return jsonResult.getAsJsonArray("result").get(0).getAsString(); } catch (Exception e) { throw new RuntimeException("识别请求异常", e); } }
最佳实践与调优
-
性能优化建议
- 使用连接池管理HTTP请求(推荐Apache HttpClientPool)
- 异步处理:对于批量音频,采用线程池提交任务
- 本地音频预处理:通过FFmpeg统一转换格式
-
错误处理方案
// 在解析响应时添加错误码判断 if (jsonResult.has("error_code")) { int errorCode = jsonResult.get("error_code").getAsInt(); switch (errorCode) { case 3300 -> throw new ASRException("音频质量过差"); case 3301 -> throw new ASRException("认证失败"); case 3302 -> throw new ASRException("音频解码失败"); // 更多错误码参考官方文档 } }
-
实时语音流识别
- 使用WebSocket协议接入(文档见参考链接)
- 分片发送音频数据(每帧200ms)
- 处理中间结果(
sn
字段判断分片顺序)
常见问题解决
-
Q:返回
err_no: 3301
错误
→ 检查Token有效期,定期刷新Token(建议每日自动刷新) -
Q:中文识别结果乱码
→ 设置HTTP响应编码为UTF-8:EntityUtils.toString(response.getEntity(), "UTF-8")
-
Q:长音频识别失败
→ 需使用长语音识别专用接口:https://vop.baidu.com/pro_api
(需单独申请权限) -
Q:高并发场景超时
→ 调整连接参数:RequestConfig config = RequestConfig.custom() .setConnectTimeout(5000) // 连接超时 .setSocketTimeout(30000) // 数据传输超时 .build(); httpPost.setConfig(config);
安全与合规要求
-
数据隐私保护
- 音频需自行脱敏处理(如身份证号、银行卡号)
- 欧盟用户需遵守GDPR,建议启用百度云的数据加密服务
-
QPS限制
- 免费版:2QPS(每秒请求数)
- 付费版:可提升至50+ QPS(根据套餐调整)
-
授权建议
- 使用临时Token(通过STS服务获取临时安全令牌)
- 在服务端实现鉴权,避免客户端暴露API Key
权威引用说明
- 百度语音REST API文档:https://ai.baidu.com/ai-doc/SPEECH/Vk38lxily
- 错误码全集:https://ai.baidu.com/ai-doc/SPEECH/7k38lxpwf
- 长语音识别规范:https://ai.baidu.com/ai-doc/SPEECH/Gk4nlz8tc
本文代码基于百度智能云Java SDK 4.16.11版本验证,更新日期2025年10月
扩展建议:
- 需要说话人分离场景 → 接入语音分离服务(
diarization
参数) - 专业领域术语识别 → 定制语言模型(通过控制台上传行业词库)
- 实时字幕生成 → 结合WebSocket + 时间戳功能(
show_paragraph=true
参数)