diff --git a/frontend/app/web-gold/package.json b/frontend/app/web-gold/package.json index 53f3805328..0ba2288658 100644 --- a/frontend/app/web-gold/package.json +++ b/frontend/app/web-gold/package.json @@ -23,6 +23,7 @@ "@tailwindcss/vite": "^4.1.14", "ai": "^6.0.39", "ant-design-vue": "^4.2.6", + "aplayer": "^1.10.1", "dayjs": "^1.11.18", "markdown-it": "^14.1.0", "path-to-regexp": "^6.3.0", diff --git a/frontend/app/web-gold/src/components/VoiceSelector.vue b/frontend/app/web-gold/src/components/VoiceSelector.vue index 2eb8e21b43..1117dcc239 100644 --- a/frontend/app/web-gold/src/components/VoiceSelector.vue +++ b/frontend/app/web-gold/src/components/VoiceSelector.vue @@ -27,19 +27,32 @@ 试听 + + +
diff --git a/frontend/app/web-gold/src/main.js b/frontend/app/web-gold/src/main.js index 95b3e2706a..26b7c711d1 100644 --- a/frontend/app/web-gold/src/main.js +++ b/frontend/app/web-gold/src/main.js @@ -3,6 +3,7 @@ import { createPinia } from 'pinia' import Antd from 'ant-design-vue' import 'normalize.css' import 'ant-design-vue/dist/reset.css' +import 'aplayer/dist/APlayer.min.css' import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; import 'dayjs/locale/zh-cn'; diff --git a/frontend/package.json b/frontend/package.json index d5ae75eadd..ed300c22a2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "description": "", "dependencies": { "@types/node": "^25.0.6", + "aplayer": "^1.10.1", "axios": "^1.12.2", "github-markdown-css": "^5.8.1", "localforage": "^1.10.0", diff --git a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/voice/service/TikUserVoiceServiceImpl.java b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/voice/service/TikUserVoiceServiceImpl.java index 4215ac9a74..a548745307 100644 --- a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/voice/service/TikUserVoiceServiceImpl.java +++ b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/voice/service/TikUserVoiceServiceImpl.java @@ -499,9 +499,9 @@ public class TikUserVoiceServiceImpl implements TikUserVoiceService { log.info("[previewVoice][试听,voiceConfigId={}, voiceId={}, userId={}]", voiceConfigId, reqVO.getVoiceId(), userId); - String voiceId = null; - String fileUrl = null; - String referenceText = null; + String voiceId; + String fileUrl; + String referenceText; // 1. 通过语音URL合成 if (StrUtil.isNotBlank(reqVO.getFileUrl()) && StrUtil.isNotBlank(reqVO.getTranscriptionText())) { @@ -510,6 +510,7 @@ public class TikUserVoiceServiceImpl implements TikUserVoiceService { ? reqVO.getFileUrl() : fileApi.presignGetUrl(rawFileUrl, PRESIGN_URL_EXPIRATION_SECONDS); referenceText = reqVO.getTranscriptionText(); + voiceId = null; } // 2. 用户配音 else if (voiceConfigId != null) { @@ -518,8 +519,10 @@ public class TikUserVoiceServiceImpl implements TikUserVoiceService { throw exception(VOICE_NOT_EXISTS, "配音不存在"); } - if (StrUtil.isNotBlank(voice.getVoiceId())) { - voiceId = voice.getVoiceId(); + voiceId = voice.getVoiceId(); + if (StrUtil.isNotBlank(voiceId)) { + fileUrl = null; + referenceText = null; } else { FileDO fileDO = fileMapper.selectById(voice.getFileId()); if (fileDO == null) { @@ -538,14 +541,14 @@ public class TikUserVoiceServiceImpl implements TikUserVoiceService { if (StrUtil.isBlank(voiceId)) { throw exception(VOICE_NOT_EXISTS, "系统配音音色ID不能为空"); } + fileUrl = null; + referenceText = null; } - // 统一处理:使用前端传入的 inputText,否则使用默认试听文本 String finalText = StrUtil.blankToDefault(reqVO.getInputText(), getPreviewText()); - String instruction = reqVO.getInstruction(); - Float speechRate = reqVO.getSpeechRate() != null ? reqVO.getSpeechRate() : 1.0f; - Float volume = reqVO.getVolume() != null ? reqVO.getVolume() : 0f; + Float speechRate = ObjectUtil.defaultIfNull(reqVO.getSpeechRate(), 1.0f); + Float volume = ObjectUtil.defaultIfNull(reqVO.getVolume(), 0f); String audioFormat = StrUtil.blankToDefault(reqVO.getAudioFormat(), "mp3"); // 缓存