diff --git a/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx b/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx index d53b49dab..5ffab6867 100644 --- a/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx +++ b/apps/web/src/pages/ai-avatar/AiAvatarPage.tsx @@ -13,7 +13,13 @@ import PanelTitleConfig from "./components/PanelTitleConfig" import PanelCoverAndGenerate from "./components/PanelCoverAndGenerate" import { ModalAssetPicker } from "./components/ModalAssetPicker" import ModalBRollEditor from "./components/ModalBRollEditor" -import { getScripts, createLipsyncJob, getLipsyncJob, submitRender } from "./api/aiAvatar" +import { + getScripts, + getAssetById, + createLipsyncJob, + getLipsyncJob, + submitRender, +} from "./api/aiAvatar" /** 面板折叠状态 */ type PanelKey = "video" | "voice" | "script" | "title" | "cover" @@ -50,10 +56,18 @@ const AiAvatarPage: React.FC = () => { return } try { + // ① 先按素材 id 拿 file_url(#1809 补充:对齐后端新参数 video_url) + const asset = await getAssetById(video.id) + const videoUrl = asset?.file_url + if (!videoUrl) { + message.error("获取出镜视频播放地址失败,请重新选择素材") + return + } + // ② voice_id(预设/克隆 UUID 均由后端内部调 TTS)+ script_text + video_url const job = await createLipsyncJob({ voice_id: voice.voice_id, script_text: state.scriptText, - video_asset_id: video.id, + video_url: videoUrl, }) state.setLipsyncJob(job) message.success("对口型任务已提交,生成中…") diff --git a/apps/web/src/pages/ai-avatar/api/aiAvatar.ts b/apps/web/src/pages/ai-avatar/api/aiAvatar.ts index c84904f4f..75704c47c 100644 --- a/apps/web/src/pages/ai-avatar/api/aiAvatar.ts +++ b/apps/web/src/pages/ai-avatar/api/aiAvatar.ts @@ -28,11 +28,17 @@ export const deleteScript = async (id: string): Promise => { await apiClient.delete(`/scripts/${id}`) } +/* ── 素材单查(用于拿到 file_url 传给对口型等新接口) ── */ +export const getAssetById = async (id: string): Promise<{ file_url?: string; id: string }> => { + const response = await apiClient.get<{ file_url?: string; id: string }>(`/assets/${id}`) + return response.data +} + /* ── 对口型 ── */ export const createLipsyncJob = async (data: { voice_id: string script_text: string - video_asset_id: string + video_url: string }): Promise => { const response = await apiClient.post("/lipsync/jobs", data) return response.data