阿里云一句话识别,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"
    
  • 回车后可以看到效果如下:
    阿里云一句话识别,Java例子
    效果说明 nls-sample-16k.wav文件是在官网上文档中下载的一个测试文件,识别后输出的结果就是“北京的天气”。

3. 具体步骤

  1. 在官网阿里云智能语音交互 上登录注册一个免费的项目,这个过程在此不多说了。
  2. 复制项目的appkey,并且获取AccessToken,注意获得AccessToken的位置和复制appkey的位置不一样。. 阿里云一句话识别,Java例子
  3. 使用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>
  1. 新建一个类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();
    }
}

  1. 修改成自己的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日