fix: 预览视频标题渲染全链路修复 — custom_title注入+ASR路径标题支持 #1399
Reference in New Issue
Block a user
Delete Branch "fix/preview-title-render"
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?
问题
用户在 Step4 选了标题后,生成的预览视频里没有标题文字。全链路排查发现 3 个断点。
根因分析
断点1 (P0) —
generate_video()未传递custom_titletask_info["custom_title"]存在但调用_render_video()时没传过去。断点2 (P0) —
_render_video()无 custom_title 参数没有参数接收 custom_title,内部只从模板默认配置注入标题,用户自定义标题从未被注入到
plan.config["title"]。断点3 (P1) — ASR 路径完全跳过标题
generate_ass_from_timeline()没有标题参数,有配音时标题也不渲染。次要问题 — 字段名不匹配
前端发
font_size/font_color,后端build_ass_content读size/color。修复
generation.py_render_video()增加custom_title参数,JSON解析+字段归一化(font_size→size,font_color→color)后注入virtual_plan.config["title"];generate_video()调用处传递task_info.get("custom_title", "")subtitle_generator.pygenerate_ass_from_timeline()增加title_text/title_config/video_duration参数,ASR字幕与标题共存于同一ASS文件unified_render_service.py_maybe_generate_ass()ASR路径传递title_text/title_config/video_duration新增测试
test_preview_title_render.py— 9个测试覆盖3个断点验收标准
c89cd02726to1629a2e3a81629a2e3a8toc8789670e9🚀 预览环境已部署
代码审查结果 - PR #1399
⚠️ 问题(3个需要修改)
user_title_cfg.get("text", "").strip()假设text字段一定是字符串。如果 JSON 中传入"text": null或"text": 123,调用.strip()会抛出AttributeError,导致 Worker 任务崩溃。t_stroke = title_cfg.get("stroke", {}) or {}仅处理了 None/False 的情况。如果stroke传入的是非空字符串(如"yes")或其他非字典对象,后续t_stroke.get(...)会抛出AttributeError。int(title_cfg.get("size", 36))和后续的float(...)转换未做保护。如果 JSON 中传入"size": null或"size": "invalid",会导致TypeError或ValueError致使渲染失败。💡 建议(2个可选)
title_cfg(即引用的title_config字典),这种副作用可能导致调用方(unified_render_service.py)持有的配置数据被意外更改。建议使用copy.deepcopy或创建新字典。title_text的空值保护。str,但若调用方传入None,title_text.strip()会报错。建议改为(title_text or "").strip()以增强鲁棒性。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-08-16 16:35:40 | 模型:
🗑️ 预览环境已清理
PR #1399 已关闭或合并,对应的预览环境已被清理。