diff --git a/apps/api/app/services/ai_avatar_cover_service.py b/apps/api/app/services/ai_avatar_cover_service.py index df0bd40aa..6e92d7ded 100644 --- a/apps/api/app/services/ai_avatar_cover_service.py +++ b/apps/api/app/services/ai_avatar_cover_service.py @@ -139,7 +139,11 @@ def persist_cover_to_oss(frame_url: str, *, job_id: str = "", prefix: str = "ai- content_type="image/jpeg", ) logger.info("[数字人封面] 封面已转存 OSS: key=%s", cover_key) - return public_url or frame_url + # 私有桶:返回预签名 URL(前端才能加载) + if public_url: + signed = storage.get_download_url(cover_key, expires_seconds=86400) + return signed + return frame_url except Exception: logger.warning("[数字人封面] 封面转存 OSS 失败,返回原始 URL", exc_info=True) return frame_url diff --git a/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx b/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx index 7c5114a5f..2c6f30122 100644 --- a/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx +++ b/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx @@ -197,7 +197,15 @@ const AiAvatarPage: React.FC = () => { await submitRender({ lipsync_job_id: state.lipsyncJob.id, script_id: state.script?.id, - b_roll_segments: state.bRollSegments as never, + b_roll_segments: state.bRollSegments.map((seg) => ({ + script_segment_index: seg.script_segment_index, + asset_url: seg.asset.file_url || "", + mode: seg.mode, + start_time: seg.start_time, + end_time: seg.end_time, + pip_position: seg.pip_position, + pip_scale: seg.pip_scale, + })) as never, // 字段映射:build_title_drawtext_filter 真实口径 text/font_size/font_color/position/... title_config: buildTitleConfigPayload(state.titleConfig), // cover_config:智能封面 cover_url + 截帧 timestamp diff --git a/apps/web/src/pages/ai-avatar/components/PanelLipsyncPreview.tsx b/apps/web/src/pages/ai-avatar/components/PanelLipsyncPreview.tsx index 920a51f40..845403ad2 100755 --- a/apps/web/src/pages/ai-avatar/components/PanelLipsyncPreview.tsx +++ b/apps/web/src/pages/ai-avatar/components/PanelLipsyncPreview.tsx @@ -56,7 +56,6 @@ export function PanelLipsyncPreview({ fontSize: `${(titleConfig.size || 36) * 0.55}px`, // 预览等比缩 fontWeight: titleConfig.bold ? 700 : 400, fontStyle: titleConfig.italic ? "italic" : "normal", - whiteSpace: "pre-wrap", textAlign: "center", width: "90%", padding: "4px 8px", @@ -142,7 +141,16 @@ export function PanelLipsyncPreview({ {isDone && lipsyncJob?.output_video_url ? (