From 4042fd297d11848739c4aea52ea9e1be9c59cd18 Mon Sep 17 00:00:00 2001 From: liwq <122639653@qq.com> Date: Mon, 27 Oct 2025 09:10:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/dialog/DialogController.java | 9 +- .../app/dialog/vo/AiDialogMessageRespVo.java | 14 +- .../controller/app/dialog/vo/DialogResp.java | 5 +- .../app/dialog/vo/TranslateReqVo.java | 4 +- .../app/dialog/vo/TranslateRespVo.java | 1 + .../dataobject/dialog/AiDialogMessageDO.java | 3 + .../cloud/ai/dal/enums/EmotionEnums.java | 27 +++ .../ai/service/dialog/AiDialogService.java | 3 +- .../service/dialog/AiDialogServiceImpl.java | 169 ++++++++++-------- tashow-module/tashow-module-infra/pom.xml | 8 + .../controller/admin/file/FileController.java | 1 - .../file/core/utils/FileTypeUtils.java | 31 +++- 12 files changed, 182 insertions(+), 93 deletions(-) create mode 100644 tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/enums/EmotionEnums.java diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java index 70ee840..18ad24d 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java @@ -6,6 +6,7 @@ import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo; import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo; import com.tashow.cloud.ai.service.dialog.AiDialogService; import com.tashow.cloud.common.pojo.CommonResult; +import com.tashow.cloud.common.pojo.PageParam; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; import lombok.extern.slf4j.Slf4j; @@ -15,8 +16,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - import static com.tashow.cloud.common.pojo.CommonResult.success; /** @@ -28,8 +27,6 @@ import static com.tashow.cloud.common.pojo.CommonResult.success; @Slf4j public class DialogController { - List message = List.of("渴了", "饿了", "想睡觉", "想出去玩", "想溜达", "情绪低落", "很开心", "很伤心", "想哭"); - @Resource private AiDialogService aiDialogService; @@ -39,10 +36,10 @@ public class DialogController { */ @GetMapping("/getDialog") @PermitAll - public CommonResult msList() { + public CommonResult msList(PageParam pageParam) { //获取当前登录用户 Long userId = 1L; - return success(aiDialogService.getDialog(userId)); + return success(aiDialogService.getDialog(userId,pageParam)); } diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/AiDialogMessageRespVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/AiDialogMessageRespVo.java index 2629d25..82c3fe5 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/AiDialogMessageRespVo.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/AiDialogMessageRespVo.java @@ -1,14 +1,12 @@ package com.tashow.cloud.ai.controller.app.dialog.vo; -import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.tashow.cloud.common.util.json.databind.StringLocalDateTimeSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - /** * ai-对话消息 DO * @@ -71,7 +69,13 @@ public class AiDialogMessageRespVo { /** * 创建时间 */ - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + //发送时间 + @JsonSerialize(using = StringLocalDateTimeSerializer.class) private LocalDateTime createTime; + private Integer emotion; + private String terminal; + private String fileType; + private String fileName; + } \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java index ff5c266..e976fcb 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java @@ -1,10 +1,9 @@ package com.tashow.cloud.ai.controller.app.dialog.vo; +import com.tashow.cloud.common.pojo.PageResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.List; - @Schema(description = "api - 对话 Response VO") @Data @@ -17,5 +16,5 @@ public class DialogResp { @Schema(description = "对话状态") private String dialogStatus; @Schema(description = "对话消息内容") - private List messages; + private PageResult messages; } diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java index 5032589..4799381 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java @@ -14,11 +14,13 @@ public class TranslateReqVo { //消息id private Long msgId; + private String terminal; + /** 文件附件 */ private MultipartFile file; //文件时长 - private String contentDuration; + private Long contentDuration; } diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java index b481080..6d0e3bc 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java @@ -39,6 +39,7 @@ public class TranslateRespVo { private String transResult; //文件时长 private Long contentDuration; + private String terminal; //发送时间 @JsonSerialize(using = StringLocalDateTimeSerializer.class) private LocalDateTime createTime; diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java index 4602c2c..01b91fc 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java @@ -97,4 +97,7 @@ public class AiDialogMessageDO { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime createTime; + private Integer emotion; + private String terminal; + } \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/enums/EmotionEnums.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/enums/EmotionEnums.java new file mode 100644 index 0000000..a19a770 --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/enums/EmotionEnums.java @@ -0,0 +1,27 @@ +package com.tashow.cloud.ai.dal.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EmotionEnums { + + XF(1,"兴奋/玩耍","兴奋"), + PJ(2,"平静/放松","平静"), + je(3,"乞求/饥饿/口渴","饥饿"), + yk(4,"愉快/满足","愉快"), + tt(5,"疼痛/沮丧","疼痛"), + kj(6,"恐惧/不安","恐惧"), + hq(7,"问候/好奇","好奇"), + ng(8,"难过/焦虑","难过"), + fn(9,"愤怒/警告","愤怒"), + ; + + + private Integer code; + private String name; + private String aiName; + + +} diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java index 05b2a9b..0788b7d 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java @@ -5,6 +5,7 @@ import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp; import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo; import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo; import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO; +import com.tashow.cloud.common.pojo.PageParam; /** * ai-对话 Service 接口 @@ -14,7 +15,7 @@ import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO; public interface AiDialogService extends IService { - DialogResp getDialog(Long userId); + DialogResp getDialog(Long userId, PageParam pageParam); TranslateRespVo translate(TranslateReqVo fileReqVo); } \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java index ee8b613..b97c9d2 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java @@ -1,6 +1,7 @@ package com.tashow.cloud.ai.service.dialog; import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; @@ -16,6 +17,8 @@ import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO; import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO; import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMapper; import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMessageMapper; +import com.tashow.cloud.common.pojo.PageParam; +import com.tashow.cloud.common.pojo.PageResult; import com.tashow.cloud.common.util.object.BeanUtils; import com.tashow.cloud.infraapi.api.file.FileApi; import jakarta.annotation.Resource; @@ -28,9 +31,6 @@ import org.springframework.web.multipart.MultipartFile; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -55,10 +55,56 @@ public class AiDialogServiceImpl extends ServiceImpl @Resource private FileApi fileApi; + private List failedStr =List.of( + "刚刚的音符太独特了,我没听清呢~可以再对我说一次吗?", + "哇,这是哪来的小可爱?声音太有魅力了,让我一时走了神。请靠近一点,慢慢再说一遍好?", + "背景音有点热闹,我有点分心啦~能在一个更安静的地方,让我专心听听TA的声音吗", + "景音有点热闹,我有点分心啦~能在一个更安静的地方,让我专心听听TA的声音吗", + "报告主人!声波受到不明干扰(可能是零食袋的声音?),翻译任务失败,请求二次输入!", + "我的‘物种雷达’刚才打了个盹儿~快让我再听一次这美妙的声音!", + "这声音太迷人了,让我CPU过载了!请简化一下环境音,我们再来一次?" + ); + + private Map> failedMap =new HashMap<>(){{ + put("cat",List.of( + "听得出是猫猫在说话,但TA似乎在表达一种很深邃的情绪..也许是个小秘密呢?", + "喵星人的这段‘加密通话’等级太高了!翻译官正在努力学习中...你能通过TA的尾巴和眼神猜猜看吗?", + "警报!警报!接收到喵星最高机密指令,我的权限不足,无法破译!建议提供小鱼干以获取更多线索" + )); + put("dog",List.of( + "听得出是狗狗在说话,但TA似乎在表达一种很深邃的情绪...也许是个小秘密呢?", + "汪语十级考试失败!这句大概是“今天的我比昨天更爱你了'之类的复杂情感吧", + "汪星人的这段‘加密通话’等级太高了!翻译官正在努力学习中..你能通过TA的尾巴和眼神猜猜看吗?" + )); + put("common",List.of( + "TA刚才可能用了某种古老的咒语,或者...只是在打一个很有思想的哈欠?", + "这句‘话’的哲学深度超出了我的理解范围,TA可能是一位诗人~" + )); + }}; + + private Map> successMap =new HashMap<>(){{ + put("舒服",List.of( + "TA 现在全身心都放松下来啦,正被满满的安全感包围着呢~ ", + "听这均匀的呼吸,TA 的心正像云朵一样软绵绵、轻飘飘的哦。", + "这是幸福的声音!此刻的TA,觉得自己是全世界最被爱的小宝贝", + "环境很安心~主人很贴心~TA 正在小声说:好舒服呀~…" + )); + put("等待喂食",List.of( + "小肚肚发出‘咕咕’警报啦!美食雷达正在全面启动,搜寻好吃的!", + "来自TA的紧急通讯:‘报告!能量储备严重不足,请求立刻补充!", + "你听到了吗?那是小饭碗在思念食物的声音!TA的眼神正在发出渴望的光波~", + "“开饭铃”已经摇响!再不开饭,小委屈就要溢出来啦!" + )); + put("生气",List.of( + "TA 现在有点小紧张哦,周围可能有让TA不安的东西,快给TA一点安慰吧", + "检测到‘心跳加速’模式!TA需要一点空间和一个温柔的声音来平静下来", + "TA 现在有点小紧张哦,周围可能有让TA不安的东西,快给TA一点安慰吧" + )); + }}; private Map petAvatars = new HashMap<>() {{ - put("cat", "https://petshy.tashowz.com/admin-api/infra/file/29/get/89f4982de19aadae3248ffde37132857df255b3276de484fdf12e603e5e29a7e.png"); - put("dog", "https://petshy.tashowz.com/admin-api/infra/file/29/get/175ba9f58dc812786bfe0598ca9c4a7f422fe138c1889e08d8228aebc953c1b3.png"); + put("cat", "https://petshy.tashowz.com/admin-api/infra/file/29/get/默认的猫.png"); + put("dog", "https://petshy.tashowz.com/admin-api/infra/file/29/get/默认的狗.png"); }}; private Map petName = new HashMap<>() {{ @@ -68,7 +114,7 @@ public class AiDialogServiceImpl extends ServiceImpl @Override - public DialogResp getDialog(Long userId) { + public DialogResp getDialog(Long userId, PageParam pageParam) { AiDialogDO aiDialogDO = this.getOne(new LambdaQueryWrapper().eq(AiDialogDO::getUserId, userId)); if (aiDialogDO == null) { aiDialogDO = new AiDialogDO(); @@ -77,7 +123,12 @@ public class AiDialogServiceImpl extends ServiceImpl aiDialogDO.setUserId(userId); this.save(aiDialogDO); } - List messageDOS = aiDialogMessageMapper.selectList(new LambdaQueryWrapper().eq(AiDialogMessageDO::getDialogId, aiDialogDO.getId())); + + PageResult messageDOS = aiDialogMessageMapper.selectPage(pageParam, + new LambdaQueryWrapper().eq(AiDialogMessageDO::getDialogId, aiDialogDO.getId()) + .orderByDesc(AiDialogMessageDO::getCreateTime) + ); + DialogResp resp = new DialogResp(); resp.setDialogId(aiDialogDO.getId()); resp.setTitle(aiDialogDO.getTitle()); @@ -89,43 +140,23 @@ public class AiDialogServiceImpl extends ServiceImpl @Override @SneakyThrows public TranslateRespVo translate(TranslateReqVo fileReqVo) { - AiDialogMessageDO messageDO = aiDialogMessageMapper.selectById(fileReqVo.getMsgId()); - if (messageDO == null) { - messageDO = new AiDialogMessageDO(); - } - String fileName = StrUtil.isBlank(messageDO.getFileName()) ? fileReqVo.getFile().getOriginalFilename() : messageDO.getFileName(); + AiDialogMessageDO messageDO = new AiDialogMessageDO(); + String fileName = fileReqVo.getFile().getOriginalFilename(); //上传文件获取文件地址 - String fileUrl = StrUtil.isBlank(messageDO.getContentText()) ? fileServer + fileApi.createFile(fileName, "", fileReqVo.getFile().getBytes()) : messageDO.getContentText(); + String fileUrl = fileServer + fileApi.createFile(fileName, "", fileReqVo.getFile().getBytes()); //翻译结果 translate(messageDO, fileUrl, fileName); - //创建消息 持久化消息 - if (messageDO.getId() == null) { - messageDO.setFileName(fileName); - messageDO.setFileType(fileReqVo.getFile().getContentType()); - messageDO.setDialogId(fileReqVo.getDialogId()); - //前端无法转换时 后端进行转 - messageDO.setContentDuration( - StrUtil.isBlank(fileReqVo.getContentDuration()) || "Infinity".equals(fileReqVo.getContentDuration()) - ? 0 : Long.parseLong(fileReqVo.getContentDuration()) - ); - - messageDO.setContentText(fileUrl); - messageDO.setContentType(2); - - //获取当前最后的排序 - AiDialogMessageDO aiDialogMessageDO = aiDialogMessageMapper.selectOne(new LambdaQueryWrapper() - .eq(AiDialogMessageDO::getDialogId, fileReqVo.getDialogId()) - .orderByDesc(AiDialogMessageDO::getMessageOrder) - .last("limit 1") - ); - messageDO.setMessageOrder(aiDialogMessageDO == null ? 1 : aiDialogMessageDO.getMessageOrder() + 1); - messageDO.setCreateTime(LocalDateTimeUtil.now()); - } - int i = messageDO.getId() == null ? aiDialogMessageMapper.insert(messageDO) : aiDialogMessageMapper.updateById(messageDO); - TranslateRespVo bean = BeanUtils.toBean(messageDO, TranslateRespVo.class); - bean.setId(messageDO.getId()); - return bean; + //创建消息 + messageDO.setFileName(fileName); + messageDO.setFileType(fileReqVo.getFile().getContentType()); + messageDO.setDialogId(fileReqVo.getDialogId()); + //前端无法转换时 后端进行转 + messageDO.setContentDuration(fileReqVo.getContentDuration()); + messageDO.setContentText(fileUrl); + messageDO.setContentType(2); + messageDO.setCreateTime(LocalDateTimeUtil.now()); + return BeanUtils.toBean(messageDO, TranslateRespVo.class); } @SneakyThrows @@ -148,51 +179,54 @@ public class AiDialogServiceImpl extends ServiceImpl //数据解析 JSONObject translateResult = JSON.parseObject(result); + //翻译失败 if (translateResult.isEmpty() || !translateResult.containsKey("intent_result") || !translateResult.getBoolean("is_species_sound") - || translateResult.getInteger("confidence") < 0.7 + || translateResult.getDouble("confidence") < 0.7 ) { messageDO.setTransStatus(0); - messageDO.setTransResult(""); + messageDO.setTransResult(failedStr.get(RandomUtil.randomInt(failedStr.size()))); return messageDO; } + //标签 如 cat dog String speciesLabels = translateResult.getString("species_labels"); //解析翻译结果 - JSONObject probabilities = translateResult.getJSONObject("intent_result") - .getJSONObject("probabilities"); + JSONObject intentResult = translateResult.getJSONObject("intent_result"); - String resultKey = probabilities.entrySet().stream() - .filter(entry -> entry.getValue() instanceof Number && ((Number) entry.getValue()).doubleValue() > 0.7) - .max(Comparator.comparingDouble(entry -> ((Number) entry.getValue()).doubleValue())) - .map(Map.Entry::getKey) - .orElse(null); - - //返回结果 - if (StrUtil.isBlank(resultKey)) { + //识别物种,无法翻译音频 + if (intentResult.getDouble("confidence")<0.7){ messageDO.setTransStatus(0); - messageDO.setTransResult(""); + List petFailResult = failedMap.get(speciesLabels); + if (petFailResult == null) { + petFailResult = failedMap.get("common"); + } + messageDO.setTransResult(petFailResult.get(RandomUtil.randomInt(petFailResult.size()))); return messageDO; } + //都识别成功后 也有不同的翻译结果 + JSONObject probabilities = intentResult.getJSONObject("probabilities"); + String resultKey = probabilities.entrySet().stream() + .max(Comparator.comparingDouble(entry -> ((Number) entry.getValue()).doubleValue())) + .map(Map.Entry::getKey) + .orElse(null); + //根据key解析结果 + String emo = StrUtil.isBlank(resultKey) ? "" : resultKey.split(cn.hutool.core.util.StrUtil.UNDERLINE)[1]; + List emoList = successMap.get(emo); + messageDO.setTransStatus(1); + messageDO.setTransResult(emoList.get(RandomUtil.randomInt(emoList.size()))); //宠物档案 todo messageDO.setPetId(1l); messageDO.setPetName(petName.get(speciesLabels)); - https: -//qcloud.dpfile.com/pc/qw4HqeQN5Af9tLaw0mx8pXQhxKUCvwHbCXmSRI-nKiW1NpX6wMdvSN80YpcTbMKw.jpg messageDO.setPetAvatar(petAvatars.get(speciesLabels)); messageDO.setPetType(speciesLabels); - messageDO.setTransStatus(1); - messageDO.setTransResult(StrUtil.isBlank(resultKey) ? "" : resultKey.split(StrUtil.UNDERLINE)[1]); return messageDO; } public static void main(String[] args) throws Exception { - InputStream inputStream = getInputStreamFromUrl("https://petshy.tashowz.com/admin-api/infra/file/29/get/857def513547ec33a105f71108c8ece329cb64dacc3a4779c94b0fcc3398cc32.webm"); - AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream); - System.out.println((long) (audioStream.getFrameLength() / audioStream.getFormat().getFrameRate())); // byte[] bytes = HttpUtil.downloadBytes("http://192.168.1.231:48080/admin-api/infra/file/29/get/c7351abf780f18600c104ec5662d843783ed8c309c01fb427046565217f51102.wav"); // //// File file = new File("http://192.168.1.231:48080/admin-api/infra/file/29/get/c7351abf780f18600c104ec5662d843783ed8c309c01fb427046565217f51102.wav"); @@ -202,19 +236,4 @@ public class AiDialogServiceImpl extends ServiceImpl } - public static InputStream getInputStreamFromUrl(String urlString) throws Exception { - URL url = new URL(urlString); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); // 可以是GET, POST等 - connection.setConnectTimeout(5000); // 设置连接超时时间 - connection.setReadTimeout(5000); // 设置读取超时时间 - int responseCode = connection.getResponseCode(); // 获取响应码 - if (responseCode == HttpURLConnection.HTTP_OK) { // 状态码200表示成功 - return connection.getInputStream(); - } else { - // 处理错误情况,例如抛出异常或返回null等 - throw new RuntimeException("Failed : HTTP error code : " + responseCode); - } - } - } \ No newline at end of file diff --git a/tashow-module/tashow-module-infra/pom.xml b/tashow-module/tashow-module-infra/pom.xml index b6b9120..da687a2 100644 --- a/tashow-module/tashow-module-infra/pom.xml +++ b/tashow-module/tashow-module-infra/pom.xml @@ -25,6 +25,14 @@ tashow-framework-env + + + org.jaudiotagger + jaudiotagger + 2.0.1 + + + com.tashow.cloud diff --git a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java index 65d9d6a..c8f4998 100644 --- a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java +++ b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java @@ -87,7 +87,6 @@ public class FileController { response.setStatus(HttpStatus.NOT_FOUND.value()); return; } - response.setContentLength(content.length); writeAttachment(response, path, content); } diff --git a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/utils/FileTypeUtils.java b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/utils/FileTypeUtils.java index 92d1483..1de94b7 100644 --- a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/utils/FileTypeUtils.java +++ b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/utils/FileTypeUtils.java @@ -6,8 +6,20 @@ import com.alibaba.ttl.TransmittableThreadLocal; import jakarta.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import org.apache.tika.Tika; +import org.jaudiotagger.audio.AudioFile; +import org.jaudiotagger.audio.AudioFileIO; +import org.jaudiotagger.audio.exceptions.CannotReadException; +import org.jaudiotagger.audio.exceptions.CannotWriteException; +import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; +import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; +import org.jaudiotagger.tag.Tag; +import org.jaudiotagger.tag.TagException; +import org.jaudiotagger.tag.id3.AbstractID3v2Tag; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; import java.net.URLEncoder; /** @@ -64,7 +76,7 @@ public class FileTypeUtils { String contentType = getMineType(content, filename); response.setContentType(contentType); // 针对 video 的特殊处理,解决视频地址在移动端播放的兼容性问题 - if (StrUtil.containsIgnoreCase(contentType, "video")) { + if (StrUtil.containsIgnoreCase(contentType, "video")||StrUtil.containsIgnoreCase(contentType, "audio")) { response.setHeader("Content-Length", String.valueOf(content.length - 1)); response.setHeader("Content-Range", String.valueOf(content.length - 1)); response.setHeader("Accept-Ranges", "bytes"); @@ -73,4 +85,21 @@ public class FileTypeUtils { IoUtil.write(response.getOutputStream(), false, content); } + public static void main(String[] args) throws CannotReadException, TagException, InvalidAudioFrameException, ReadOnlyFileException, IOException, CannotWriteException, URISyntaxException { + URL url = new URL("https://petshy.tashowz.com/admin-api/infra/file/29/get/jna2-雪球-难过焦虑.wav"); + File file = new File(url.getFile()); + System.out.println(file.exists()); + AudioFile audioFile = AudioFileIO.read(file); + Tag tag = audioFile.getTag(); + if (tag instanceof AbstractID3v2Tag) { + AbstractID3v2Tag id3v2Tag = (AbstractID3v2Tag) tag; +// id3v2Tag.delete(); // 删除所有ID3标签 + } else { + System.out.println("The file does not contain ID3v2 tags."); + } + AudioFileIO.write(audioFile); // 保存更改 + System.out.println("ID3 tags removed successfully."); + + } + }