Commit 45d32b6f authored by helinlin's avatar helinlin

调整语音转文字关键字摘取逻辑

parent bec09bc8
......@@ -26,13 +26,9 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
private final EmqKeeper emqKeeper;
private final List<AudioRecord> audioRecords;
private final AudioKeyWord audioKeyWords;
private final ObjectMapper objectMapper = new ObjectMapper();
public RealTimeSpeechTranscriberListener(
String myNumber,
String typeNumber,
EmqKeeper emqKeeper,
List<AudioRecord> audioRecords,
AudioKeyWord audioKeyWords) {
public RealTimeSpeechTranscriberListener(String myNumber, String typeNumber, EmqKeeper emqKeeper, List<AudioRecord> audioRecords, AudioKeyWord audioKeyWords) {
this.myNumber = myNumber;
this.typeNumber = typeNumber;
this.emqKeeper = emqKeeper;
......@@ -46,8 +42,7 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
@Override
public void onTranscriptionResultChange(SpeechTranscriberResponse response) {
logger.warn("语音识别过程中返回的结果");
logger.warn("task_id: " + response.getTaskId() +
", name: " + response.getName() +
logger.warn("task_id: " + response.getTaskId() + ", name: " + response.getName() +
//状态码“20000000”表示正常识别。
", status: " + response.getStatus() +
//句子编号,从1开始递增。
......@@ -83,8 +78,7 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
@Override
public void onSentenceEnd(SpeechTranscriberResponse response) {
logger.warn("服务端检测到了一句话的结束");
logger.warn("task_id: " + response.getTaskId() +
", name: " + response.getName() +
logger.warn("task_id: " + response.getTaskId() + ", name: " + response.getName() +
//状态码“20000000”表示正常识别。
", status: " + response.getStatus() +
//句子编号,从1开始递增。
......@@ -106,10 +100,7 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
@Override
public void onTranscriptionComplete(SpeechTranscriberResponse response) {
logger.warn("识别结束后返回的最终结果");
logger.warn("task_id: " + response.getTaskId()
+ ", name: " + response.getName()
+ ", status: " + response.getStatus()
+ ",result:" + response.getTransSentenceText());
logger.warn("task_id: " + response.getTaskId() + ", name: " + response.getName() + ", status: " + response.getStatus() + ",result:" + response.getTransSentenceText());
try {
emqKeeper.getMqttClient().publish(AudioTopic.RECORD.getName() + "/" + myNumber, "".getBytes(), 2, true);
emqKeeper.getMqttClient().publish(AudioTopic.KEYWORD.getName() + "/" + myNumber, "".getBytes(), 2, true);
......@@ -124,23 +115,12 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
@Override
public void onFail(SpeechTranscriberResponse response) {
logger.error("失败处理");
logger.error("task_id: " + response.getTaskId()
+ ", status: " + response.getStatus()
+ ", status_text: " + response.getStatusText());
logger.error("task_id: " + response.getTaskId() + ", status: " + response.getStatus() + ", status_text: " + response.getStatusText());
}
private void responseHandler(SpeechTranscriberResponse response) {
if (response.getStatus() == RESULT_SUCCESS_CODE) {
AudioRecord audioRecord = new AudioRecord.AudioRecordBuilder()
.type(typeNumber)
.taskId(response.getTaskId())
.name(response.getName())
.status(response.getStatus())
.index(response.getTransSentenceIndex())
.message(response.getTransSentenceText())
.confidence(response.getConfidence())
.time(response.getTransSentenceTime())
.build();
AudioRecord audioRecord = new AudioRecord.AudioRecordBuilder().type(typeNumber).taskId(response.getTaskId()).name(response.getName()).status(response.getStatus()).index(response.getTransSentenceIndex()).message(response.getTransSentenceText()).confidence(response.getConfidence()).time(response.getTransSentenceTime()).build();
int index = audioRecord.getIndex() - 1;
if (index >= audioRecords.size()) {
audioRecords.add(audioRecord);
......@@ -178,15 +158,11 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
public void sendKeyword() {
audioKeyWords.getValues().values().forEach(Set::clear);
try {
StringBuilder stringBuilder = new StringBuilder();
audioRecords.forEach(audioRecord -> {
stringBuilder.append(",").append(audioRecord.getMessage());
});
stringBuilder.append(",");
String result = stringBuilder.toString();
//寻找电话号码
StringBuilder stringBuilder = new StringBuilder();
audioRecords.forEach(audioRecord -> stringBuilder.append(",").append(audioRecord.getMessage()));
Pattern pattern = Pattern.compile("\\d{5,}");
Matcher matcher = pattern.matcher(result);
Matcher matcher = pattern.matcher(stringBuilder.toString());
while (matcher.find()) {
audioKeyWords.getValues().get(AudioKeywordType.CONTACT_NUMBER.getType()).add(matcher.group());
}
......@@ -194,30 +170,31 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
for (AudioKeywordType messageKeyword : AudioKeywordType.values()) {
if (messageKeyword == AudioKeywordType.CONTACT_NUMBER) continue;
for (String keyword : messageKeyword.getKeyword()) {
int keywordIndex = result.indexOf(keyword);
// 第一种(获取keyword紧跟的内容到下一个[,/。]号的内容作为关键字)
if (keywordIndex != -1) {
int keyWordValueEndIndex = getKeyWordValueIndex(result, keywordIndex);
if (keyWordValueEndIndex == -1) continue;
String keywordValue = result.substring(keywordIndex + keyword.length(), keyWordValueEndIndex);
if (!StringUtils.isEmpty(keywordValue) && keywordValue.length() >= 4) {
audioKeyWords.getValues().get(messageKeyword.getType()).add(keywordValue);
continue;
for (int i = 0; i < audioRecords.size(); i++) {
String message = audioRecords.get(i).getMessage();
String nextMessage = "";
if (i + 1 < audioRecords.size()) {
nextMessage = audioRecords.get(i + 1).getMessage();
}
int keywordIndex = message.indexOf(keyword);
if (keywordIndex != -1) {
try {
// 第一种(获取keyword紧跟的内容直至结束)
String keywordValue = message.substring(keywordIndex + keyword.length());
if (!StringUtils.isEmpty(keywordValue) && keywordValue.length() > 2) {
audioKeyWords.getValues().get(messageKeyword.getType()).add(keywordValue);
}
// 第二种(获取keyword的下一句话直至结束)
if (!StringUtils.isEmpty(nextMessage)) {
audioKeyWords.getValues().get(messageKeyword.getType()).add(nextMessage);
}
} catch (Exception e) {
logger.error(e.getMessage());
}
}
}
// 第二种(获取keyword的下一个[,/。]号和下下一个[,/。]号的内容作为关键字)
if (keywordIndex != -1) {
int keyWordValueStartIndex = getKeyWordValueIndex(result, keywordIndex);
if (keyWordValueStartIndex == -1) continue;
int keyWordValueEndIndex = getKeyWordValueIndex(result, keyWordValueStartIndex);
if (keyWordValueEndIndex == -1) continue;
String keywordValue = result.substring(keyWordValueStartIndex + 1 < result.length() ? keyWordValueStartIndex + 1 : keyWordValueStartIndex, keyWordValueEndIndex);
if (StringUtils.isEmpty(keywordValue)) continue;
audioKeyWords.getValues().get(messageKeyword.getType()).add(keywordValue);
}
}
}
ObjectMapper objectMapper = new ObjectMapper();
byte[] bytes = objectMapper.writeValueAsString(audioKeyWords.getValues()).getBytes();
emqKeeper.getMqttClient().publish(AudioTopic.KEYWORD.getName() + "/" + myNumber, bytes, 2, false);
} catch (Exception e) {
......@@ -225,24 +202,6 @@ public class RealTimeSpeechTranscriberListener extends SpeechTranscriberListener
logger.error("发送音频关键字消息异常,原因:" + e.getMessage());
}
}
private int getKeyWordValueIndex(String text, int keywordIndex) {
int keywordIndexNextFlag = -1;
int keywordIndexNextFlag1 = text.indexOf(",", keywordIndex + 1);
int keywordIndexNextFlag2 = text.indexOf("。", keywordIndex + 1);
if (keywordIndexNextFlag1 != -1) {
if (keywordIndexNextFlag2 != -1) {
keywordIndexNextFlag = Math.min(keywordIndexNextFlag1, keywordIndexNextFlag2);
} else {
keywordIndexNextFlag = keywordIndexNextFlag1;
}
} else {
if (keywordIndexNextFlag2 != -1) {
keywordIndexNextFlag = keywordIndexNextFlag2;
}
}
return keywordIndexNextFlag;
}
}
......
......@@ -107,13 +107,13 @@ public class AppSpeechTranscriber {
//输入音频采样率。
transcriber.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
//是否返回中间识别结果。
transcriber.setEnableIntermediateResult(true);
transcriber.setEnableIntermediateResult(false);
//是否生成并返回标点符号。
transcriber.setEnablePunctuation(true);
transcriber.setEnablePunctuation(false);
//是否将返回结果规整化,比如将一百返回为100。
transcriber.setEnableITN(true);
//设置vad断句参数。默认值:800ms,有效值:200ms~2000ms。
transcriber.addCustomedParam("max_sentence_silence", 500);
transcriber.addCustomedParam("max_sentence_silence", 800);
//设置是否语义断句。
//transcriber.addCustomedParam("enable_semantic_sentence_detection",false);
//设置是否开启顺滑。
......
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