From 7deaba288b5553bca0db6c6b6f312d046eb135d7 Mon Sep 17 00:00:00 2001
From: ivmiku <124345843+ivmiku@users.noreply.github.com>
Date: Sat, 24 Aug 2024 18:18:37 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?=
=?UTF-8?q?=E5=92=8C=E9=A2=84=E8=AE=BE=E5=9B=9E=E7=AD=94?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
navigate-8432/pom.xml | 19 ++--
.../controller/AssistantController.java | 7 --
.../com/ivmiku/tutorial/entity/Guidance.java | 14 +++
.../tutorial/mapper/GuidanceMapper.java | 8 ++
.../tutorial/service/AssistantService.java | 86 ++++++++++++++++++-
5 files changed, 115 insertions(+), 19 deletions(-)
create mode 100644 navigate-8432/src/main/java/com/ivmiku/tutorial/entity/Guidance.java
create mode 100644 navigate-8432/src/main/java/com/ivmiku/tutorial/mapper/GuidanceMapper.java
diff --git a/navigate-8432/pom.xml b/navigate-8432/pom.xml
index bb3eb35..e3aa5f4 100644
--- a/navigate-8432/pom.xml
+++ b/navigate-8432/pom.xml
@@ -18,11 +18,6 @@
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.5.7
-
org.springframework.boot
spring-boot-starter-web
@@ -31,10 +26,11 @@
org.springframework.boot
spring-boot-starter-actuator
-
-
-
-
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+ 3.5.7
+
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
@@ -108,5 +104,10 @@
tencentcloud-sdk-java-tts
3.1.1076
+
+ com.tencentcloudapi
+ tencentcloud-sdk-java-asr
+ 3.1.1083
+
\ No newline at end of file
diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java
index afef15d..c32bcee 100644
--- a/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java
+++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java
@@ -24,11 +24,4 @@ public class AssistantController {
}
return Result.ok(map);
}
-
- @GetMapping("/tts")
- public Object textToSpeech(@RequestParam String input) {
- Map map = new HashMap<>();
- map.put("content", assistantService.textToSpeech(input));
- return Result.ok(map);
- }
}
diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/entity/Guidance.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/entity/Guidance.java
new file mode 100644
index 0000000..9b16ab0
--- /dev/null
+++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/entity/Guidance.java
@@ -0,0 +1,14 @@
+package com.ivmiku.tutorial.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@TableName("guidance")
+@Data
+public class Guidance {
+ @TableId
+ private String id;
+ private String tag;
+ private String content;
+}
diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/mapper/GuidanceMapper.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/mapper/GuidanceMapper.java
new file mode 100644
index 0000000..4bdea0f
--- /dev/null
+++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/mapper/GuidanceMapper.java
@@ -0,0 +1,8 @@
+package com.ivmiku.tutorial.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ivmiku.tutorial.entity.Guidance;
+
+public interface GuidanceMapper extends BaseMapper {
+
+}
diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java
index f060c58..c06c723 100644
--- a/navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java
+++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java
@@ -2,11 +2,15 @@ package com.ivmiku.tutorial.service;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
-import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ivmiku.tutorial.entity.Guidance;
+import com.ivmiku.tutorial.mapper.GuidanceMapper;
import com.ivmiku.tutorial.utils.SnowflakeUtil;
-import com.tencentcloudapi.common.AbstractModel;
+import com.tencentcloudapi.asr.v20190614.AsrClient;
+import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionRequest;
+import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionResponse;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
@@ -14,18 +18,23 @@ import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.tts.v20190823.TtsClient;
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceRequest;
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceResponse;
+import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
@Service
public class AssistantService {
+ @Resource
+ private GuidanceMapper guidanceMapper;
+
private final String auth = "bad1f6cad39a4c26aa9fe9e4324e096f:ZDczMDIwOTg3NjlhODdmYWVjYTY0YjM1";
private final String secretId = "AKID09INNYxYEFFJH3g9VhljVF3qbDiFdx50";
private final String secretKey = "KajjcNyNaaUCqQroqpzNoMtTHNj4Lbil";
- public Map getResponse(String userInput) {
+ public Map getAiResponse(String userInput) {
Map message1 = new HashMap<>();
message1.put("role", "system");
message1.put("content", "模仿语音助手,对用户的问题给出简短的回答");
@@ -74,4 +83,75 @@ public class AssistantService {
throw new RuntimeException(e);
}
}
+
+ public String speechRecognition(String content, Integer length) {
+ try{
+ Credential cred = new Credential(secretId, secretKey);
+ HttpProfile httpProfile = new HttpProfile();
+ httpProfile.setEndpoint("asr.tencentcloudapi.com");
+ ClientProfile clientProfile = new ClientProfile();
+ clientProfile.setHttpProfile(httpProfile);
+ AsrClient client = new AsrClient(cred, "", clientProfile);
+ SentenceRecognitionRequest req = new SentenceRecognitionRequest();
+ req.setEngSerViceType("16k_zh");
+ req.setSourceType(1L);
+ req.setVoiceFormat("wav");
+ req.setData(content);
+ req.setDataLen(Long.valueOf(length));
+ SentenceRecognitionResponse resp = client.SentenceRecognition(req);
+ return resp.getResult();
+ } catch (TencentCloudSDKException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public String searchGuidance(String tag) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.like("tag", tag);
+ List list = guidanceMapper.selectList(queryWrapper);
+ if (list.isEmpty()) {
+ return null;
+ }
+ return list.getFirst().getContent();
+ }
+
+ public String extractTag(String query) {
+ Map message1 = new HashMap<>();
+ message1.put("role", "system");
+ message1.put("content", "根据给出的句子的意思,从以下标签中返回最匹配的一个:安全带、安检、飞机");
+ Map message2 = new HashMap<>();
+ message2.put("role", "user");
+ message2.put("content", query);
+ JSONArray array = new JSONArray();
+ array.add(message1);
+ array.add(message2);
+ JSONObject params = new JSONObject();
+ params.put("model", "general");
+ params.put("messages", array);
+ HttpResponse response = HttpRequest.post("https://spark-api-open.xf-yun.com/v1/chat/completions")
+ .header("Content-Type", "application/json")
+ .header("Authorization", "Bearer " + auth)
+ .body(params.toJSONString())
+ .execute();
+ JSONObject result = JSONObject.parseObject(response.body());
+ response.close();
+ if (result.getInteger("code") != 0) {
+ return null;
+ }
+ JSONArray choices = result.getJSONArray("choices");
+ JSONObject message = choices.getJSONObject(0);
+ return String.valueOf(message.getJSONObject("message"));
+ }
+
+ public Map getResponse(String query) {
+ Map result = new HashMap<>();
+ String tag = extractTag(query);
+ String content;
+ content = searchGuidance(tag);
+ if (content != null) {
+ result.put("content", content);
+ return result;
+ }
+ return getAiResponse(query);
+ }
}