智能语音交互:Java SDK

智能语音交互:Java SDK

注意事项在使用SDK前,请先阅读接口说明,详情请参见接口说明。

从2.1.0版本开始原有nls-sdk-short-asr更名为nls-sdk-recognizer,

升级时需确认已删除nls-sdk-short-asr,并按编译提示添加相应回调方法。

下载安装从Maven服务器下载最新版本SDK,下载nls-sdk-java-demo。

依赖文件:

com.alibaba.nls

nls-sdk-recognizer

2.1.6

解压ZIP文件,在pom目录运行mvn package,会在target目录生成可执行JAR:nls-example-recognizer-2.0.0-jar-with-dependencies.jar,将JAR包拷贝至目标服务器,用于快速验证及压测服务。

服务验证:运行如下代码,并按提示提供相应参数。

运行后在命令执行目录生成logs/nls.log。

java -cp nls-example-recognizer-2.0.0-jar-with-dependencies.jar com.alibaba.nls.client.SpeechRecognizerDemo服务压测:运行如下代码,并按提示提供相应参数。ap-southeast-1

其中阿里云服务URL参数为: wss://nls-gateway-ap-southeast-1.aliyuncs.com/ws/v1 ,语音文件为16k采样率PCM格式文件,并发数根据您的购买情况进行选择。

java -jar nls-example-recognizer-2.0.0-jar-with-dependencies.jar说明 自行压测超过2并发会产生费用。

关键接口NlsClient:语音处理客户端,利用该客户端可以进行一句话识别、实时语音识别和语音合成的语音处理任务。该客户端为线程安全,建议全局仅创建一个实例。

SpeechRecognizer:一句话识别处理类,通过该接口设置请求参数,发送请求及声音数据。非线程安全。

SpeechRecognizerListener:识别结果监听类,监听识别结果。非线程安全。

更多介绍,请参见Java API接口说明。

重要 SDK调用注意事项:

NlsClient使用了Netty框架,NlsClient对象的创建会消耗一定时间和资源,一经创建可以重复使用。建议调用程序将NlsClient的创建和关闭与程序本身的生命周期结合。

SpeechRecognizer对象不可重复使用,一个识别任务对应一个SpeechRecognizer对象。例如,N个音频文件要进行N次识别任务,创建N个SpeechRecognizer对象。

SpeechRecognizerListener对象和SpeechRecognizer对象是一一对应的,不能将一个SpeechRecognizerListener对象设置到多个SpeechRecognizer对象中,否则不能将各识别任务区分开。

Java SDK依赖Netty网络库,如果您的应用依赖Netty,其版本需更新至4.1.17.Final及以上。

代码示例说明 下载nls-sample-16k.wav。

示例中使用的音频文件为16000Hz采样率,请在管控台中将appKey对应项目的模型设置为通用模型,以获取准确的识别效果。如果使用其他音频,请设置为支持该音频场景的模型,关于模型设置,请参见管理项目。

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

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.SpeechRecognizerListener;

import com.alibaba.nls.client.protocol.asr.SpeechRecognizerResponse;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

* 此示例演示了:

* ASR一句话识别API调用。

* 动态获取token。

* 通过本地文件模拟实时流发送。

* 识别耗时计算。

*/

