当前位置: 首页 > 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.jsqmd.com/news/860733/

相关文章:

  • 2026养发加盟标杆项目推荐:黑奥秘VS丝域,谁是创业优选? - 品牌企业推荐师(官方)
  • YOBECON,和现代消费者一起关注“干净天然” - 品牌企业推荐师(官方)
  • 2026 十大养发加盟实力品牌排行榜|创业避坑干货,选错直接白亏钱 - 品牌企业推荐师(官方)
  • 2026年免费图片去水印工具盘点:在线软件和手机APP如何选?实测推荐 - 科技热点发布
  • 2026东莞专业搬家公司推荐 精密仪器搬运安全有保障 - 从来都是英雄出少年
  • 2026-05-21
  • 172号卡:一个数字,看懂一个平台的诚意.首码10000 - 172号卡
  • 2026东莞正规搬家公司避坑指南 隐性消费套路大揭秘 - 从来都是英雄出少年
  • 5.21 最新!南京黄金回收榜单:3 家门店权威对比,附避坑攻略 - 资讯纵览
  • APK Installer:重新定义Windows运行Android应用的突破性方案
  • 2026芜湖黄金回收商家推荐:正规门店,监控录像保安全 - 品牌企业推荐师(官方)
  • Python爬虫实战:requests + BeautifulSoup4采集经典标靶网站哲理名言,并导出结构化文件!
  • 2026 杭州防水漏水维修公司靠谱品牌排名 - 资讯纵览
  • 2026年想在赣州买高性价比沙发 这些靠谱品牌放心选不踩坑 - 品牌企业推荐师(官方)
  • EASY-HWID-SPOOFER:Windows硬件指纹保护终极方案
  • Android OkHttp 连接 HTTPS 抛出 SSL 握手异常信任链如何解决
  • 2026年沛纳海售后测评:全国50大网点收费标准与服务全盘点 - 资讯纵览
  • 2026年UPS不间断电源厂家哪家强?从需求分析到验收维保的标准化操作手册 - 资讯纵览
  • 灯塔口碑好的养发馆品牌推荐?黑奥秘AI智能检测设备,改善效果可视化 - 美业信息观察
  • 猫抓Cat-Catch:浏览器视频下载与资源嗅探的终极解决方案
  • AMD Ryzen SMU Debug Tool完整指南:轻松掌握硬件级调试的5个关键步骤
  • Python初学者项目练习26--计算列表数字的和(内附列表操作总结)
  • Java智能地址解析终极指南:企业级架构设计与高性能实现方案
  • 扎带哪家好?工业扎带源头工厂认准浙江英得特,17 年深耕配线器材行业实力领跑 - 星城方舟
  • 深度探索C++对象模型 学习笔记 第五章 构造、解构、拷贝语意学(1)
  • 2026金属加工液流量开关、流量传感器排行榜:苏州贝特凭军工标准稳居榜首 - 资讯纵览
  • 【卷卷观察】Google I/O 炸场背后:AI 行业正在经历一场“越南战争“
  • 2026年一键生成论文工具实测排行,哪款真正适合顺利通关?
  • 臻品汇-甘孜州仁启方矩创新科技客服咨询AI流量赋能,重塑智能体验新标杆腾飞 - 资讯纵览
  • QueryExcel:Excel批量查询终极指南,5分钟搞定100个文件搜索难题