diff --git a/src/main/resources/corpus/1 b/src/main/resources/corpus/1 new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/sql/test_user_data.sql b/src/main/resources/sql/test_user_data.sql deleted file mode 100644 index 0fffa55..0000000 --- a/src/main/resources/sql/test_user_data.sql +++ /dev/null @@ -1,27 +0,0 @@ --- 测试用户数据 --- 密码都是 123456 的MD5加密值 - --- 插入测试用户 -INSERT INTO `user` (`user_name`, `email`, `password`, `avatar`) VALUES -('admin', 'admin@example.com', 'e10adc3949ba59abbe56e057f20f883e', '/avatar/admin.jpg'), -('user1', 'user1@example.com', 'e10adc3949ba59abbe56e057f20f883e', '/avatar/user1.jpg'), -('user2', 'user2@example.com', 'e10adc3949ba59abbe56e057f20f883e', '/avatar/user2.jpg'), -('test', 'test@example.com', 'e10adc3949ba59abbe56e057f20f883e', '/avatar/test.jpg'); - --- 插入测试角色 -INSERT INTO `role` (`role_name`) VALUES -('管理员'), -('普通用户'), -('访客'); - --- 插入用户角色关联 -INSERT INTO `user_role` (`user_id`, `role_id`) VALUES -(1, 1), -- admin -> 管理员 -(2, 2), -- user1 -> 普通用户 -(3, 2), -- user2 -> 普通用户 -(4, 3); -- test -> 访客 - - - - - diff --git a/src/main/resources/sql/update_user_table.sql b/src/main/resources/sql/update_user_table.sql deleted file mode 100644 index 1a8761f..0000000 --- a/src/main/resources/sql/update_user_table.sql +++ /dev/null @@ -1,17 +0,0 @@ --- 更新用户表结构,添加原始密码字段 --- 执行时间:2025-08-07 - --- 为user表添加original_password字段 -ALTER TABLE `user` -ADD COLUMN `original_password` varchar(255) DEFAULT NULL COMMENT '原始密码' -AFTER `password`; - --- 更新现有用户的原始密码字段(如果密码是123456的MD5值,则设置原始密码为123456) -UPDATE `user` -SET `original_password` = '123456' -WHERE `password` = 'e10adc3949ba59abbe56e057f20f883e'; - --- 为original_password字段添加索引(可选) --- ALTER TABLE `user` ADD INDEX `idx_original_password` (`original_password`); - - diff --git a/src/main/sql/语音识别 b/src/main/sql/语音识别 new file mode 100644 index 0000000..39520d1 --- /dev/null +++ b/src/main/sql/语音识别 @@ -0,0 +1,79 @@ +paraformer-v2:中文,包含中文普通话和各种方言:上海话、吴语、闽南语、东北话、甘肃话、贵州话、河南话、湖北话、湖南话、江西话、宁夏话、山西话、陕西话、山东话、四川话、天津话、云南话、粤语 +英文 日语 韩语 + +paraformer-mtl-v1:中文普通话、中文方言(粤语、吴语、闽南语、东北话、甘肃话、贵州话、河南话、湖北话、湖南话、宁夏话、山西话、陕西话、山东话、四川话、天津话)、英语、日语、韩语、西班牙语、印尼语、法语、德语、意大利语、马来语 + + + + + + + "task_id": "a0c8f837-e31c-428c-9746-f782730194b3", + "task_status": "SUCCEEDED", + "submit_time": "2025-08-22 20:53:53.242", + "scheduled_time": "2025-08-22 20:53:53.278", + "end_time": "2025-08-22 20:54:03.556", + "results": [ + { + "file_url": "https://api.huayang-star.com/api/audio/1957424645898579969_a2db5d76-b52c-4289-9c7e-ed55d7f15e42.mp3", + "transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20250822/20%3A54/0fa28199-7c18-4a6a-b4da-796dca0f16f3-1.json?Expires\u003d1755953643\u0026OSSAccessKeyId\u003dLTAI5tQZd8AEcZX6KZV4G8qL\u0026Signature\u003dnrKHcajG6o0VnMMs%2BP001vZ5yyk%3D", + "subtask_status": "SUCCEEDED" + }, + { + "file_url": "https://api.huayang-star.com/api/audio/1957424645898579969_a2db5d76-b52c-4289-9c7e-ed55d7f15e42.mp3", + "transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20250822/20%3A54/1f25c924-40bf-485b-a5c9-132952b71527-1.json?Expires\u003d1755953643\u0026OSSAccessKeyId\u003dLTAI5tQZd8AEcZX6KZV4G8qL\u0026Signature\u003dbGDt9EVPeOdIJUVN0jdD9MXe80M%3D", + "subtask_status": "SUCCEEDED" + }, + { + "file_url": "https://api.huayang-star.com/api/audio/1957424665985101825_7b9b03f4-a458-4eb6-ac7b-b5cf827a2315.mp3", + "transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20250822/20%3A54/153af9fe-cc12-4ffe-bdb0-a7d2c884e2cc-1.json?Expires\u003d1755953643\u0026OSSAccessKeyId\u003dLTAI5tQZd8AEcZX6KZV4G8qL\u0026Signature\u003dI0Ymz%2FTFBL2yiPcr%2FdA%2FbxGSRk8%3D", + "subtask_status": "SUCCEEDED" + } + ], + "task_metrics": { + "TOTAL": 3, + "SUCCEEDED": 3, + "FAILED": 0 + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/com/rj/service/AudioManagementServiceTest.java b/src/test/java/com/rj/service/AudioManagementServiceTest.java index 8e2efcf..ce4c198 100644 --- a/src/test/java/com/rj/service/AudioManagementServiceTest.java +++ b/src/test/java/com/rj/service/AudioManagementServiceTest.java @@ -5,9 +5,8 @@ package com.rj.service; * Date: 2025/8/5 19:02 **/ -import com.rj.Langchain4jHeima20250803Application; +import com.rj.AISmartCard20250803Application; import com.rj.entity.AudioManagement; -import com.rj.service.impl.AudioManagementServiceImpl; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -18,7 +17,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; -@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +//@SpringBootTest(classes = AISmartCard20250803Application.class) class AudioManagementServiceTest { @Autowired diff --git a/src/test/java/com/rj/service/AudioManagementStatisticsServiceTest.java b/src/test/java/com/rj/service/AudioManagementStatisticsServiceTest.java index 898f2e2..39e2fdb 100644 --- a/src/test/java/com/rj/service/AudioManagementStatisticsServiceTest.java +++ b/src/test/java/com/rj/service/AudioManagementStatisticsServiceTest.java @@ -17,8 +17,8 @@ import static org.junit.jupiter.api.Assertions.*; * @author 李中华 ,spllzh * @since 2025-08-07 */ -@SpringBootTest -@ActiveProfiles("test") +//@SpringBootTest +//@ActiveProfiles("test") public class AudioManagementStatisticsServiceTest { @Autowired diff --git a/src/test/java/com/rj/speech/TranscriptFilesByRestfulApi.java b/src/test/java/com/rj/speech/TranscriptFilesByRestfulApi.java new file mode 100644 index 0000000..435c8ec --- /dev/null +++ b/src/test/java/com/rj/speech/TranscriptFilesByRestfulApi.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) Alibaba Group. All Rights Reserved. + * MIT License (https://opensource.org/licenses/MIT) + */ + +package com.rj.speech; + +import com.alibaba.dashscope.audio.asr.transcription.*; +import com.alibaba.dashscope.exception.NoApiKeyException; +import com.alibaba.dashscope.utils.ApiKey; +import com.google.gson.*; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.*; +import java.net.HttpURLConnection; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +class SenseVoiceParser { + + private static final List EMOTION_LIST = + Arrays.asList("NEUTRAL", "HAPPY", "ANGRY", "SAD"); + private static final List EVENT_LIST = + Arrays.asList("Speech", "Applause", "BGM", "Laughter"); + private static final List ALL_TAGS = + Arrays.asList( + "Speech", + "Applause", + "BGM", + "Laughter", + "NEUTRAL", + "HAPPY", + "ANGRY", + "SAD", + "SPECIAL_TOKEN_1"); + + /** + * 本工具用于解析 sensevoice 识别结果 + * + * @param data json格式的sensevoice转写结果 + * @param keepTrans 是否保留转写文本 + * @param keepEmotions 是否保留情感标签 + * @param keepEvents 是否保留事件标签 + * @return + */ + public static JsonObject parseSenseVoiceResult( + JsonObject data, boolean keepTrans, boolean keepEmotions, boolean keepEvents) { + + List tagsToCleanup = + ALL_TAGS.stream() + .flatMap(tag -> Stream.of("<|" + tag + "|> ", "<|/" + tag + "|>", "<|" + tag + "|>")) + .collect(Collectors.toList()); + + JsonArray transcripts = data.getAsJsonArray("transcripts"); + + for (JsonElement transcriptElement : transcripts) { + JsonObject transcript = transcriptElement.getAsJsonObject(); + JsonArray sentences = transcript.getAsJsonArray("sentences"); + + for (JsonElement sentenceElement : sentences) { + JsonObject sentence = sentenceElement.getAsJsonObject(); + String text = sentence.get("text").getAsString(); + + if (keepEmotions) { + extractTags(sentence, text, EMOTION_LIST, "emotion"); + } + + if (keepEvents) { + extractTags(sentence, text, EVENT_LIST, "event"); + } + + if (keepTrans) { + String cleanText = getCleanText(text, tagsToCleanup); + sentence.addProperty("text", cleanText); + } else { + sentence.remove("text"); + } + } + + if (keepTrans) { + transcript.addProperty( + "text", getCleanText(transcript.get("text").getAsString(), tagsToCleanup)); + } else { + transcript.remove("text"); + } + + JsonArray filteredSentences = new JsonArray(); + for (JsonElement sentenceElement : sentences) { + JsonObject sentence = sentenceElement.getAsJsonObject(); + if (sentence.has("text") || sentence.has("emotion") || sentence.has("event")) { + filteredSentences.add(sentence); + } + } + transcript.add("sentences", filteredSentences); + } + return data; + } + + private static void extractTags( + JsonObject sentence, String text, List tagList, String key) { + String pattern = "<\\|(" + String.join("|", tagList) + ")\\|>"; + Pattern compiledPattern = Pattern.compile(pattern); + Matcher matcher = compiledPattern.matcher(text); + Set tags = new HashSet<>(); + + while (matcher.find()) { + tags.add(matcher.group(1)); + } + + if (!tags.isEmpty()) { + JsonArray tagArray = new JsonArray(); + tags.forEach(tagArray::add); + sentence.add(key, tagArray); + } else { + sentence.remove(key); + } + } + + private static String getCleanText(String text, List tagsToCleanup) { + for (String tag : tagsToCleanup) { + text = text.replace(tag, ""); + } + return text.replaceAll("\\s{2,}", " ").trim(); + } +} + +public class TranscriptFilesByRestfulApi { + + public static void main(String[] args) throws NoApiKeyException { + // create transcription params, use getDashScopeApiKey to get api key. + TranscriptionParam param = + TranscriptionParam.builder() + .apiKey(getDashScopeApiKey()) // set your apikey in config.Environments.yourApikey + .model("sensevoice-v1") // 'paraformer-8k-v1', 'paraformer-mtl-v1' + .fileUrls( + Arrays.asList( +// "https://api.huayang-star.com/api/audio/1957424645898579969_a2db5d76-b52c-4289-9c7e-ed55d7f15e42.mp3", +// "https://api.huayang-star.com/api/audio/1957424665985101825_7b9b03f4-a458-4eb6-ac7b-b5cf827a2315.mp3", + "https://api.huayang-star.com/api/audio/1957424645898579969_a2db5d76-b52c-4289-9c7e-ed55d7f15e42.mp3")) + .build(); + try { + Transcription transcription = new Transcription(); + // post request to transcribe service + TranscriptionResult result = transcription.asyncCall(param); + + System.out.println("RequestId: " + result.getRequestId()); + // waiting for transcription finish + result = + transcription.wait( + TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId())); + // get Transcription result after waiting + List taskResultList = result.getResults(); + if (taskResultList != null && !taskResultList.isEmpty()) { + for (TranscriptionTaskResult taskResult : taskResultList) { + // get Transcription rersult url + String transcriptionUrl = taskResult.getTranscriptionUrl(); + // get transcription result by http get + HttpURLConnection connection = + (HttpURLConnection) new URL(transcriptionUrl).openConnection(); + connection.setRequestMethod("GET"); + connection.connect(); + BufferedReader reader = + new BufferedReader(new InputStreamReader(connection.getInputStream())); + // format json print + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + JsonElement jsonResult = gson.fromJson(reader, JsonObject.class); + System.out.println(gson.toJson(jsonResult)); +// System.out.println( +// gson.toJson( +// SenseVoiceParser.parseSenseVoiceResult( +// jsonResult.getAsJsonObject(), true, true, true))); + } + } + } catch (Exception e) { + System.out.println("error: " + e); + } + System.exit(0); + } + + /** + * Set your DashScope API key. More information: ... In fact, if you have set + * DASHSCOPE_API_KEY in your environment variable, you can ignore this, and the SDK will + * automatically get the api_key from the environment variable + */ + private static String getDashScopeApiKey() throws NoApiKeyException { + String dashScopeApiKey = null; + try { + ApiKey apiKey = new ApiKey(); + dashScopeApiKey = apiKey.getApiKey(null); // Retrieve from environment variable. + } catch (NoApiKeyException e) { + System.out.println("No API key found in environment."); + } + if (dashScopeApiKey == null) { + // If you cannot set api_key in your environment variable, + // you can set it here by code + dashScopeApiKey = "your-dashscope-api-key"; + } + return dashScopeApiKey; + } +}