From deea31dc07bd543353583592b37ed28e423be1e4 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 9 Sep 2026 10:29:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20AI=E6=95=B0=E5=AD=97=E4=BA=BA=E5=AF=B9?= =?UTF-8?q?=E5=8F=A3=E5=9E=8B=E6=8E=A5=E5=8F=A3=E5=AF=B9=E9=BD=90=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E6=96=B0=E5=8F=82=E6=95=B0=20video=5Furl=20(#1809=20?= =?UTF-8?q?=E8=A1=A5=E5=85=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - createLipsyncJob 参数 video_asset_id → video_url(后端 schema 已改) - 新增 getAssetById:先按素材 id 查 /assets/{id} 拿 file_url 再传给后端 - voice_id/script_text 直接传后端(后端内部调 TTS) - 删除前端 video_asset_id 传参,全工程 video_asset_id 残留已清零 - 新增 file_url 为空时的明确 toast 提示,避免静默失败 - UI/其他功能不动 --- apps/web/src/pages/ai-avatar/AiAvatarPage.tsx | 18 ++++++++++++++++-- apps/web/src/pages/ai-avatar/api/aiAvatar.ts | 8 +++++++- 2 files changed, 23 insertions(+), 3 deletions(-) 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 -- 2.54.0