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); + } }