Commit f17dbfbf authored by helinlin's avatar helinlin

添加阿里云音频识别接口

parent f628f8db
......@@ -32,16 +32,16 @@ public class AudioToText {
//启动两个监听端口监听推送进来的2路语音流
ServerSocket serverSocket1 = initServerSocketPort();
ServerSocket serverSocket2 = initServerSocketPort();
//识别的关键字
AudioKeyWord audioKeyWord = new AudioKeyWord();
logger.warn("myNumber监听的端口为:" + serverSocket1.getLocalPort() + " callerNumber监听的端口为:" + serverSocket2.getLocalPort());
//我的语音流
Thread thread1 = new Thread(() -> {
AppSpeechTranscriber transcriber = new AppSpeechTranscriber(new SpeechTranscriberListener(myNumber, emqKeeper), serverSocket1);
transcriber.process();
new AppSpeechTranscriber(new SpeechTranscriberListener(myNumber, myNumber, emqKeeper, audioKeyWord), serverSocket1).process();
});
//呼入的语音流
Thread thread2 = new Thread(() -> {
AppSpeechTranscriber transcriber = new AppSpeechTranscriber(new SpeechTranscriberListener(callerNumber, emqKeeper), serverSocket2);
transcriber.process();
new AppSpeechTranscriber(new SpeechTranscriberListener(callerNumber, myNumber, emqKeeper, audioKeyWord), serverSocket2).process();
});
thread1.setUncaughtExceptionHandler(new SubUncaughtExceptionHandler(serverSocket1));
thread2.setUncaughtExceptionHandler(new SubUncaughtExceptionHandler(serverSocket2));
......
......@@ -19,7 +19,9 @@ import java.util.concurrent.TimeUnit;
public class SocketClient {
private static final Logger logger = LoggerFactory.getLogger(SocketClient.class);
private static final String[] testFilePath = {
"D:\\ffmpeg-4.4-full_build-shared\\bin\\out.pcm",
"D:\\ffmpeg-4.4-full_build-shared\\bin\\out2.pcm",
"D:\\ffmpeg-4.4-full_build-shared\\bin\\out3.pcm",
"D:\\ffmpeg-4.4-full_build-shared\\bin\\out4.pcm",
};
public static void main(String[] args) {
......
......@@ -19,16 +19,17 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
public static final int RESULT_SUCCESS_CODE = 20000000;
//识别的记录
List<AudioRecord> audioRecords = new ArrayList<>();
//识别的关键字
AudioKeyWord audioKeyWord = new AudioKeyWord();
//当前识别的音频来源
private final String number;
private final String recordSendNumber;
private final String keywordSendNumber;
//mqtt客户端
private final EmqKeeper emqKeeper;
private final AudioKeyWord audioKeyWord;
public SpeechTranscriberListener(String number, EmqKeeper emqKeeper) {
this.number = number;
public SpeechTranscriberListener(String recordSendNumber, String keywordSendNumber, EmqKeeper emqKeeper, AudioKeyWord audioKeyWord) {
this.recordSendNumber = recordSendNumber;
this.keywordSendNumber = keywordSendNumber;
this.emqKeeper = emqKeeper;
this.audioKeyWord = audioKeyWord;
}
/**
......@@ -48,8 +49,8 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
//当前已处理的音频时长,单位为毫秒。
", time: " + response.getTransSentenceTime());
if (response.getStatus() == RESULT_SUCCESS_CODE) {
sendToMqtt(response, audioRecords, number);
extractKeyWord(response, audioKeyWord, number);
sendToMqtt(response, audioRecords);
extractKeyWord(response, audioKeyWord);
} else {
logger.error("异常的相应结果,响应码:" + response.getStatus());
}
......@@ -131,7 +132,7 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
* @param audioRecords 历史识别记录
*/
@Async
public void sendToMqtt(SpeechTranscriberResponse response, List<AudioRecord> audioRecords, String number) {
public void sendToMqtt(SpeechTranscriberResponse response, List<AudioRecord> audioRecords) {
AudioRecord audioRecord = new AudioRecord.AudioRecordBuilder()
.type(response.getTransSentenceIndex() % 2) // TODO 区别说话角色
.taskId(response.getTaskId())
......@@ -151,7 +152,7 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
try {
ObjectMapper objectMapper = new ObjectMapper();
emqKeeper.getMqttClient().publish(
MessageType.RECORD.getName() + "_" + number,
MessageType.RECORD.getName() + "/" + recordSendNumber,
objectMapper.writeValueAsString(audioRecord).getBytes(),
RuleConfig.DEFAULT_QOS, true);
} catch (Exception e) {
......@@ -167,7 +168,7 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
* @param audioKeyWord //关键字结果集
*/
@Async
public void extractKeyWord(SpeechTranscriberResponse response, AudioKeyWord audioKeyWord, String number) {
public void extractKeyWord(SpeechTranscriberResponse response, AudioKeyWord audioKeyWord) {
try {
String result = response.getTransSentenceText();
//寻找关键字
......@@ -184,7 +185,7 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
ObjectMapper objectMapper = new ObjectMapper();
byte[] bytes = objectMapper.writeValueAsString(audioKeyWord.getValues()).getBytes();
emqKeeper.getMqttClient().publish(
MessageType.KEYWORD.getName() + "_" + number,
MessageType.KEYWORD.getName() + "/" + keywordSendNumber,
bytes,
RuleConfig.DEFAULT_QOS, true);
} catch (Exception e) {
......@@ -193,3 +194,4 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
}
}
}
......@@ -13,6 +13,7 @@ import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
@RestController
@Api(tags = "语音转文字Api")
......@@ -44,12 +45,32 @@ public class Audio2TextController {
@GetMapping("/startSendAudio")
@ApiOperation(httpMethod = "GET", value = "测试语音转文字第二步", notes = "测试语音转文字第二步")
public String startSendAudio(@RequestParam int port, Integer type) {
if(type==null) type=0;
if (type == null) type = 0;
socketClient.process(port, type);
return "success";
}
/**
* 测试语音转文字融合接口
*
* @param myNumber 我的手机号
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping("/startConvertAndSendAudio")
@ApiOperation(httpMethod = "GET", value = "测试语音转文字融合接口", notes = "测试语音转文字融合接口")
public HashMap<String, Integer> startConvertAndSendAudio(@RequestParam String myNumber, @RequestParam String callerNumber) {
HashMap<String, Integer> convert = audioToText.convert(myNumber, callerNumber);
try {
TimeUnit.SECONDS.sleep(1);
socketClient.process(convert.get(myNumber), 0);
socketClient.process(convert.get(callerNumber), 1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return convert;
}
/**
* 第一步收到转换请求后,启动两个serverSocket,监听不同端口
* 第一步调用语音融合系统的API并传递两个监听的端口号和本机IP地址
* 第三步serverSocket收到数据请求,开始将数据推至阿里云语音识别系统进行识别
......
......@@ -12,6 +12,7 @@ import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
/**
......@@ -25,11 +26,22 @@ public class AppSpeechTranscriber {
private static final Logger logger = LoggerFactory.getLogger(AppSpeechTranscriber.class);
private final SpeechTranscriberListener listener;
private final ServerSocket serverSocket;
//private Timer serverSocketTimeoutTimer;
private final Timer serverSocketTimeoutTimer;
private final TimerTask timerTask;
public AppSpeechTranscriber(SpeechTranscriberListener listener, ServerSocket serverSocket) {
this.listener = listener;
this.serverSocket = serverSocket;
serverSocketTimeoutTimer = new Timer();
//60s未收到任何请求,直接关闭监听
timerTask = new TimerTask() {
@Override
public void run() {
logger.warn("serverSocket,port:" + serverSocket.getLocalPort() + " 等待60s无应答即将自动关闭!");
closeServerSocket();
}
};
serverSocketTimeoutTimer.schedule(timerTask, 1000 * 60);
}
/**
......@@ -41,15 +53,15 @@ public class AppSpeechTranscriber {
//启动ServerSocket等待接收音频数据,只接受一次请求
logger.warn("serverSocket已启动,地址:" + serverSocket.getInetAddress().getHostAddress()
+ "监听端口:" + serverSocket.getLocalPort() + " 等待语音融合系统推送数据...");
Socket socket = serverSocket.accept();
timerTask.cancel();
serverSocketTimeoutTimer.cancel();
logger.warn("收到用户连接请求,开始读取数据");
//创建实例、建立连接。
transcriber = new SpeechTranscriber(AppNslClient.instance(), listener);
//设置识别参数
setParam(transcriber);
//开始任务
transcriber.start();
InputStream inputStream = socket.getInputStream();
byte[] b = new byte[4096];
......@@ -59,7 +71,6 @@ public class AppSpeechTranscriber {
transcriber.send(b, len);
}
socket.close();
//结束任务
transcriber.stop();
logger.warn("语音转文字已结束");
} catch (Exception e) {
......
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