release v0.1.136: 智能剪辑批量变体P0修复+AI数字人MOV支持+代码审查重构 #1886
Reference in New Issue
Block a user
Delete Branch "release/v0.1.136"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
发布 v0.1.136(2026.09.14)
🐛 Bug修复(P0 批量变体严重问题)
♻️ 代码重构(不改变功能)
✅ Staging验证
1. smart-match 排序零随机修复(主因): - smart_select_assets 排序/多样性分桶注入 0~SCORE_RANDOM_NOISE_MAX 随机噪声, 同分/近分素材每次选出不同组合与顺序;分差>20的高质量素材保持稳定优先级 - 噪声以 asset.id 为 key 同次调用内一致;r.score 始终为无噪声原始分 - 支持 rng 注入(测试可复现);smart-match API/正式生成/模板编辑器三调用点全受益 2. 素材使用次数口径修复: - mark_asset_used_for_generation 新增 times 参数,按成片实际渲染片段引用次数累加 - worker 回写从 task.asset_ids(请求列表,含未被plan选用的素材)改为 统计最终成片 plan 的 edit_plan_clips(同素材多片段复用按片段数累加) - 抽 _count_plan_clip_asset_usage/_record_rendered_asset_usage 纯函数(可单测) - plan 无有效片段时兜底 task.asset_ids 单次计数;单素材失败不阻断其他 3. 测试:22 新测试(噪声 10 + 回写计数 12);旧确定性排序断言注入零噪声 rng; 修复 test_distribute_assets 预存在 flaky(shuffle 未被零噪声 patch 覆盖)根因:AuthenticatedUser 是 dataclass {user: User, session_id, token_type}, 没有 .id 属性,用户 ID 在 .user.id。 staging 上所有 lipsync 端点 500(GET/POST)、ai-avatar 端点同理。 修复 11 处:lipsync.py(6) + ai_avatar_render.py(5)。根因:AuthenticatedUser 是 dataclass {user: User, session_id, token_type}, 没有 .id 属性,用户 ID 在 .user.id。 staging 上所有 lipsync 端点 500(GET/POST)、ai-avatar 端点同理。 修复 11 处:lipsync.py(6) + ai_avatar_render.py(5)。1. 标题 / 分行: 对齐智能剪辑 FrontendPreviewPlayer 的 split(/[//]/) 逻辑,/ 和 / 都会分行 2. 封面签名URL: 私有桶 OSS upload 后必须 get_download_url 签名,否则前端无法加载 3. 渲染 b_roll_segments 结构: 前端 {asset: AssetItem} 转后端 {asset_url: string},对齐 BRollSegment schema 4. #1821 对口型加速工单已关闭(收益有限,MediaKit GPU 排队是主要瓶颈)1. B-roll时间戳全0修复: - sentences.ts 新增 sentenceTimings 参数优先使用后端精确时间戳, 降级才按字数比例估算 - 修正参数顺序,与 ModalBRollEditor 现有调用 (scriptText, timings, duration) 对齐 - 前端 AiAvatarPage 已通过 props 传 sentenceTimings(旧版已传但因顺序错位被忽略) 2. 标题粗体重影修复: - 之前 bold=true 时使用 borderw=3 + font_color 同色描边模拟粗体, 会在小字号/竖屏视频上造成字形边缘偏移,视觉上文字像被打印了两次 (用户截图中的'曝光曝光…'重影) - 改为黑色细描边(borderw=2, 黑色),既保留清晰加粗效果又不重影 - 用户显式开启 stroke 时仍按用户配置走 - 新增 _resolve_font_path(bold=True) 预留粗体字体查找能力(当前镜像 无独立 Bold 字体文件,沿用 VF 常规字重) 3. TTS 任务防卡死: - 给 tts_synthesize_and_submit 加 soft_time_limit=180s / time_limit=200s, 避免因网络/上游问题导致 Celery 任务永久挂起(用户之前卡10+分钟 tts_processing 不失败) - 任务开头加 INFO 日志(job_id/voice_id/text_len),方便排查 worker 是否真的收到任务 相关:staging 用户反馈 5 问题中的 1/2/3 项(B-roll时间、标题重影、对口型卡死)根因(用户截图文案:'卖花的叫花无缺,卖姜的叫姜子牙,卖菜的蔡文姬,那我修脚阔头的呢,应该叫什么呢'): 1. 分句正则没包含中文逗号「,」,整段被识别为1句;后端静音检测按TTS音频停顿 切出多句,前端校验 sentenceTimings.length===rawParts.length 条数不等 → 整个后端精确时间戳被丢弃走降级 2. 降级路径 outputDuration=0(对口型预览阶段最终视频未渲染)→ 所有句子时间估算为0 修复: - 前端 sentences.ts: a. 分句正则加上中英文逗号「,,」 b. sentenceTimings 校验放宽:只要是有效数组就直接用后端句子列表, 不再强制条数相等(后端按音频停顿的切法才是真实边界) - 后端 _split_script_into_sentences:正则同步加逗号,前后端一致 - 补单测验证逗号分隔文案分句- ai_avatar_cover_service: COVER_POLL_INTERVAL=2s × COVER_MAX_POLL_ATTEMPTS=30 (最长 60s),适配合成视频(叠加B-roll/标题)较大的下载+抽帧耗时 - ai_avatar_render_service: execute_render 完成后停留在 completed 状态不再自动入库成片库;新增 _persist_to_library(cover_url 可选覆盖) 与 finalize_job(job_id, user_id, cover_url?) 方法,供用户点「完成」时显式入库,幂等(通过 generation_task_id=render_job_id 判重) - 路由: 新增 POST /{job_id}/finalize 接口,含 404/400/幂等/异常分支 - Schema: 新增 FinalizeRenderResponse - 前端: - aiAvatar.ts 新增 finalizeRenderJob API - PanelCoverAndGenerate 拆分 variant=setup(主页面配置+生成按钮,不含封面区) 与 select-cover(弹窗内封面选择);新增 onClose/onCoverSelected props,智能/上传成功后回调通知父组件 - 新建 ModalCoverSelect 弹窗组件 - AiAvatarPage: render 完成后不再自动跳转/generated,而是停留在主页面显示封面预览+「🎬选择封面」「✅完成」按钮;弹窗内选封面、点「完成」才调 finalize 入库并跳转到成片库 - 单元测试: 更新原有 execute_render 自动入库测试为不入库断言,新增 finalize_job 入库/幂等/状态校验 3 个测试🚀 预览环境已部署
🗑️ 预览环境已清理
PR #1886 已关闭或合并,对应的预览环境已被清理。