From 2d12c5a20be67b004436256c0b46b0fe7cfa1516 Mon Sep 17 00:00:00 2001 From: WangLeo <690854599@qq.com> Date: Fri, 12 Jun 2026 19:20:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20Music=20=E9=9F=B3?= =?UTF-8?q?=E4=B9=90=E7=94=9F=E6=88=90=E5=B9=B3=E5=8F=B0=EF=BC=8C=E9=81=B5?= =?UTF-8?q?=E5=BE=AA=20Platform=20Descriptor=20=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基于旧项目 ai_music_v2.0 迁移,与 Painting/Video 统一架构:HTTP 轮询 + suanli 后端、 API 驱动配置、mode 独立 ref 驱动控件显隐。新增 AudioPlayer/CustomSlider 通用组件, dialogBox/set.vue/taskPolling/modelApi 完成集成适配。 --- CLAUDE.md | 25 +- components.d.ts | 4 +- src/assets/dialog/beautify.svg | 3 + src/assets/dialog/commonMode.svg | 6 + src/assets/dialog/editMode.svg | 4 + src/assets/dialog/lock.svg | 4 +- src/assets/dialog/lyrics.svg | 6 + src/assets/dialog/professionalMode.svg | 8 + src/assets/dialog/randomSeed.svg | 11 + src/assets/dialog/remixMode.svg | 9 + src/assets/dialog/restore.svg | 4 + src/assets/display/background1.png | Bin 0 -> 10470 bytes src/assets/display/background2.png | Bin 0 -> 10488 bytes src/assets/display/background3.png | Bin 0 -> 10340 bytes src/assets/display/background4.png | Bin 0 -> 6889 bytes src/assets/display/image1.png | Bin 0 -> 6640 bytes src/assets/display/image2.png | Bin 0 -> 7413 bytes src/assets/display/image3.png | Bin 0 -> 7278 bytes src/assets/display/image4.png | Bin 0 -> 5389 bytes src/assets/display/time.svg | 4 + src/components/AudioPlayer/index.vue | 267 +++++++++++++++++ src/components/CustomSlider/index.vue | 168 +++++++++++ src/components/dialogBox/index.vue | 1 + src/platforms/music/controls/lyricsInput.vue | 120 ++++++++ src/platforms/music/controls/modeSelector.vue | 145 +++++++++ .../music/controls/pureMusicGroup.vue | 167 +++++++++++ src/platforms/music/controls/timeControl.vue | 147 +++++++++ src/platforms/music/imageUploader.vue | 68 +++++ src/platforms/music/index.js | 278 ++++++++++++++++++ src/platforms/music/modelSelector.vue | 34 +++ src/utils/modelApi.js | 2 + src/utils/taskPolling.js | 2 + src/views/home/display/components/set.vue | 18 +- 33 files changed, 1497 insertions(+), 8 deletions(-) create mode 100644 src/assets/dialog/beautify.svg create mode 100644 src/assets/dialog/commonMode.svg create mode 100644 src/assets/dialog/editMode.svg create mode 100644 src/assets/dialog/lyrics.svg create mode 100644 src/assets/dialog/professionalMode.svg create mode 100644 src/assets/dialog/randomSeed.svg create mode 100644 src/assets/dialog/remixMode.svg create mode 100644 src/assets/dialog/restore.svg create mode 100644 src/assets/display/background1.png create mode 100644 src/assets/display/background2.png create mode 100644 src/assets/display/background3.png create mode 100644 src/assets/display/background4.png create mode 100644 src/assets/display/image1.png create mode 100644 src/assets/display/image2.png create mode 100644 src/assets/display/image3.png create mode 100644 src/assets/display/image4.png create mode 100644 src/assets/display/time.svg create mode 100644 src/components/AudioPlayer/index.vue create mode 100644 src/components/CustomSlider/index.vue create mode 100644 src/platforms/music/controls/lyricsInput.vue create mode 100644 src/platforms/music/controls/modeSelector.vue create mode 100644 src/platforms/music/controls/pureMusicGroup.vue create mode 100644 src/platforms/music/controls/timeControl.vue create mode 100644 src/platforms/music/imageUploader.vue create mode 100644 src/platforms/music/index.js create mode 100644 src/platforms/music/modelSelector.vue diff --git a/CLAUDE.md b/CLAUDE.md index c5a07c5..5a6584d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## 常用命令 ```bash -pnpm dev # 启动 Vite 开发服务器 +pnpm install # 安装依赖 +pnpm dev # 启动 Vite 开发服务器(默认 http://localhost:5173) pnpm build # 生产构建 pnpm preview # 预览生产构建 npx eslint . # 代码检查(@antfu/eslint-config,Vue 支持,无 TypeScript) @@ -128,7 +129,7 @@ props: (config) => ({ }) ``` -**自注册:** 每个平台文件底部调用 `registerPlatform('Painting', definePaintingPlatform)`,在 import 时自动注册。dialogBox 通过 `createPlatform(props.type)` 获取实例。 +**自注册:** 每个平台文件底部调用 `registerPlatform('Painting', definePaintingPlatform)`,在 import 时自动注册。dialogBox 通过 `createPlatform(props.type)` 获取实例。注册表内部将 key 统一转为小写,因此 `'Painting'` 和 `'painting'` 等效。 ### dialogBox 通用编排壳 @@ -258,7 +259,7 @@ Video 的 `getDefaultModel()` 返回 `''`,不硬编码 UUID;模型列表加 - **VirtualScroller 存在独立测试页**:`src/components/virtual-scroller/test.html` + `test-data.js`,可用于验证虚拟滚动行为。 - **VirtualScroller 残留备份文件**:`src/components/virtual-scroller/VirtualScroller copy.vue` 是备份副本,不应被引用或修改。 - **Element Plus `` 不响应 `autosize` 动态变化**:`ElInput` 只在 mount 时读取 `autosize`,prop 更新时不会重新计算高度。因此 `dialogBox` 中 `Sender` 必须绑定 `:key="useDisplay.Sender_variant"`,通过强制重挂载来使新的 `autosize`(`minRows`/`maxRows`)生效。 -- **Video modelSelector pattern→modelType 映射**:`getModelType()` 在 `modelSelector.vue` 中将 pattern tag 映射为 modelType——"文生视频"→`text`,"首尾帧"→`image`,"数字人"→`digitalHuman`。该值用于 imageUploader 的 `showEndFrame` 判断和上传槽位数量。 +- **Video modelSelector pattern→modelType 映射**:`getModelType()` 在 `modelSelector.vue` 中将 pattern tag 映射为 modelType——"文生视频"→`text`,"图生视频"→`imageToVideo`,"首尾帧"→`image`,"数字人"→`digitalHuman`,"全能参考"→`allReference`,"主体参考"→`subjectReference`。该值用于 imageUploader 的标签文本和上传槽位数量。 - **Video `imageUploadLimit()` 累加逻辑**:对于有多个 `imageUpload` 参数的模型(如首尾帧模型的 `firstImageUrl` + `lastImageUrl`),应累加所有 `imageUpload` 参数的 `maxCount`,而非只取第一个。否则首尾帧模型只显示一个上传槽位,尾帧上传无法触发。 - **`buildTaskBody` 参考图映射**:Video 平台在 `buildTaskBody` 中需将 `referenceImages` 按索引顺序写入 `imageUpload` 参数(`referenceImages[0]` → `firstImageUrl`,`referenceImages[1]` → `lastImageUrl`),否则图片数据不会包含在任务请求中。 @@ -333,6 +334,24 @@ Video 的 `getDefaultModel()` 返回 `''`,不硬编码 UUID;模型列表加 **注意**:前缀字符串本身来自环境变量(如 `VITE_API_TASK_PREFIX=/suanli`),不是硬编码。`request.js` 在初始化时读取这些变量,构建 prefix→target 映射表。 +### 环境变量速查 + +```bash +# .env.development +VITE_BASE = '/' # 应用基础路径 +VITE_API_PREFIX = '/api' # 主服务前缀 +VITE_API_BASE_URL = 'http://...' # 主服务(默认目标) +VITE_API_PAY_PREFIX = '/pay' # 支付服务前缀 +VITE_API_PAY_TARGET = 'http://...' # 支付服务目标 +VITE_API_TASK_PREFIX = '/suanli' # 任务服务前缀 +VITE_API_TASK_TARGET = 'http://...' # 任务服务目标 +VITE_API_WORKFLOW_UPLOAD = 'http://...' # 图片上传地址(imageUploader 组件 action) +VITE_OPEN_DEVTOOLS = false # 是否开启开发者工具 +FILE_OPEN_PREVIEW = true # 是否开启 KKFileView 预览 +``` + +`vite.config.js` 中 `envPrefix: ['VITE', 'FILE']`,因此只有以 `VITE_` 和 `FILE_` 开头的变量会被暴露给客户端代码。 + ### 平台编码映射 | 类型 | 平台编码 | diff --git a/components.d.ts b/components.d.ts index f1a82e6..42acee8 100644 --- a/components.d.ts +++ b/components.d.ts @@ -11,12 +11,12 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + AudioPlayer: typeof import('./src/components/AudioPlayer/index.vue')['default'] Canvas: typeof import('./src/components/canvas/index.vue')['default'] - copy: typeof import('./src/components/virtual-scroller/VirtualScroller copy.vue')['default'] + CustomSlider: typeof import('./src/components/CustomSlider/index.vue')['default'] DialogBox: typeof import('./src/components/dialogBox/index.vue')['default'] ElButton: typeof import('element-plus/es')['ElButton'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] - ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] ElUpload: typeof import('element-plus/es')['ElUpload'] IEpCalendar: typeof import('~icons/ep/calendar')['default'] diff --git a/src/assets/dialog/beautify.svg b/src/assets/dialog/beautify.svg new file mode 100644 index 0000000..ba05e00 --- /dev/null +++ b/src/assets/dialog/beautify.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/dialog/commonMode.svg b/src/assets/dialog/commonMode.svg new file mode 100644 index 0000000..8779074 --- /dev/null +++ b/src/assets/dialog/commonMode.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/dialog/editMode.svg b/src/assets/dialog/editMode.svg new file mode 100644 index 0000000..9e5d839 --- /dev/null +++ b/src/assets/dialog/editMode.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/dialog/lock.svg b/src/assets/dialog/lock.svg index 093947a..bba9c97 100644 --- a/src/assets/dialog/lock.svg +++ b/src/assets/dialog/lock.svg @@ -1,3 +1,5 @@ - + + + diff --git a/src/assets/dialog/lyrics.svg b/src/assets/dialog/lyrics.svg new file mode 100644 index 0000000..6bfdde1 --- /dev/null +++ b/src/assets/dialog/lyrics.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/dialog/professionalMode.svg b/src/assets/dialog/professionalMode.svg new file mode 100644 index 0000000..fe85134 --- /dev/null +++ b/src/assets/dialog/professionalMode.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/dialog/randomSeed.svg b/src/assets/dialog/randomSeed.svg new file mode 100644 index 0000000..3454060 --- /dev/null +++ b/src/assets/dialog/randomSeed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/dialog/remixMode.svg b/src/assets/dialog/remixMode.svg new file mode 100644 index 0000000..2258de4 --- /dev/null +++ b/src/assets/dialog/remixMode.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/dialog/restore.svg b/src/assets/dialog/restore.svg new file mode 100644 index 0000000..7535a62 --- /dev/null +++ b/src/assets/dialog/restore.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/display/background1.png b/src/assets/display/background1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e741886d1064e8eb81a719720c9750d1f25d933 GIT binary patch literal 10470 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 literal 0 HcmV?d00001 diff --git a/src/assets/display/background2.png b/src/assets/display/background2.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d39717be6800f6c9865eed902e4c6710a31958 GIT binary patch literal 10488 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 z zR;VC*_!Rn*KwR^;XZ)}zBoDF4_ra>hnhOeJ@sX|P3v+*}95#L$Y;_*uGVj`Gy%9h7 zz#%tRzVhjwg10eLW$I#$f1xOdY;~AZQ0l{;sjMFOJ%GmdS3|)0FTw?;(Gv|pWhOZt zKv2FgTS@Y;R#S+rM8{F8$5o`h{_rrcAV{NlaW0Jt9T!O#$#DBp!1u_Nz;edVdLtwH zO@V+zrZry{f$ODz*{D5WRMhgMK71}>+1vewy5-0~Lx?BFnv5H(ZmG8l7<-^VJxpaY zu!eS3f8nqra@d2#EKfRWL&bYy?paNuoFR)T;}L)LOGdAM9@D>UJr-`1CU2ZF!X8c;*sx67+Zcfv;TM-5Gf<#vf~y zYxEp-H$P9wkLgQqfu-eklRo1g%C8eb!u;a%IUYf9YRUBh^5Qql{9~Q3RihoSUIV!i zBBfQjX_6Pvan`dKHJ=VCn1~wkn%ucu$4YhetvNLm$$-1b zOe4DasMYEn*pG;1Cse_rXf#UcMYDhsE}&)9BDIagCqpX?e2kQ(9&>R^rlPi0UPRWj!ep}i9oAA&r#uS3Xm(%D*exDo=CZF6#G-(a8-e|<< zUs=xB)x->OF3n2ZaCqpl4k*D>x`~PG!*VCt7Z&b19SR_QNQ`n6X6VN^vxS?cY_1}}Va5FDX;Hx}T;uiQBTGXn<42cOBfZ?04TM&0Hu z)$@KxST(p;L7ekT`iyI@3;b?Bru#rv7b!1|&~3FPI?1cJQ!Y*Oba(L#9i zE6}{JB4MbUiK8xCi=|RXKS+kYf4WPj_X`hXus8AzgN?0Po~zCD?-HN*wL=KT!{yo5 z@q#(l6#7SdzkO=dxA%APi@$|{;Klxp?gRbwf`8pYYaRA7pg9IJwWh zLF@C`uhB)wRfC3Sj9WB?UZUbI6 z&&`(f3%@+xA)lSvt>J7!4u4O+IP=~+sKskl<@Z)0vJ75IcT9w_#gEcIBA9b$xf<** z&0{Cr613kNOnRTHU~(?~(RDv=GCW(K-a69^IsTKUb+SLiA-grpV6@$!RvA0+zmF`2 N`%r{lg^pv`{{b{-O0@t0 literal 0 HcmV?d00001 diff --git a/src/assets/display/image1.png b/src/assets/display/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..acb49956867863af21640efab098e2d79a551545 GIT binary patch literal 6640 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 + + + diff --git a/src/components/AudioPlayer/index.vue b/src/components/AudioPlayer/index.vue new file mode 100644 index 0000000..779138f --- /dev/null +++ b/src/components/AudioPlayer/index.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/src/components/CustomSlider/index.vue b/src/components/CustomSlider/index.vue new file mode 100644 index 0000000..ef0abbb --- /dev/null +++ b/src/components/CustomSlider/index.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/components/dialogBox/index.vue b/src/components/dialogBox/index.vue index 8af49df..19e82e3 100644 --- a/src/components/dialogBox/index.vue +++ b/src/components/dialogBox/index.vue @@ -83,6 +83,7 @@ import { generate } from '@/utils/taskPolling' // 确保平台包被加载(触发自注册) import '@/platforms/painting/index.js' import '@/platforms/video/index.js' +import '@/platforms/music/index.js' const props = defineProps({ isGenerate: { type: Boolean, default: false }, diff --git a/src/platforms/music/controls/lyricsInput.vue b/src/platforms/music/controls/lyricsInput.vue new file mode 100644 index 0000000..ac0e4d1 --- /dev/null +++ b/src/platforms/music/controls/lyricsInput.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/platforms/music/controls/modeSelector.vue b/src/platforms/music/controls/modeSelector.vue new file mode 100644 index 0000000..ab09121 --- /dev/null +++ b/src/platforms/music/controls/modeSelector.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/platforms/music/controls/pureMusicGroup.vue b/src/platforms/music/controls/pureMusicGroup.vue new file mode 100644 index 0000000..df02f45 --- /dev/null +++ b/src/platforms/music/controls/pureMusicGroup.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/platforms/music/controls/timeControl.vue b/src/platforms/music/controls/timeControl.vue new file mode 100644 index 0000000..6ba723d --- /dev/null +++ b/src/platforms/music/controls/timeControl.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/src/platforms/music/imageUploader.vue b/src/platforms/music/imageUploader.vue new file mode 100644 index 0000000..619ad77 --- /dev/null +++ b/src/platforms/music/imageUploader.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/platforms/music/index.js b/src/platforms/music/index.js new file mode 100644 index 0000000..4a7a46b --- /dev/null +++ b/src/platforms/music/index.js @@ -0,0 +1,278 @@ +import { markRaw, reactive, ref, computed } from 'vue' +import { registerPlatform } from '@/platforms/registry.js' +import { fetchPlatformModels, getPlatformCode, getModelConfig, getModelId, preloadModelConfigs } from '@/utils/modelApi' +import { syncParamValues, checkShowWhen } from '@/utils/modelConfigHelper.js' +import ModelSelector from './modelSelector.vue' +import ImageUploader from './imageUploader.vue' +import ModeSelector from './controls/modeSelector.vue' +import PureMusicGroup from './controls/pureMusicGroup.vue' +import LyricsInput from './controls/lyricsInput.vue' +import TimeControl from './controls/timeControl.vue' +import ParamGroup from '@/components/ParamGroup/index.vue' +import Select from '@/components/Select/index.vue' +import { ElMessage } from 'element-plus' + +// 由专用控件处理的 ui 类型 +const handledUis = ['textarea', 'proportion', 'imageUpload', 'hidden', 'quantity'] + +export function defineMusicPlatform() { + const model = ref('') + const modelType = ref('text') + const mode = ref('常用模式') + const modelConfig = ref(null) + const paramValues = reactive({}) + const promptPlaceholder = ref('描述你想生成的音乐风格和感觉。') + const referenceAudio = ref([]) + const models = ref([]) + + // 音乐专用 ref + const quantity = ref(1) + const duration = ref('Auto') + const lyrics = ref('') + const randomSeed = ref('') + const pureMusic = ref(true) + + const code = computed(() => getPlatformCode('Music')) + + async function loadModels() { + models.value = await fetchPlatformModels(code.value) + if (!model.value && models.value.length) { + const first = models.value.find(m => !m.disabled) + if (first) model.value = first.id + } + if (models.value.length) { + const ids = models.value.map(m => m.id) + preloadModelConfigs(ids) + } + } + + async function loadConfig(modelName) { + const modelId = await getModelId('Music', modelName) + if (!modelId) return null + const config = await getModelConfig(modelId) + syncMusicDefaults(config) + } + + // 音乐平台的 syncDefaults 包装 + function syncMusicDefaults(config) { + modelConfig.value = config + if (!config) return + + config.params.forEach((p) => { + if (!(p.name in paramValues)) { + paramValues[p.name] = p.default ?? '' + } + }) + + // 同步专用 ref + const modeParam = config.params.find(p => p.name === 'mode' || p.ui === 'mode') + if (modeParam) mode.value = modeParam.default || '常用模式' + + const qtyParam = config.params.find(p => p.ui === 'quantity') + if (qtyParam) quantity.value = qtyParam.default || 1 + + const durParam = config.params.find(p => p.name === 'duration') + if (durParam) duration.value = durParam.default || 'Auto' + + const lyricsParam = config.params.find(p => p.name === 'lyrics') + if (lyricsParam) lyrics.value = lyricsParam.default || '' + + const seedParam = config.params.find(p => p.name === 'randomSeed' || p.name === 'seed') + if (seedParam) randomSeed.value = seedParam.default || '' + + const pmParam = config.params.find(p => p.name === 'pureMusic') + if (pmParam) pureMusic.value = pmParam.default !== undefined ? pmParam.default : true + + if (config.promptPlaceholder) { + promptPlaceholder.value = config.promptPlaceholder + } + } + + function getDefaultModel() { return '' } + + function imageUploadLimit() { + if (!modelConfig.value) return 0 + return modelConfig.value.params + .filter(p => p.ui === 'imageUpload') + .reduce((sum, p) => sum + (p.maxCount || 1), 0) + } + + function validateBeforeSubmit() { + if (!model.value) return '请选择模型' + if (mode.value === '专业模式' && !referenceAudio.value.length) return '请上传参考音频' + return null + } + + function getUploaderBindings() { + return { modelType: mode.value === '专业模式' ? 'image' : 'text', imagesCount: referenceAudio.value.length } + } + + function showImageUploader() { + return mode.value === '专业模式' + } + + function isImageRequired() { + return mode.value === '专业模式' + } + + function buildTaskBody({ prompt, referenceImages }) { + syncMusicParamValues() + // 将 prompt 写入 paramValues(如果 config 中有 prompt 参数) + const promptParam = modelConfig.value?.params?.find(p => p.ui === 'textarea') + if (promptParam) paramValues[promptParam.name] = prompt + + // 将参考音频映射到 imageUpload 参数 + if (modelConfig.value) { + const imageUploadParams = modelConfig.value.params.filter(p => p.ui === 'imageUpload') + imageUploadParams.forEach((p, i) => { + if (referenceAudio.value[i]) { + paramValues[p.name] = referenceAudio.value[i].url + } + }) + } + return { ...paramValues } + } + + function syncMusicParamValues() { + if (!modelConfig.value) return + const config = modelConfig.value + + const qtyParam = config.params.find(p => p.ui === 'quantity') + if (qtyParam) paramValues[qtyParam.name] = quantity.value + + const durParam = config.params.find(p => p.name === 'duration') + if (durParam) paramValues[durParam.name] = duration.value + + const lyricsParam = config.params.find(p => p.name === 'lyrics') + if (lyricsParam) paramValues[lyricsParam.name] = lyrics.value + + const seedParam = config.params.find(p => p.name === 'randomSeed' || p.name === 'seed') + if (seedParam) paramValues[seedParam.name] = randomSeed.value + + const pmParam = config.params.find(p => p.name === 'pureMusic') + if (pmParam) paramValues[pmParam.name] = pureMusic.value + + const modeParam = config.params.find(p => p.name === 'mode' || p.ui === 'mode') + if (modeParam) paramValues[modeParam.name] = mode.value + } + + function fillFromResult(resultData) { + if (resultData.mode !== undefined) mode.value = resultData.mode + if (resultData.prompt !== undefined) paramValues.prompt = resultData.prompt + if (resultData.duration !== undefined) duration.value = resultData.duration + if (resultData.lyrics !== undefined) lyrics.value = resultData.lyrics + if (resultData.randomSeed !== undefined) randomSeed.value = resultData.randomSeed + if (resultData.quantity !== undefined) quantity.value = resultData.quantity + if (resultData.pureMusic !== undefined) pureMusic.value = resultData.pureMusic + } + + const controls = [ + { + name: 'modeSelector', + component: markRaw(ModeSelector), + beforeModel: true, + show: (config) => !!config?.params?.find(p => p.name === 'mode' || p.ui === 'mode'), + props: (config) => { + const modeParam = config?.params?.find(p => p.name === 'mode' || p.ui === 'mode') + return { + modelValue: mode.value, + 'onUpdate:modelValue': (v) => { mode.value = v }, + options: modeParam?.options || [] + } + } + }, + { + name: 'pureMusicGroup', + component: markRaw(PureMusicGroup), + beforeModel: false, + show: (config) => mode.value === '常用模式' && !!config?.params?.find(p => p.name === 'pureMusic'), + props: (config) => ({ + modelValue: pureMusic.value, + 'onUpdate:modelValue': (v) => { pureMusic.value = v }, + lyrics: lyrics.value, + 'onUpdate:lyrics': (v) => { lyrics.value = v } + }) + }, + { + name: 'lyricsInput', + component: markRaw(LyricsInput), + beforeModel: false, + show: (config) => mode.value === '专业模式' && !!config?.params?.find(p => p.name === 'lyrics'), + props: (config) => ({ + modelValue: lyrics.value, + 'onUpdate:modelValue': (v) => { lyrics.value = v } + }) + }, + { + name: 'timeControl', + component: markRaw(TimeControl), + beforeModel: false, + show: (config) => mode.value === '常用模式' && !!config?.params?.find(p => p.name === 'duration'), + props: (config) => { + const durParam = config?.params?.find(p => p.name === 'duration') + return { + modelValue: duration.value, + 'onUpdate:modelValue': (v) => { duration.value = v }, + min: durParam?.min || 10, + max: durParam?.max || 240 + } + } + }, + { + name: 'quantity', + component: markRaw(Select), + beforeModel: false, + show: (config) => !!config?.params?.find(p => p.ui === 'quantity'), + props: (config) => { + const qtyParam = config?.params?.find(p => p.ui === 'quantity') + const maxQty = Math.max(...(qtyParam?.options || [1])) + const limited = mode.value === '专业模式' ? 1 : maxQty + return { + modelValue: quantity.value, + 'onUpdate:modelValue': (v) => { quantity.value = v }, + options: Array.from({ length: limited }, (_, i) => ({ value: i + 1, label: `${i + 1}条` })) + } + } + }, + { + name: 'paramGroup', + component: markRaw(ParamGroup), + beforeModel: false, + show: (config) => { + if (!config) return false + return config.params.some((p) => { + if (handledUis.includes(p.ui)) return false + if (['mode', 'pureMusic', 'lyrics', 'duration', 'quantity'].includes(p.name)) return false + if (!checkShowWhen(p, { ...paramValues, mode: mode.value })) return false + return true + }) + }, + props: (config) => ({ + config, + paramValues, + excludeNames: ['mode', 'pureMusic', 'lyrics', 'duration', 'quantity'] + }) + } + ] + + return { + id: 'Music', + label: 'AI音乐2026', + ModelSelector: markRaw(ModelSelector), + modelSelectorProps: () => ({ models: models.value }), + controls, + ImageUploader: markRaw(ImageUploader), + state: { + model, modelType, mode, modelConfig, paramValues, + promptPlaceholder, referenceAudio, models, + quantity, duration, lyrics, randomSeed, pureMusic + }, + model, modelType, mode, modelConfig, promptPlaceholder, + loadModels, loadConfig, getDefaultModel, + imageUploadLimit, validateBeforeSubmit, + getUploaderBindings, showImageUploader, isImageRequired, + buildTaskBody, fillFromResult + } +} + +registerPlatform('Music', defineMusicPlatform) diff --git a/src/platforms/music/modelSelector.vue b/src/platforms/music/modelSelector.vue new file mode 100644 index 0000000..4312462 --- /dev/null +++ b/src/platforms/music/modelSelector.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/utils/modelApi.js b/src/utils/modelApi.js index d4368a4..b78262b 100644 --- a/src/utils/modelApi.js +++ b/src/utils/modelApi.js @@ -44,6 +44,8 @@ export function getPlatformCode(type) { return 'ai_painting_talk' case 'Video': return 'ai_video_talk' + case 'Music': + return 'ai_music_talk' default: return 'ai_painting_talk' } diff --git a/src/utils/taskPolling.js b/src/utils/taskPolling.js index 28801e3..a272ca6 100644 --- a/src/utils/taskPolling.js +++ b/src/utils/taskPolling.js @@ -10,6 +10,8 @@ export function getChargeType(chargeType) { return 1 case 'Video': return 4 + case 'Music': + return 5 default: return 2 } diff --git a/src/views/home/display/components/set.vue b/src/views/home/display/components/set.vue index f5f8709..3faf5cb 100644 --- a/src/views/home/display/components/set.vue +++ b/src/views/home/display/components/set.vue @@ -5,7 +5,7 @@

- {{ props.item.generateData.prompt || '生成图片' }} + {{ props.item.generateData.prompt || (props.item.type === 'Music' ? '生成音频' : '生成图片') }}
@@ -85,6 +85,19 @@
+ +
+
+ + +
+
+ +
+
+
+
+
@@ -193,6 +206,7 @@ const isCollected = (url) => { const generateStatusText = computed(() => { if (props.item.status === 'generate') { + if (props.item.type === 'Music') return '音乐生成中...' return '正在生成中...' } return '' @@ -291,7 +305,7 @@ const addCollection = async (url) => { const copyPrompt = async () => { try { - const promptText = props.item.generateData.prompt || '生成图片' + const promptText = props.item.generateData.prompt || (props.item.type === 'Music' ? '生成音频' : '生成图片') await navigator.clipboard.writeText(promptText) ElMessage.success('提示词已复制到剪贴板') } catch (error) {