Commit 5466a93e authored by helinlin's avatar helinlin

添加阿里云音频识别demo

parent 380a87d9
package com.yeejoin.amos.speech.util;
import com.alibaba.nls.client.AccessToken;
import com.alibaba.nls.client.protocol.NlsClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import static com.yeejoin.amos.speech.util.SpeechConfig.AccessKeId;
import static com.yeejoin.amos.speech.util.SpeechConfig.AccessKeySecret;
/**
* 阿里云nlsClient语音识别客户端
* 应用全局创建一个NlsClient实例,默认服务地址为阿里云线上服务地址,默认值:wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1
*/
public class AppNslClient {
private static final Logger logger = LoggerFactory.getLogger(AppNslClientToken.class);
private volatile static NlsClient nlsClient;
private AppNslClient() {
}
public static NlsClient instance() {
if (nlsClient == null) {
synchronized (NlsClient.class) {
if (nlsClient == null) {
logger.warn("AppNslClient语音识别客户端为空,开始创建...");
nlsClient = new NlsClient(AppNslClientToken.instance().getToken());
return nlsClient;
}
}
}
//设置访问token
nlsClient.setToken(AppNslClientToken.instance().getToken());
return nlsClient;
}
}
/**
* AppNslClientToken
*/
class AppNslClientToken {
private static final Logger logger = LoggerFactory.getLogger(AppNslClientToken.class);
private volatile static AccessToken accessToken;
private static long getTokenTime;
private AppNslClientToken() {
}
public static AccessToken instance() {
if (accessToken == null) {
synchronized (NlsClient.class) {
if (accessToken == null) {
logger.warn("token为空,开始获取token...");
accessToken = getAccessToken();
getTokenTime = System.currentTimeMillis();
}
}
}
//token过期自更新
if (getTokenTime + accessToken.getExpireTime() <= System.currentTimeMillis()) {
logger.warn("token已过期,开始重新获取...");
accessToken = getAccessToken();
getTokenTime = System.currentTimeMillis();
} else {
long time = getTokenTime + accessToken.getExpireTime() - System.currentTimeMillis();
logger.warn("token过期还剩:" + "(" + time / (1000 * 60 * 60 * 24) + "天)");
}
return accessToken;
}
/**
* 获取访问Token,包含token和过期时间(2021-11-30测试Token过期时间为18天)
* 集成项目中,token放到缓存中,避免多次获取可能导致已进行的任务token失效
*
* @return token 访问token
*/
private static AccessToken getAccessToken() {
AccessToken accessToken = new AccessToken(AccessKeId, AccessKeySecret);
try {
accessToken.apply();
logger.warn("获取到最新的token: " + accessToken.getToken() + ", 过期时间: " + accessToken.getExpireTime() + "(" + accessToken.getExpireTime() / (1000 * 60 * 60 * 24) + "天)");
return accessToken;
} catch (IOException e) {
logger.error("获取语音识别客户端token失败!原因:" + e.getMessage());
throw new RuntimeException("获取语音识别客户端token失败!原因:" + e.getMessage());
}
}
}
......@@ -22,13 +22,7 @@ public class HttpUtil {
.build();
public static String sendPostFile(String url, HashMap<String, String> headers, File speechFile) {
RequestBody body;
if (!speechFile.isFile()) {
System.err.println("The filePath is not a file: " + speechFile.getPath());
return null;
} else {
body = RequestBody.create(MediaType.parse("application/octet-stream"), speechFile);
}
RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), speechFile);
Headers.Builder hb = new Headers.Builder();
if (headers != null && !headers.isEmpty()) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
......
package com.yeejoin.amos.speech.util;
import com.alibaba.nls.client.AccessToken;
import java.io.IOException;
/**
* 阿里云语音识别
* <p>
......@@ -23,23 +19,12 @@ import java.io.IOException;
* 商用版按每自然日使用量计费,无免费额度,不使用则不产生费用。北京时间每日24时,系统将自动对当日用量进行全量计算并计费,账单生成将稍有延迟。
* 开通商用版后,不建议再次降配为试用版。商用版降配试用版后,可用并发数将置为0,服务将无法继续使用。
*/
public class SpeechUtil {
public class SpeechConfig {
/**
* 测试信息
* 测试信息,可在阿里云上配置
*/
public static final String AccessKeId = "LTAI5t7mGN6dYoCwMdKiLTgt";
public static final String AccessKeySecret = "0LYdEnvKzQxBg0lpIahDp5rzB2r4Dp";
public static final String AppKey = "EG5fJBBIqkNMj6bM";
/**
* 获取访问Token(测试Token过期时间为18天)
*
* @return token
*/
public static String getToken() throws IOException {
AccessToken accessToken = new AccessToken(AccessKeId, AccessKeySecret);
accessToken.apply();
System.out.println("get token: " + accessToken.getToken() + ", expire time: " + accessToken.getExpireTime());
return accessToken.getToken();
}
}
......@@ -29,11 +29,7 @@ public class SpeechFlashRecognizerDemo {
String format = "mp3";
int sampleRate = 16000;
SpeechFlashRecognizerDemo demo = new SpeechFlashRecognizerDemo(new File(fileName));
try {
demo.process(SpeechUtil.getToken(), format, sampleRate);
} catch (IOException e) {
e.printStackTrace();
}
demo.process(AppNslClientToken.instance().getToken(), format, sampleRate);
}
public SpeechFlashRecognizerDemo(File speechFile) {
......@@ -49,7 +45,7 @@ public class SpeechFlashRecognizerDemo {
*/
public void process(String token, String format, int sampleRate) {
String request = "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer";
request = request + "?appkey=" + SpeechUtil.AppKey;
request = request + "?appkey=" + SpeechConfig.AppKey;
request = request + "&token=" + token;
request = request + "&format=" + format;
request = request + "&sample_rate=" + sampleRate;
......
......@@ -88,7 +88,7 @@ public class SpeechRecognizerDemo {
e.printStackTrace();
}
// 创建DefaultAcsClient实例并初始化
DefaultProfile profile = DefaultProfile.getProfile(REGIONID, SpeechUtil.AccessKeId, SpeechUtil.AccessKeySecret);
DefaultProfile profile = DefaultProfile.getProfile(REGIONID, SpeechConfig.AccessKeId, SpeechConfig.AccessKeySecret);
this.client = new DefaultAcsClient(profile);
}
......@@ -113,7 +113,7 @@ public class SpeechRecognizerDemo {
*/
JSONObject taskObject = new JSONObject();
// 设置appkey
taskObject.put(KEY_APP_KEY, SpeechUtil.AppKey);
taskObject.put(KEY_APP_KEY, SpeechConfig.AppKey);
// 设置音频文件访问链接
taskObject.put(KEY_FILE_LINK, fileLink);
// 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置。
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment