阿里云一句话识别,Java例子
1. 编写目的
介绍一下阿里云这一产品,并且在所给的例子上因为需要加一定的修改,做成自己想要的效果。
注重官方文档:
https://help.aliyun.com/document_detail/84459.html?spm=a2c4g.11186623.6.560.77385397x0OfXk
2. 效果展示
- 到处jar包后,以命令行的形式运行此jar,并指定语音文件的地址。
java -jar aliasr.jar "d:/YAN/nls-sample-16k.wav"
- 回车后可以看到效果如下:
效果说明 nls-sample-16k.wav文件是在官网上文档中下载的一个测试文件,识别后输出的结果就是“北京的天气”。
3. 具体步骤
- 在官网阿里云智能语音交互 上登录注册一个免费的项目,这个过程在此不多说了。
- 复制项目的appkey,并且获取AccessToken,注意获得AccessToken的位置和复制appkey的位置不一样。.
- 使用Eclipse,新建一个Maven项目。并且添加依赖包如下:
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-short-asr</artifactId>
<version>2.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.26</version>
</dependency>
- 新建一个类SpeechRecognizerDemo,然后复制下面的代码。注意修改其中的appid和AccessToken。
package cn.smileyan.asr;
import com.alibaba.nls.client.protocol.InputFormatEnum;
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizer;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerResponse;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
/**
* SpeechRecognizerDemo class
*
* 一句话识别Demo
*/
public class SpeechRecognizerDemo {
private String appKey;
private String accessToken;
NlsClient client;
/**
* @param appKey
* @param token
*/
public SpeechRecognizerDemo(String appKey, String token) {
this.appKey = appKey;
this.accessToken = token;
// Step0 创建NlsClient实例,应用全局创建一个即可,默认服务地址为阿里云线上服务地址
client = new NlsClient(accessToken);
}
private static SpeechRecognizerListener getRecognizerListener() {
SpeechRecognizerListener listener = new SpeechRecognizerListener() {
// 识别出中间结果.服务端识别出一个字或词时会返回此消息.仅当setEnableIntermediateResult(true)时,才会有此类消息返回
@Override
public void onRecognitionResultChanged(SpeechRecognizerResponse response) {
// 事件名称 RecognitionResultChanged
System.out.println("name: " + response.getName() +
// 状态码 20000000 表示识别成功
", status: " + response.getStatus() +
// 一句话识别的中间结果
", result: " + response.getRecognizedText());
}
// 识别完毕
@Override
public void onRecognitionCompleted(SpeechRecognizerResponse response) {
// 事件名称 RecognitionCompleted
System.out.println("name: " + response.getName() +
// 状态码 20000000 表示识别成功
", status: " + response.getStatus() +
// 一句话识别的完整结果
", result: " + response.getRecognizedText());
}
};
return listener;
}
public void process(InputStream ins) {
SpeechRecognizer recognizer = null;
try {
// Step1 创建实例,建立连接
recognizer = new SpeechRecognizer(client, getRecognizerListener());
recognizer.setAppKey(appKey);
// 设置音频编码格式
recognizer.setFormat(InputFormatEnum.PCM);
// 设置音频采样率
recognizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
// 设置是否返回中间识别结果
recognizer.setEnableIntermediateResult(true);
// Step2 此方法将以上参数设置序列化为json发送给服务端,并等待服务端确认
recognizer.start();
// Step3 语音数据来自声音文件用此方法,控制发送速率;若语音来自实时录音,不需控制发送速率直接调用 recognizer.sent(ins)即可
recognizer.send(ins, 3200, 100);
// Step4 通知服务端语音数据发送完毕,等待服务端处理完成
recognizer.stop();
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
// Step5 关闭连接
if (null != recognizer) {
recognizer.close();
}
}
}
public void shutdown() {
client.shutdown();
}
public static void main(String[] args) {
if (args.length < 1) {
System.err.println("SpeechRecognizerDemo need params: <wav>");
System.exit(-1);
}
// 为了方便,请使用自己的key 和 token
String appKey = "输入自己的appKey";
String token = "输入自己的token";
/**
* 由于本人在使用官网给的例子的时候发现有些不便,所以做了一定的修改。
* 如果有什么问题的话,欢迎交流。
* Smileyan
*/
SpeechRecognizerDemo demo = new SpeechRecognizerDemo(appKey, token);
File f= new File(""+args[0]) ; // 声明File对象
InputStream ins = null;
try {
ins = new FileInputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (null == ins) {
System.err.println("open the audio file failed!");
System.exit(-1);
}
demo.process(ins);
demo.shutdown();
}
}
- 修改成自己的key和token后,在eclipse上运行肯定是会提示:SpeechRecognizerDemo need params: ,需要导出jar文件再带参数运行。
推荐使用eclipse也是因为eclipse导出jar可能更加方便一些。
4. 总结
注意这里面的java代码绝大多数都是来自官网的示例代码,只是根据自己修改做了一定的修改,主要原因是使用官网的代码总是提示找不到wav文件(open the audio file failed!),所以做了一定的修改,在自己使用的win 10系统上,和centOS7是完全可以使用的。
重要提示: 如果遇到了什么问题,欢迎留言交流!
Smileyan 2019年3月15日