IESM项目实训二
和另一位同学选择语音识别和文字识别库,最终选择百度语音和文字接口,初步尝试语音识别和文字识别调用方式。我主要负责语音识别相关功能,编写项目需要的工具类。
第一步:注册百度账号。可以申请免费资源进行项目测试,然后创建应用。
可以按照官方文档进行操作。
第二步:按照项目需求,有两种方式将库导入项目:
1、添加如下依赖至jeecg-boot-parent/pom.xml文件中。
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>${version}</version>
</dependency>
2、直接使用JAR包,步骤如下:
1. 在官方网站下载Java SDK压缩工具包。
2.将下载的aip-java-sdk-version.zip
解压后,复制到工程文件夹中。
3.在IDEA中导入添加至项目结构的库中。
4.添加SDK工具包aip-java-sdk-version.jar
和第三方依赖工具包json-20160810.jar
log4j-1.2.17.jar
。 其中,version为版本号。
实测,导入jar包的方式更安全,直接添加依赖可能会报错。
第三步:导入完成后,测试接口使用方式。
语音识别音频参数有两种传递方式:
// 对本地语音文件进行识别
String path = "D:\\code\\java-sdk\\speech_sdk\\src\\test\\resources\\16k_test.pcm";
JSONObject asrRes = client.asr(path, "pcm", 16000, null);
System.out.println(asrRes);
// 对语音二进制数据进行识别
byte[] data = Util.readFileByBytes(path); //readFileByBytes仅为获取二进制数据示例
JSONObject asrRes2 = client.asr(data, "pcm", 16000, null);
System.out.println(asrRes2);
path/data:语音文件所在路径或二进制数据, 语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写;
format:语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写。
返回结果格式如下:
// 成功返回
{
"err_no": 0,
"err_msg": "success.",
"corpus_no": "15984125203285346378",
"sn": "481D633F-73BA-726F-49EF-8659ACCC2F3D",
"result": ["12345"]
}
// 失败返回
{
"err_no": 2000,
"err_msg": "data empty.",
"sn": null
}
以String格式保存结果方式如下;
String resultText = asrRes.getJSONArray("result").getString(0);
resultText= toData(resultText);
语音识别工具类如下:
public class VoiceRecognition {
//语音识别结果
private static String resultText;
// 设置APPID/AK/SK
// 百度AI开发平台的控制台中创建一个语音应用即可获得
public static final String APP_ID = "26041279";
public static final String API_KEY = "SeVYDSPOfZxVDY3sSNQ9NzyK";
public static final String SECRET_KEY = "RtGRKVSnQBgSIIY7zCMfbHQzfAAgIGIi";
private static final AipSpeech aipSpeech = getAipSpeech();
//返回未经处理的识别结果
public void recognize(String path) {
if (this.recognizeVoice(path)) {
System.out.println("结果为:" + getResultText());
} else {
System.out.println("识别错误");
}
}
//用于识别成绩,去除识别结果中所有非数字字符
public String recognizeNum(byte[] data) {
if (this.recognizeDataVoice(data)) {
resultText=format(resultText);
System.out.println("结果为:" + getResultText());
} else {
resultText="";
System.out.println("识别错误");
}
return getResultText();
}
//getter获取识别结果
public static String getResultText() {
return resultText;
}
//初始化AipSpeech
public static AipSpeech getAipSpeech() {
// 初始化一个AipSpeech
AipSpeech aipSpeech = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络连接参数
aipSpeech.setConnectionTimeoutInMillis(2000);
aipSpeech.setSocketTimeoutInMillis(60000);
// 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//aipSpeech.setHttpProxy("proxy_host", proxy_port); // 设置http代理
//aipSpeech.setSocketProxy("proxy_host", proxy_port); // 设置socket代理
// 可选:设置log4j日志输出格式,若不设置,则使用默认配置
// 也可以直接通过jvm启动参数设置此环境变量
// System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
return aipSpeech;
}
//初步测试,使用已经录制好的音频文件,观察不同情况下的识别结果
public boolean recognizeVoice(String path) {
JSONObject asrRes = aipSpeech.asr(path, "wav", 16000, null);
//System.out.println(asrRes);
boolean result = false;
try {
if(asrRes.getString("err_msg").equals("success.")){
resultText = asrRes.getJSONArray("result").getString(0);
result=true;
}else{
result=false;
}
} catch (JSONException e) {
e.printStackTrace();
}
return result;
}
//实际使用过程中接收前端传递的数据流,识别语音
public boolean recognizeDataVoice(byte[] data) {
JSONObject asrRes = aipSpeech.asr(data, "wav", 16000, null);
boolean result = false;
try {
if(asrRes.getString("err_msg").equals("success.")){
//获取识别结果,保存为String
resultText = asrRes.getJSONArray("result").getString(0);
resultText= toData(resultText);
result=true;
}
} catch (JSONException e) {
e.printStackTrace();
}
return result;
}
//去除标点符号和其他非数字字符,每一个识别为成绩的结果都要进行处理,避免混入不必要信息
public static String format(String s){
//String str=s.replaceAll("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?|-]", "");
String str = s.replaceAll("[^0-9]", "");
str =str.replaceAll("\\s+","");//消除空格
return str;
}
//适用于同时录入姓名和成绩,去除数字标点符号获取姓名
public static String stuNameRecognize(String input){
String stuName=input.replaceAll("\\d+","");
stuName=input.replaceAll("\\p{Punct}", "");
return stuName;
}
//测试过程中发现部分数字会识别为大写形式,需要将大写数字转换为数字,避免录入成绩过程中识别为大写
public static String toData(String s){
String str=s.replace('零','0');
str=str.replace('一','1');
str=str.replace('二','2');
str=str.replace('三','3');
str=str.replace('四','4');
str=str.replace('五','5');
str=str.replace('六','6');
str=str.replace('七','7');
str=str.replace('八','8');
str=str.replace('九','9');
str=str.replace("十", "10");
return str;
}
//测试不同情况下识别结果,分析结果后进行对应处理
public static void main(String[] args){
VoiceRecognition voiceRecognition = new VoiceRecognition();
for (int i=1;i<=4;i++) {
//一般录制格式为MP3,需要进行格式转换后,再语音识别
String path = "C:/Users/26046/Downloads/test"+i+".pcm";
byte[] data = new byte[0];
try {
data = Util.readFileByBytes(path); //readFileByBytes仅为获取二进制数据示例
} catch (IOException e) {
e.printStackTrace();
}
voiceRecognition.recognizeNum(data);
}
}
}