Commit d8f60ec0 authored by helinlin's avatar helinlin

修改语音识别功能

parent 0ffa70b4
......@@ -18,15 +18,15 @@ public class AudioKeyWord {
public AudioKeyWord() {
values = new HashMap<>();
//地址
values.put(MessageKeywords.LOCATION.getType(), new HashSet<>());
values.put(AudioKeywordType.LOCATION.getType(), new HashSet<>());
//联系人
values.put(MessageKeywords.CONTACT.getType(), new HashSet<>());
values.put(AudioKeywordType.CONTACT.getType(), new HashSet<>());
//联系电话
values.put(MessageKeywords.CONTACT_NUMBER.getType(), new HashSet<>());
values.put(AudioKeywordType.CONTACT_NUMBER.getType(), new HashSet<>());
//事发单位
values.put(MessageKeywords.UNIT.getType(), new HashSet<>());
values.put(AudioKeywordType.UNIT.getType(), new HashSet<>());
//重点部位
values.put(MessageKeywords.PART.getType(), new HashSet<>());
values.put(AudioKeywordType.PART.getType(), new HashSet<>());
}
public Map<String, Set<String>> getValues() {
......
package com.yeejoin.amos.boot.module.jcs.biz.audioToText;
/**
* 语音转文字消息类型
* mqtt 发送消息类型是加上[_phoneNumber]即接电话用户的电话号码,实现区分
*/
public enum MessageType {
RECORD("audioRecord"), KEYWORD("audioKeyWord");
private String name;
MessageType(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 语音转文字关键字查找表
*/
enum MessageKeywords {
enum AudioKeywordType {
LOCATION("location", new String[]{"地址", "位置", "地点",}),
CONTACT("contact", new String[]{"联系人", "联系", "在",}),
CONTACT_NUMBER("contactNumber", new String[]{"号码是", "号码", "手机是", "手机", "手机号", "手机号是"}),
......@@ -35,7 +13,7 @@ enum MessageKeywords {
private String type;
private String[] keyword;
MessageKeywords(String type, String[] keyword) {
AudioKeywordType(String type, String[] keyword) {
this.type = type;
this.keyword = keyword;
}
......
package com.yeejoin.amos.boot.module.jcs.biz.audioToText;
/**
* 语音转文字消息类型
* mqtt 发送消息类型是加上[_phoneNumber]即接电话用户的电话号码,实现区分
*/
public enum AudioTopic {
RECORD("audioRecord"), KEYWORD("audioKeyWord");
private String name;
AudioTopic(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.yeejoin.amos.boot.module.jcs.biz.audioToText;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberListener;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberResponse;
/**
* 文件语音识别 回调函数
*/
public class FileSpeechTranscriberListener extends SpeechTranscriberListener {
@Override
public void onTranscriberStart(SpeechTranscriberResponse response) {
}
@Override
public void onSentenceBegin(SpeechTranscriberResponse response) {
}
@Override
public void onSentenceEnd(SpeechTranscriberResponse response) {
}
@Override
public void onTranscriptionResultChange(SpeechTranscriberResponse response) {
}
@Override
public void onTranscriptionComplete(SpeechTranscriberResponse response) {
}
@Override
public void onFail(SpeechTranscriberResponse response) {
}
void responseLogger(SpeechTranscriberResponse response) {
}
}
package com.yeejoin.amos.boot.module.jcs.biz.audioToText;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberListener;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.paho.client.mqttv3.MqttException;
......@@ -17,8 +18,8 @@ import java.util.regex.Pattern;
/**
* 实时语音识别 回调函数
*/
public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.asr.SpeechTranscriberListener {
private static final Logger logger = LoggerFactory.getLogger(SpeechTranscriberListener.class);
public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener {
private static final Logger logger = LoggerFactory.getLogger(RealTimeSpeechTranscriberListener.class);
public static final int RESULT_SUCCESS_CODE = 20000000;
private final String myNumber;
private final String typeNumber;
......@@ -26,7 +27,7 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
private final List<AudioRecord> audioRecords;
private final AudioKeyWord audioKeyWords;
public SpeechTranscriberListener(
public RealTimeSpeechTranscriberListener(
String myNumber,
String typeNumber,
EmqKeeper emqKeeper,
......@@ -116,8 +117,8 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
+ ", status: " + response.getStatus()
+ ",result:" + response.getTransSentenceText());
try {
emqKeeper.getMqttClient().publish(MessageType.RECORD.getName() + "/" + myNumber, "".getBytes(), 2, true);
emqKeeper.getMqttClient().publish(MessageType.KEYWORD.getName() + "/" + myNumber, "".getBytes(), 2, true);
emqKeeper.getMqttClient().publish(AudioTopic.RECORD.getName() + "/" + myNumber, "".getBytes(), 2, true);
emqKeeper.getMqttClient().publish(AudioTopic.KEYWORD.getName() + "/" + myNumber, "".getBytes(), 2, true);
} catch (MqttException e) {
e.printStackTrace();
}
......@@ -169,7 +170,7 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
try {
ObjectMapper objectMapper = new ObjectMapper();
byte[] bytes = objectMapper.writeValueAsString(audioRecord).getBytes();
emqKeeper.getMqttClient().publish(MessageType.RECORD.getName() + "/" + myNumber, bytes, 2, false);
emqKeeper.getMqttClient().publish(AudioTopic.RECORD.getName() + "/" + myNumber, bytes, 2, false);
} catch (Exception e) {
e.printStackTrace();
logger.error("发送音频识别结果消息异常,原因:" + e.getMessage());
......@@ -192,11 +193,11 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
Pattern pattern = Pattern.compile("\\d{5,}");
Matcher matcher = pattern.matcher(result);
while (matcher.find()) {
audioKeyWords.getValues().get(MessageKeywords.CONTACT_NUMBER.getType()).add(matcher.group());
audioKeyWords.getValues().get(AudioKeywordType.CONTACT_NUMBER.getType()).add(matcher.group());
}
//寻找其他类型关键字
for (MessageKeywords messageKeyword : MessageKeywords.values()) {
if (messageKeyword == MessageKeywords.CONTACT_NUMBER) continue;
for (AudioKeywordType messageKeyword : AudioKeywordType.values()) {
if (messageKeyword == AudioKeywordType.CONTACT_NUMBER) continue;
for (String keyword : messageKeyword.getKeyword()) {
int keywordIndex = result.indexOf(keyword);
//问答式:截取关键字,从关键字的下一个[,/。]号开始截取到下下一个[,/。]号结束
......@@ -213,7 +214,7 @@ public class SpeechTranscriberListener extends com.alibaba.nls.client.protocol.a
}
ObjectMapper objectMapper = new ObjectMapper();
byte[] bytes = objectMapper.writeValueAsString(audioKeyWords.getValues()).getBytes();
emqKeeper.getMqttClient().publish(MessageType.KEYWORD.getName() + "/" + myNumber, bytes, 2, false);
emqKeeper.getMqttClient().publish(AudioTopic.KEYWORD.getName() + "/" + myNumber, bytes, 2, false);
} catch (Exception e) {
e.printStackTrace();
logger.error("发送音频关键字消息异常,原因:" + e.getMessage());
......
......@@ -8,6 +8,7 @@ import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
......@@ -37,7 +38,7 @@ public class SocketClient {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress("127.0.0.1", port));
socket.connect(new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), port));
OutputStream outputStream = socket.getOutputStream();
FileInputStream fis = new FileInputStream(new File(testFilePath[type]));
byte[] b = new byte[4096];
......
package com.yeejoin.amos.boot.module.jcs.biz.audioToText.streamToText;
import java.io.InputStream;
/**
* 语音文件输入流,转文字
*/
public abstract class AbstractInputStream2Text {
private InputStream inputStream;
/**
* 获取输入流
*/
abstract InputStream getInputStream();
/**
* 转换操作
*/
void doTranslate() {
inputStream = getInputStream();
if (inputStream == null) throw new RuntimeException("inputStream is null");
}
}
package com.yeejoin.amos.boot.module.jcs.biz.audioToText.streamToText;
import java.io.InputStream;
/**
* 本地文件语音输入流转文字
*/
public class LocalFileInputStream2Text extends AbstractInputStream2Text {
@Override
InputStream getInputStream() {
return null;
}
}
package com.yeejoin.amos.boot.module.jcs.biz.audioToText.streamToText;
import java.io.InputStream;
/**
* 网络语音文件输入流转文字
*/
public class NetWorkInputStream2Text extends AbstractInputStream2Text {
@Override
InputStream getInputStream() {
return null;
}
}
package com.yeejoin.amos.boot.module.jcs.biz.audioToText;
package com.yeejoin.amos.boot.module.jcs.biz.audioToText.streamToText;
import com.yeejoin.amos.boot.module.jcs.biz.audioToText.AudioKeyWord;
import com.yeejoin.amos.boot.module.jcs.biz.audioToText.AudioRecord;
import com.yeejoin.amos.boot.module.jcs.biz.audioToText.RealTimeSpeechTranscriberListener;
import com.yeejoin.amos.speech.AppSpeechTranscriber;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -14,11 +17,11 @@ import java.util.HashMap;
import java.util.List;
/**
* 语音转文字
* 实时语音转文字
*/
@Component
public class AudioToText {
private static final Logger logger = LoggerFactory.getLogger(AudioToText.class);
public class RealTimeStream2Text {
private static final Logger logger = LoggerFactory.getLogger(RealTimeStream2Text.class);
public static int serverPort = 10001;
@Autowired
......@@ -30,7 +33,7 @@ public class AudioToText {
* @param myNumber 我的电话号码
* @param callerNumber 呼入电话号码
*/
public HashMap<String, Integer> convert(String myNumber, String callerNumber) {
public HashMap<String, Object> doTranslate(String cid, String myNumber, String callerNumber) {
//启动两个监听端口监听推送进来的2路语音流
ServerSocket serverSocket1 = initServerSocketPort();
ServerSocket serverSocket2 = initServerSocketPort();
......@@ -41,17 +44,17 @@ public class AudioToText {
logger.warn("myNumber监听的端口为:" + serverSocket1.getLocalPort() + " callerNumber监听的端口为:" + serverSocket2.getLocalPort());
//我的语音流
Thread thread1 = new Thread(() -> {
new AppSpeechTranscriber(new SpeechTranscriberListener(myNumber, myNumber, emqKeeper, audioRecords, audioKeyWord), serverSocket1).process();
new AppSpeechTranscriber(new RealTimeSpeechTranscriberListener(myNumber, myNumber, emqKeeper, audioRecords, audioKeyWord), serverSocket1).process();
});
//呼入的语音流
Thread thread2 = new Thread(() -> {
new AppSpeechTranscriber(new SpeechTranscriberListener(myNumber, callerNumber, emqKeeper, audioRecords, audioKeyWord), serverSocket2).process();
new AppSpeechTranscriber(new RealTimeSpeechTranscriberListener(myNumber, callerNumber, emqKeeper, audioRecords, audioKeyWord), serverSocket2).process();
});
thread1.setUncaughtExceptionHandler(new SubUncaughtExceptionHandler(serverSocket1));
thread2.setUncaughtExceptionHandler(new SubUncaughtExceptionHandler(serverSocket2));
thread1.start();
thread2.start();
HashMap<String, Integer> map = new HashMap<>();
HashMap<String, Object> map = new HashMap<>();
map.put(myNumber, serverSocket1.getLocalPort());
map.put(callerNumber, serverSocket2.getLocalPort());
return map;
......
package com.yeejoin.amos.boot.module.jcs.biz.controller;
import com.yeejoin.amos.boot.module.jcs.biz.audioToText.AudioToText;
import com.yeejoin.amos.boot.module.jcs.biz.audioToText.streamToText.RealTimeStream2Text;
import com.yeejoin.amos.boot.module.jcs.biz.audioToText.SocketClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -21,11 +21,12 @@ import java.util.concurrent.TimeUnit;
public class Audio2TextController {
@Autowired
AudioToText audioToText;
RealTimeStream2Text audio2Text;
@Autowired
SocketClient socketClient;
/**
* 测试语音转文字第一步
*
......@@ -34,8 +35,8 @@ public class Audio2TextController {
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping("/startConvert")
@ApiOperation(httpMethod = "GET", value = "测试语音转文字第一步", notes = "number为当前用户的手机号")
public HashMap<String, Integer> startConvert(@RequestParam String myNumber, @RequestParam String callerNumber) {
return audioToText.convert(myNumber, callerNumber);
public HashMap<String, Object> startConvert(@RequestParam String myNumber, @RequestParam String callerNumber) {
return audio2Text.doTranslate("", myNumber, callerNumber);
}
/**
......@@ -58,12 +59,12 @@ public class Audio2TextController {
@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);
public HashMap<String, Object> startConvertAndSendAudio(@RequestParam String myNumber, @RequestParam String callerNumber) {
HashMap<String, Object> convert = audio2Text.doTranslate("", myNumber, callerNumber);
try {
TimeUnit.SECONDS.sleep(1);
socketClient.process(convert.get(myNumber), 2);
socketClient.process(convert.get(callerNumber), 3);
socketClient.process((Integer) convert.get(myNumber), 2);
socketClient.process((Integer) convert.get(callerNumber), 3);
} catch (InterruptedException e) {
e.printStackTrace();
}
......@@ -83,9 +84,10 @@ public class Audio2TextController {
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping("/startConvertText")
@ApiOperation(httpMethod = "GET", value = "静听电话回调后端开始转文字", notes = "静听电话回调后端开始转文字")
@ApiOperation(httpMethod = "GET", value = "接听电话回调后端开始转文字", notes = "接听电话回调后端开始转文字")
public void startConvertText(String cid, String myPhone, String caller) {
}
}
......@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
......@@ -51,7 +52,7 @@ public class AppSpeechTranscriber {
SpeechTranscriber transcriber = null;
try {
//启动ServerSocket等待接收音频数据,只接受一次请求
logger.warn("serverSocket已启动,地址:" + serverSocket.getInetAddress().getHostAddress()
logger.warn("serverSocket已启动,地址:" + InetAddress.getLocalHost().getHostAddress()
+ "监听端口:" + serverSocket.getLocalPort() + " 等待语音融合系统推送数据...");
Socket socket = serverSocket.accept();
timerTask.cancel();
......
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