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,