feat: enforce english prompt language strategy

This commit is contained in:
2026-05-18 20:07:11 +08:00
parent adf8b2ba0a
commit bc0b010def
4 changed files with 560 additions and 205 deletions

View File

@@ -663,7 +663,7 @@ api/main.py
</div>
<div class="flow-row">
<div><strong>你看到的区域</strong><span>信息流复刻分镜工作台</span></div>
<div><strong>主要源码</strong><span><code>AudioStoryboardPlanPanel</code><code>ProductReferenceCard</code><code>MissingProductViewSlot</code><code>buildAudioStoryboardRows</code><code>selectProductItemsForRow</code><code>subjectAssetRefsForPlanning</code><code>subjectBriefForEndpoint</code><code>endpointAssetRef</code><code>buildEndpointFramePrompt</code><code>buildStoryboardSceneFromAudioRow</code><code>generateEndpointFrameForRow</code><code>saveRowStoryboardDraft</code><code>saveAllStoryboardDrafts</code><code>EndpointFrameSlot</code><code>StoryboardVideoSlots</code> in <code>web/components/ad-recreation-board.tsx</code>;产品图、首尾帧和视频候选缩略图统一复用 <code>MediaAssetTile</code>,包括顶层 hover 放大和删除入口。产品白底图上传复用 <code>uploadStoryboardAsset</code>,视角自动识别调用 <code>analyzeProductViews</code>,缺角度自动补图调用 <code>generateProductAngleAsset</code>。当前单条/批量按钮只保存规划;首尾帧按钮调用 <code>generateSceneAsset</code>,传 <code>subject_brief</code> 和端点选择后的 1-2 张 <code>product_images</code>,不再传主体图或 contact sheet再用 <code>PUT /frames/{idx}/storyboard</code> 保存 asset 首尾帧引用;首尾帧删除只移除本条规划中的引用,避免继续误用旧资产。<code>web/app/page.tsx</code> 的视频提交回调有暂停保护,旧入口误触也不会请求 <code>/storyboard/video</code></span></div>
<div><strong>主要源码</strong><span><code>AudioStoryboardPlanPanel</code><code>ProductReferenceCard</code><code>MissingProductViewSlot</code><code>buildAudioStoryboardRows</code><code>selectProductItemsForRow</code><code>subjectAssetRefsForPlanning</code><code>subjectBriefForEndpoint</code><code>endpointAssetRef</code><code>buildEndpointFramePrompt</code><code>buildStoryboardSceneFromAudioRow</code><code>generateEndpointFrameForRow</code><code>saveRowStoryboardDraft</code><code>saveAllStoryboardDrafts</code><code>EndpointFrameSlot</code><code>StoryboardVideoSlots</code> in <code>web/components/ad-recreation-board.tsx</code>;产品图、首尾帧和视频候选缩略图统一复用 <code>MediaAssetTile</code>,包括顶层 hover 放大和删除入口。产品白底图上传复用 <code>uploadStoryboardAsset</code>,视角自动识别调用 <code>analyzeProductViews</code>,缺角度自动补图调用 <code>generateProductAngleAsset</code>。当前单条/批量按钮只保存规划;首尾帧按钮调用 <code>generateSceneAsset</code>,传 <code>subject_brief</code> 和端点选择后的 1-2 张 <code>product_images</code>,不再传主体图或 contact sheet再用 <code>PUT /frames/{idx}/storyboard</code> 保存 asset 首尾帧引用;首尾帧删除只移除本条规划中的引用,避免继续误用旧资产。语言策略由 <code>AudioStoryboardRow</code> 的英文主字段 + <code>*Zh</code> 镜像字段承载:<code>role</code> 内部是 <code>hook/pain/proof/solution/cta/bridge</code><code>buildEndpointFramePrompt</code><code>StoryboardScene</code> 主值默认英文,中文只用于团队阅读;首尾帧提交前前端 <code>translateText</code> 兜底,后端 <code>_ensure_english</code> 再兜底。<code>web/app/page.tsx</code> 的视频提交回调有暂停保护,旧入口误触也不会请求 <code>/storyboard/video</code></span></div>
<div><strong>适合怎么描述</strong><span>“按音频逐句生成产品分镜、每行怎样改写口播、哪几句不需要产品或人物、首帧/尾帧该怎么停、首尾帧是否已经生成并准确、产品素材池识别/补图后的备注是否准确、哪些分镜后续才值得进入单条视频候选”。</span></div>
</div>
<div class="flow-row">
@@ -737,17 +737,19 @@ api/main.py
cutout_id,
subject_kind: object | living,
subject_assets: SubjectAsset[],
subject_consensus_brief
subject_consensus_brief,
subject_consensus_brief_zh
}</pre>
</div>
<div class="card">
<h3>AudioScript</h3>
<p>第一步音频解析的结构化产物。<code>pipeline_transcribe</code> 提取 <code>audio.wav</code> 后先保存原始转写、中文翻译、讲话人画像、口播节奏和背景音乐/环境声/音效分析。<code>rewritten_text</code><code>voice_url</code> 等字段仍保留给后续新配音阶段,当前第一步不默认写入</p>
<p>第一步音频解析的结构化产物。<code>pipeline_transcribe</code> 提取 <code>audio.wav</code> 后先保存原始英文转写、中文翻译、讲话人画像、口播节奏和背景音乐/环境声/音效分析。<code>rewritten_text</code> 是英文新口播,<code>rewritten_text_zh</code> 只作为团队审稿镜像;<code>voice_url</code> 等字段仍保留给后续新配音阶段。</p>
<pre>AudioScript {
status: idle | rewriting | completed | failed,
source_text,
source_zh,
rewritten_text,
rewritten_text_zh,
speaker_profile,
rhythm_profile,
background_audio_profile,
@@ -777,10 +779,11 @@ SubjectAsset {
width, height, size,
source_frame_indices[]
}</pre>
<p><code>SubjectTemplateItem</code> 保存用户确认过的主体视图包。<code>prompt_brief</code> 是后端从模板图反推的文字特征,后续相似生成优先读取它,而不是再次把模板图作为强参考图传给 image-edit。</p>
<p><code>SubjectTemplateItem</code> 保存用户确认过的主体视图包。<code>prompt_brief</code> 是后端从模板图反推的英文文字特征,后续相似生成优先读取它,而不是再次把模板图作为强参考图传给 image-edit<code>prompt_brief_zh</code> 仅用于模板库卡片和团队阅读</p>
<pre>SubjectTemplateItem {
id, name, description, note,
prompt_brief,
prompt_brief_zh,
subject_style: transparent_human | source_actor,
primary_image,
images: SubjectTemplateImage[]
@@ -907,7 +910,7 @@ ProductRefStateItem {
<tr><td>删除输入视频</td><td><code>DELETE /jobs/{id}</code></td><td><code>deleteJob</code></td><td>从任务队列、URL 和磁盘 <code>jobs/&lt;id&gt;</code> 目录移除整个 job包括源视频、关键帧、元素提取图和生成视频。</td></tr>
<tr><td>解析视频</td><td><code>POST /jobs/{id}/analyze?frames=&amp;target=&amp;mode=&amp;quality=</code></td><td><code>analyzeJob</code></td><td>抽参考帧能力。当前开始流程会在视频下载完成后自动调用一次,默认 <code>frames=12</code><code>target=motion</code><code>quality=accurate</code><code>mode=replace</code>,形成全局动作/节奏参考帧池;原版视频旁的“抽参考 12 帧”也会用同一参数显式重跑。<code>target</code> 仍支持透明骨架人、综合、清晰主体、转场变化、表情瞬间、动作峰值。</td></tr>
<tr><td>音频文案轨</td><td><code>POST /jobs/{id}/transcribe</code></td><td><code>triggerTranscribe</code></td><td>若尚未拆轨,先从 <code>source.mp4</code> 提取 <code>audio.wav</code> 并回填 <code>source_audio_url</code>;随后用 ASR 提取原始文案,翻译成中文,写入 <code>audio_script.source_text</code><code>source_zh</code> 和逐句 <code>transcript</code>。远端 <code>ASR_MODEL</code> 失败后先走本机 <code>LOCAL_ASR_BIN</code>/<code>LOCAL_ASR_MODEL</code>(默认 <code>mlx_whisper</code>),再尝试 <code>ASR_FALLBACK_MODEL</code>。后端会拒绝重复文本、逐秒假字幕或覆盖率过低的结果,不再把不可听的多模态输出写进时间轴。中文翻译由 <code>TRANSLATE_MODEL</code> 按 ASR 段落补齐,失败时保留原文时间轴且中文可为空。再用 <code>ASR_FALLBACK_MODEL</code> 读取 <code>audio.wav</code> 和已有转写时间轴,多模态音频分析讲话人、语速节奏、停顿、背景音乐/环境声/音效,写入 <code>speaker_profile</code><code>rhythm_profile</code><code>background_audio_profile</code>;若模型分析失败,则用转写段落、时长和语速做本地估算兜底。当前第一步不默认生成 SKG 新口播和 Azure OpenAI 配音。</td></tr>
<tr><td>分镜脚本改写</td><td><code>POST /jobs/{id}/script/rewrite</code></td><td><code>rewriteStoryboardScript</code></td><td>根据原参考文案、当前新口播、分镜角色、时间段和作者想法改写文口播。<code>mode=segment</code> 只改一段;<code>mode=all</code> 一次改完整片,要求整片前后连贯。后端按 <code>AUDIO_REWRITE_MODEL</code><code>ASR_FALLBACK_MODEL</code><code>TRANSLATE_MODEL</code> 依次尝试,全部失败时用本地模板保留可编辑文案。接口返回 <code>items[index,text]</code>前端暂存在当前页面状态里,点击保存规划后写入 <code>StoryboardScene.action</code></td></tr>
<tr><td>分镜脚本改写</td><td><code>POST /jobs/{id}/script/rewrite</code></td><td><code>rewriteStoryboardScript</code></td><td>根据原英文参考文案、当前英文新口播、英文 role enum、时间段和作者想法改写文口播;作者想法若含中文,后端会先经 <code>_ensure_english</code> 兜底翻译<code>mode=segment</code> 只改一段;<code>mode=all</code> 一次改完整片,要求整片前后连贯。后端按 <code>AUDIO_REWRITE_MODEL</code><code>ASR_FALLBACK_MODEL</code><code>TRANSLATE_MODEL</code> 依次尝试,全部失败时用英文本地模板保留可编辑文案。接口返回 <code>items[index,text,text_zh]</code>其中 <code>text</code> 是写入模型链路的英文主值,<code>text_zh</code> 只供团队审稿镜像显示;点击保存规划后写入 <code>StoryboardScene.action</code></td></tr>
<tr><td>原始音频文件</td><td><code>GET /jobs/{id}/audio.wav</code></td><td><code>sourceAudioUrl</code></td><td>返回拆轨得到的 wav当前主界面不再渲染底部吸附音频条右侧复刻工作表会读取该文件生成参考图式横向响度波形并和原视频、逐句时间轴联动波形标题栏显示当前播放秒数、总时长和鼠标指针停点秒数。</td></tr>
<tr><td>改写配音文件</td><td><code>GET /jobs/{id}/audio-script.mp3</code></td><td><code>apiAssetUrl(job.audio_script.voice_url)</code></td><td>后续新配音阶段保留的 TTS 产物;服务端固定走 <code>VOICE_PROVIDER=azure_openai</code>,通过 <code>AZURE_OPENAI_BASE_URL</code> 的 OpenAI 协议生成 mp3并按 <code>AZURE_TTS_PATHS</code> 依次尝试 <code>/audio/speech</code><code>/v1/audio/speech</code> 等路径。当前第一步不默认生成该文件。</td></tr>
<tr><td>手动加帧</td><td><code>POST /jobs/{id}/frames?t=</code></td><td><code>addManualFrame</code></td><td>按视频时间戳抽一帧index 递增但 frames 按 timestamp 排序。当前主界面会把原版视频播放器的播放秒数传给 <code>AudioIntakePanel</code> 标题栏右侧的“当前点抽帧”。</td></tr>
@@ -1035,6 +1038,19 @@ ProductRefStateItem {
<h2>变更记录</h2>
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
<div class="changelog">
<article class="change">
<header>
<h3>2026-05-18 · 模型 prompt 语言策略切到英文主值</h3>
<span class="tag cyan">Prompt</span>
<span class="tag violet">UI</span>
<span class="tag blue">API</span>
</header>
<div class="body">
<p><strong>问题:</strong>最终产物是英文 TikTok 二创广告,但前端默认分镜规划、首尾帧 prompt 和用户可编辑规划字段里混入中文,导致 <code>gpt-image-2</code>、脚本改写和后续视频模型收到中英混杂指令。</p>
<p><strong>改动:</strong><code>AudioStoryboardRow.role</code> 改为 <code>hook/pain/proof/solution/cta/bridge</code> 英文枚举UI 仍显示中文角色标签。<code>buildAudioStoryboardRows</code><code>buildVisualPlan</code><code>buildFirstFramePlan</code><code>buildLastFramePlan</code><code>buildSubjectDescription</code><code>buildEndpointFramePrompt</code><code>buildStoryboardSceneFromAudioRow</code> 的模型主字段改为英文,并新增 <code>*Zh</code> 镜像用于团队阅读。首尾帧提交前前端会对含中文 prompt 调 <code>translateText</code> 兜底,后端新增 <code>_ensure_english</code> 并挂到 <code>generate_scene_asset</code><code>generate_subject_assets</code>、脚本改写和音频分析入口。</p>
<p><strong>影响:</strong>发给 LLM / 生图 / 视频模型的主 prompt 默认全英文中文只作为团队审稿镜像、UI 标签和 toast。<code>AudioScript</code> 新增 <code>rewritten_text_zh</code><code>KeyElement</code> 新增 <code>subject_consensus_brief_zh</code><code>SubjectTemplateItem</code> 新增 <code>prompt_brief_zh</code><code>POST /jobs/{id}/script/rewrite</code> 返回 <code>text</code> 英文主值和 <code>text_zh</code> 中文镜像。</p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-18 · 首尾帧改为主体 brief + 产品少量硬参考</h3>