public class SpeechRecognizerDemo {

private static final Logger logger = LoggerFactory.getLogger(SpeechRecognizerDemo.class);

private String appKey;

NlsClient client;

public SpeechRecognizerDemo(String appKey, String id, String secret, String url) {

this.appKey = appKey;

//应用全局创建一个NlsClient实例,默认服务地址为阿里云线上服务地址。

//获取token,实际使用时注意在accessToken.getExpireTime()过期前再次获取。

AccessToken accessToken = new AccessToken(id, secret);

try {

accessToken.apply();

System.out.println("get token: " + accessToken.getToken() + ", expire time: " + accessToken.getExpireTime());

if(url.isEmpty()) {

client = new NlsClient(accessToken.getToken());

}else {

client = new NlsClient(url, accessToken.getToken());

}

} catch (IOException e) {

e.printStackTrace();

}

}

private static SpeechRecognizerListener getRecognizerListener(int myOrder, String userParam) {

SpeechRecognizerListener listener = new SpeechRecognizerListener() {

//识别出中间结果。仅当setEnableIntermediateResult为true时,才会返回该消息。

@Override

public void onRecognitionResultChanged(SpeechRecognizerResponse response) {

//getName是获取事件名称,getStatus是获取状态码,getRecognizedText是语音识别文本。

System.out.println("name: " + response.getName() + ", status: " + response.getStatus() + ", result: " + response.getRecognizedText());

}

//识别完毕

@Override

public void onRecognitionCompleted(SpeechRecognizerResponse response) {

//getName是获取事件名称,getStatus是获取状态码,getRecognizedText是语音识别文本。

System.out.println("name: " + response.getName() + ", status: " + response.getStatus() + ", result: " + response.getRecognizedText());

}

@Override

public void onStarted(SpeechRecognizerResponse response) {

System.out.println("myOrder: " + myOrder + "; myParam: " + userParam + "; task_id: " + response.getTaskId());

}

@Override

public void onFail(SpeechRecognizerResponse response) {

//task_id是调用方和服务端通信的唯一标识,当遇到问题时,需要提供此task_id。

System.out.println("task_id: " + response.getTaskId() + ", status: " + response.getStatus() + ", status_text: " + response.getStatusText());

}

};

return listener;

}

//根据二进制数据大小计算对应的同等语音长度

//sampleRate仅支持8000或16000。

public static int getSleepDelta(int dataSize, int sampleRate) {

// 仅支持16位采样。

int sampleBytes = 16;

// 仅支持单通道。

int soundChannel = 1;

return (dataSize * 10 * 8000) / (160 * sampleRate);

}

public void process(String filepath, int sampleRate) {

SpeechRecognizer recognizer = null;

try {

//传递用户自定义参数

String myParam = "user-param";

int myOrder = 1234;

SpeechRecognizerListener listener = getRecognizerListener(myOrder, myParam);

recognizer = new SpeechRecognizer(client, listener);

recognizer.setAppKey(appKey);

//设置音频编码格式。如果是OPUS文件,请设置为InputFormatEnum.OPUS。

recognizer.setFormat(InputFormatEnum.PCM);

//设置音频采样率

if(sampleRate == 16000) {

recognizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);

} else if(sampleRate == 8000) {

recognizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_8K);

}

//设置是否返回中间识别结果

recognizer.setEnableIntermediateResult(true);

//此方法将以上参数设置序列化为JSON发送给服务端,并等待服务端确认。

long now = System.currentTimeMillis();

recognizer.start();

logger.info("ASR start latency : " + (System.currentTimeMillis() - now) + " ms");

File file = new File(filepath);

FileInputStream fis = new FileInputStream(file);

byte[] b = new byte[3200];

int len;

while ((len = fis.read(b)) > 0) {

logger.info("send data pack length: " + len);

recognizer.send(b, len);

//本案例用读取本地文件的形式模拟实时获取语音流,因为读取速度较快,这里需要设置sleep时长。

// 如果实时获取语音则无需设置sleep时长,如果是8k采样率语音第二个参数设置为8000。

int deltaSleep = getSleepDelta(len, sampleRate);

Thread.sleep(deltaSleep);

}

//通知服务端语音数据发送完毕,等待服务端处理完成。

now = System.currentTimeMillis();

//计算实际延迟,调用stop返回之后一般即是识别结果返回时间。

logger.info("ASR wait for complete");

recognizer.stop();

logger.info("ASR stop latency : " + (System.currentTimeMillis() - now) + " ms");

fis.close();

} catch (Exception e) {

System.err.println(e.getMessage());

} finally {

//关闭连接

if (null != recognizer) {

recognizer.close();

}

}

}

public void shutdown() {

client.shutdown();

}

public static void main(String[] args) throws Exception {

String appKey = null; //填写appkey

String id = null; //填写AccessKey Id

String secret = null; //填写AccessKey Secret

String url = ""; // 默认值:wss://nls-gateway-ap-southeast-1.aliyuncs.com/ws/v1

if (args.length == 3) {

appKey = args[0];

id = args[1];

secret = args[2];

} else if (args.length == 4) {

appKey = args[0];

id = args[1];

secret = args[2];

url = args[3];

} else {

System.err.println("run error, need params(url is optional): " + " [url]");

System.exit(-1);

}

SpeechRecognizerDemo demo = new SpeechRecognizerDemo(appKey, id, secret, url);

//本案例使用本地文件模拟发送实时流数据。

demo.process("./nls-sample-16k.wav", 16000);

//demo.process("./nls-sample.opus", 16000);

demo.shutdown();

}

}

相关推荐

怎么追到白富美?3步让你走上人生巅峰
365bet中文官网

怎么追到白富美?3步让你走上人生巅峰

📅 08-15 👁️ 7840
VMware虚拟机怎么安装win7_VMware虚拟机安装win7系统图文教程
《详测魔兽71到80升级多久?WLK怀旧服全攻略》