Compare commits

...

1 Commits

Author SHA1 Message Date
xiaoxia 67e2d939ae fix: 确保预览和生成API始终传递voice_library_id
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 3m3s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m45s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m2s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m6s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m13s
AI Code Review / AI Code Review (pull_request) Failing after 4m48s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m1s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m59s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m37s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m42s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 9m4s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 2m48s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 2m24s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 34s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
问题:用户在配音步骤选择了配音,但确认生成后视频中没有配音。
根因:voice_library_id 使用条件展开(非空才传),在某些边界情况下
可能被忽略,导致后端收不到配音参数。

修复:
1. useGenerateVideo.ts: voice_library_id 始终传递(不再条件展开)
2. useStep6Cover.ts: 预览创建时同样始终传递 voice_library_id
3. clone模式增加 selectedVoice 兜底,避免切换模式后配音丢失
4. 保留 voice_ids 作为二次兜底
2026-08-27 11:42:59 +08:00
2 changed files with 13 additions and 7 deletions
@@ -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: {
@@ -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,