From 67e2d939aeab69c978bac79687a36570bc61dd51 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 27 Aug 2026 11:42:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A1=AE=E4=BF=9D=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E5=92=8C=E7=94=9F=E6=88=90API=E5=A7=8B=E7=BB=88=E4=BC=A0?= =?UTF-8?q?=E9=80=92voice=5Flibrary=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:用户在配音步骤选择了配音,但确认生成后视频中没有配音。 根因:voice_library_id 使用条件展开(非空才传),在某些边界情况下 可能被忽略,导致后端收不到配音参数。 修复: 1. useGenerateVideo.ts: voice_library_id 始终传递(不再条件展开) 2. useStep6Cover.ts: 预览创建时同样始终传递 voice_library_id 3. clone模式增加 selectedVoice 兜底,避免切换模式后配音丢失 4. 保留 voice_ids 作为二次兜底 --- .../web/src/pages/generate/hooks/useGenerateVideo.ts | 12 ++++++++---- apps/web/src/pages/generate/hooks/useStep6Cover.ts | 8 +++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts index 57492b7d4..1b002a421 100755 --- a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts +++ b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts @@ -71,9 +71,12 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { // 封面 URL:优先 AI 生成缩略图,兜底用户上传 const coverUrl = props.coverSettings?.thumbnail_url || props.coverSettings?.upload_url || "" - // 解析配音参数:voiceMode=clone 时用 selectedClonedVoice,否则用 selectedVoice + // 解析配音参数:voice_library_id 是配音素材库 asset ID + // 优先用当前 voiceMode 对应的选择,兜底用 selectedVoice(防止 voiceMode 切换后丢失) const voiceLibraryId = - props.voiceMode === "clone" ? props.selectedClonedVoice || "" : props.selectedVoice || "" + props.voiceMode === "clone" + ? props.selectedClonedVoice || props.selectedVoice || "" + : props.selectedVoice || "" // 创建生成任务(服务器渲染) const taskResp = await createGenerationTask({ @@ -85,8 +88,9 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { custom_title: props.titleSettings?.title || "", duration: props.duration || undefined, video_ratio: props.videoRatio, - // 配音:优先用 voice_library_id(配音素材库 asset),兜底 voice_ids - ...(voiceLibraryId ? { voice_library_id: voiceLibraryId } : {}), + // 配音:始终传递 voice_library_id,确保后端能正确接收 + voice_library_id: voiceLibraryId, + // 兜底:如果 voice_library_id 为空但 selectedVoice 有值,也传 voice_ids ...(props.selectedVoice && !voiceLibraryId ? { voice_ids: [props.selectedVoice] } : {}), // BGM 配置:受 bgm 开关控制,enabled=false 时也显式传覆盖模板 BGM bgm_config: { diff --git a/apps/web/src/pages/generate/hooks/useStep6Cover.ts b/apps/web/src/pages/generate/hooks/useStep6Cover.ts index 26fdd1241..79fba4fc9 100644 --- a/apps/web/src/pages/generate/hooks/useStep6Cover.ts +++ b/apps/web/src/pages/generate/hooks/useStep6Cover.ts @@ -178,13 +178,15 @@ export function useStep6Cover({ previewParamsRef.current = JSON.stringify({ selectedTemplate, assetIds, titleSettings }) // 解析配音参数:voiceMode=clone 时用 selectedClonedVoice,否则用 selectedVoice const previewVoiceLibraryId = - voiceMode === "clone" ? selectedClonedVoice || "" : selectedVoice || "" + voiceMode === "clone" ? selectedClonedVoice || selectedVoice || "" : selectedVoice || "" const previewResp = await createPreview({ template_id: selectedTemplate, asset_ids: assetIds, duration: duration || 30, - // 配音:voice_library_id 是配音素材库 asset ID(用户上传的音频或 AI 配音) - ...(previewVoiceLibraryId ? { voice_library_id: previewVoiceLibraryId } : {}), + // 配音:始终传递 voice_library_id,确保后端能正确接收 + voice_library_id: previewVoiceLibraryId, + // 兜底:如果 voice_library_id 为空但 selectedVoice 有值,也传 voice_ids + ...(selectedVoice && !previewVoiceLibraryId ? { voice_ids: [selectedVoice] } : {}), // BGM 配置:受 bgm 开关控制 bgm_config: { enabled: bgm !== false, -- 2.54.0