当前位置: 首页 > news >正文

冲刺博客6

1.昨天的成就
对巡检计划故障管理和巡检工单管理添加语音助手
2.遇到的困难
使用百度的语音识别模型需要添加音频文件格式转换的代码
3.今天的任务
对保养计划管理和保养工单管理添加语音助手
4.代码嵌入
package com.yunwei.util;

import java.io.;
import java.net.
;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class BaiduVoiceUtil {

// 百度语音识别API配置
// 已配置您的百度API Key和Secret Key
private static final String API_KEY = "htYRA8zD7J1Kx4FZFhx1YKZh";
private static final String SECRET_KEY = "H3orTPmP1UQP2tShn5vG1qW0Er78CjPg";

// 获取Access Token的URL
private static final String TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token";

// 语音识别API URL - 使用标准版本
private static final String ASR_URL = "https://vop.baidu.com/server_api";

// 缓存Access Token
private static String cachedAccessToken = null;
private static long tokenExpireTime = 0;

/**
* 获取百度Access Token (带缓存)
*/
public static String getAccessToken() throws Exception {
// 如果缓存的token还没过期,直接返回
if (cachedAccessToken != null && System.currentTimeMillis() < tokenExpireTime) {
return cachedAccessToken;
}

String url = TOKEN_URL + "?grant_type=client_credentials" +
"&client_id=" + API_KEY +
"&client_secret=" + SECRET_KEY;

URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setConnectTimeout(15000);
con.setReadTimeout(15000);

int responseCode = con.getResponseCode();
System.out.println("获取Token HTTP Code: " + responseCode);

InputStream inputStream = (responseCode == 200) ? con.getInputStream() : con.getErrorStream();
try (BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}

String json = response.toString();
System.out.println("获取Token响应: " + json);

if (json.contains("access_token")) {
int start = json.indexOf(""access_token":"") + 16;
int end = json.indexOf(""", start);
cachedAccessToken = json.substring(start, end);

// Token有效期通常是30天,我们设25天缓存
tokenExpireTime = System.currentTimeMillis() + 25L * 24 * 60 * 60 * 1000;
System.out.println("Token获取成功: " + cachedAccessToken.substring(0, 20) + "...");
return cachedAccessToken;
}
throw new Exception("获取Token失败: " + json);
}
}

/**
* 语音识别 - 将音频文件转换为文字
* @param audioBytes 音频数据
* @param format 音频格式 (webm, wav, pcm, amr等)
* @return 识别后的文字
*/
public static String speechToText(byte[] audioBytes, String format) throws Exception {
System.out.println("====== 开始百度语音识别 ======");
System.out.println("音频大小: " + audioBytes.length + " 字节");
System.out.println("尝试格式: " + format);

String accessToken = getAccessToken();
if (accessToken == null) {
throw new Exception("获取Access Token失败");
}
System.out.println("Access Token获取成功");

// 构建请求JSON
String base64Audio = Base64.getEncoder().encodeToString(audioBytes);

String jsonRequest = "{" +
""format":"" + format + ""," +
""rate":16000," +
""channel":1," +
""cuid":"yunwei-system"," +
""token":"" + accessToken + ""," +
""len":" + audioBytes.length + "," +
""speech":"" + base64Audio + """ +
"}";

System.out.println("请求JSON构建完成,长度: " + jsonRequest.length());

URL obj = new URL(ASR_URL);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
con.setConnectTimeout(15000);
con.setReadTimeout(15000);

System.out.println("正在发送请求到百度...");
try (OutputStream os = con.getOutputStream()) {
os.write(jsonRequest.getBytes(StandardCharsets.UTF_8));
}

int responseCode = con.getResponseCode();
System.out.println("百度响应HTTP Code: " + responseCode);

InputStream inputStream = (responseCode == 200) ? con.getInputStream() : con.getErrorStream();
try (BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}

String json = response.toString();
System.out.println("百度API完整响应: " + json);

if (json.contains(""err_no":0")) {
// 查找 result 数组
int resultStart = json.indexOf(""result":[");
if (resultStart > 0) {
int start = resultStart + 9;
int end = json.indexOf("]", start);
String resultArray = json.substring(start, end).trim();

System.out.println("Result Array: " + resultArray);

// 提取第一个结果
if (resultArray.length() > 2) { // 至少有 "x"
// 去掉开头和结尾的引号
int firstQuote = resultArray.indexOf(""");
int lastQuote = resultArray.lastIndexOf(""");
if (firstQuote >= 0 && lastQuote > firstQuote) {
String result = resultArray.substring(firstQuote + 1, lastQuote);
System.out.println("✅ 识别结果: [" + result + "]");
System.out.println("====== 识别完成 ======");

if (result.trim().length() > 0) {
return result;
} else {
System.out.println("识别结果为空字符串");
return "";
}
}
} else if (resultArray.equals("""")) {
System.out.println("识别结果为空");
return "";
}
}

System.out.println("识别结果为空或格式不对,但百度返回成功");
return "";
}

throw new Exception("识别失败,百度返回: " + json);
}
}

/**
* 语音识别 - 自动尝试多种格式
*/
public static String speechToText(byte[] audioBytes) throws Exception {
// 优先尝试 wav(百度支持最好)
try {
System.out.println("优先尝试 wav 格式...");
return speechToText(audioBytes, "wav");
} catch (Exception e) {
System.out.println("wav格式失败,尝试其他格式: " + e.getMessage());
}

// 尝试 webm
try {
System.out.println("尝试 webm 格式...");
return speechToText(audioBytes, "webm");
} catch (Exception e) {
System.out.println("webm格式失败: " + e.getMessage());
}

// 最后尝试 pcm
System.out.println("最后尝试 pcm 格式...");
return speechToText(audioBytes, "pcm");
}

/**
* 设置API Key和Secret Key
*/
public static void setCredentials(String apiKey, String secretKey) {
System.out.println("百度语音识别已配置");
}
}

http://www.zskr.cn/news/1340764.html

相关文章:

  • 2026 十大养发加盟实力品牌排行榜|创业避坑干货,选错直接白亏钱 - 品牌企业推荐师(官方)
  • 2026东莞正规搬家公司避坑指南 隐性消费套路大揭秘 - 从来都是英雄出少年
  • 灯塔口碑好的养发馆品牌推荐?黑奥秘AI智能检测设备,改善效果可视化 - 美业信息观察
  • 猫抓Cat-Catch:浏览器视频下载与资源嗅探的终极解决方案
  • Python爬虫实战:requests + BeautifulSoup4采集经典标靶网站哲理名言,并导出结构化文件!
  • 2026金属加工液流量开关、流量传感器排行榜:苏州贝特凭军工标准稳居榜首 - 资讯纵览
  • 基于STM32的温室大棚智能监控与无线调控系统设计
  • LLamaEmbedder 为什么不准?(核心原因)
  • 2026深圳搬家公司排名 5家靠谱机构实测推荐 - 从来都是英雄出少年
  • 5.21 西安今日金价|3 家回收商深度对比,本地人卖金参考 - 资讯纵览
  • 匠心铸杆,守护平安—四川耀霖深耕成都交通杆件交安杆件十五年 - 资讯纵览
  • Linux 进程从入门到实战(一)
  • 遥测数据定义的生产级落地规范指南
  • Python初学者项目练习26--计算列表数字的和(内附列表操作总结)
  • 5大核心功能深度解析:N_m3u8DL-RE流媒体下载工具终极指南
  • 许昌采购/质量/项目岗考证避坑:众智商学院6证合报,一站式搞定CPPM/PMP/SCMP/六西格玛/中级经济师/CCAA - 众智商学院课程中心
  • 徐海君麻辣烫汤底用清水还是骨汤?正宗老式味道答案揭晓 - 中媒介
  • 飞利猫官方重磅通知:推荐码全面更新,仅 00500 正规有效
  • 2025_NIPS_Language Models Don‘t Always Say What They Think: Unfaithful Explanations in Chain-of-T...
  • 搭建美妆小程序,纯展示产品类型的,怎样做更适合中小商家?
  • 工程化视角:通用AI工具为何在沈阳实体店“水土不服”?
  • Linux系统编程—基础IO
  • Cursor + Claude Code
  • 最近面完 30 个想转 AI 测试的人,我人麻了:80% 都踩了这 4 个坑!
  • CFD 差价合约
  • 基于 Python 有限元法的光子微腔仿真:从理论到代码实现
  • 多语言交易所源码/币币交易+期权交易+永续合约+Defi借贷+新币申购+矿机理财/前端uniapp纯源码+后端php
  • 电力设备RK3568/RK3576+FPGA,多系统混合部署Linux+RTOS RT-THREAD,强实时性
  • 【软考高级架构】案例题考前突击——构建可观测与弹性服务架构的实践设计
  • 【YOLOv8多模态融合改进】| IEEE2025 分层特征融合模块HFF 自适应权重 + 三重注意力,强化弱小目标细节保留