Commit d8f60ec0 authored by helinlin's avatar helinlin

修改语音识别功能

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