478 lines
6.4 KiB
Plaintext
478 lines
6.4 KiB
Plaintext
|
|
# D144 · 商用短剧字幕生产工具链
|
|||
|
|
|
|||
|
|
> HLDP://video-ai-system/plans/D144-SUBTITLE-PRODUCTION-TOOLCHAIN
|
|||
|
|
> 类型: 字幕工具开发规格 · 对标样片标准
|
|||
|
|
> 日期: 2026-06-24
|
|||
|
|
> 铸渊 ICE-GL-ZY001
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 纠偏
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
当前 subtitle-renderer.py 是工程测试工具,不是商用字幕工具。
|
|||
|
|
用 Pillow 画 PNG 再 overlay,只能验证“能烧字幕”,不能保证样片级字幕观感。
|
|||
|
|
继续手调字号/位置是在凑合。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
正确路线:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
以样片字幕为标准 → 建立字幕规范 → 开发专业渲染工具链 → 每条视频自动质检。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 样片字幕标准 · 目标
|
|||
|
|
|
|||
|
|
用户提供样片字幕特征:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
白色主体字
|
|||
|
|
黑色描边清楚
|
|||
|
|
无黑色字幕底板
|
|||
|
|
无明显投影
|
|||
|
|
字体厚实,不飘,不发灰
|
|||
|
|
字号中等,不抢画面
|
|||
|
|
位置在视频画面内部底部
|
|||
|
|
不贴边
|
|||
|
|
不遮挡人物脸、胸口主体表演
|
|||
|
|
居中
|
|||
|
|
最多两行
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
我们要做的是:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
做出同一套字幕标准。
|
|||
|
|
不是“接近”,而是按样片规范复刻。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 必须开发的软件/工具
|
|||
|
|
|
|||
|
|
### 1. reference-subtitle-analyzer.py
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/tools/reference-subtitle-analyzer.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
用途:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
从样片截图/抽帧中测量字幕标准。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
sample_frame.jpg
|
|||
|
|
可选: 手动标注字幕框 bbox
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video_frame_width
|
|||
|
|
video_frame_height
|
|||
|
|
subtitle_bbox
|
|||
|
|
subtitle_center_x
|
|||
|
|
subtitle_baseline_y
|
|||
|
|
bottom_margin_px
|
|||
|
|
font_height_px
|
|||
|
|
font_height_ratio
|
|||
|
|
stroke_width_px
|
|||
|
|
stroke_ratio
|
|||
|
|
subtitle_width_ratio
|
|||
|
|
line_count
|
|||
|
|
style_report.hdlp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验收:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
能把样片字幕量化成参数,而不是靠肉眼猜。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. subtitle-style.json
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/config/subtitle-style.reference-drama.json
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
内容:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
style_id
|
|||
|
|
font_family
|
|||
|
|
font_size_ratio
|
|||
|
|
font_weight
|
|||
|
|
font_color
|
|||
|
|
stroke_color
|
|||
|
|
stroke_width_ratio
|
|||
|
|
shadow
|
|||
|
|
background
|
|||
|
|
alignment
|
|||
|
|
bottom_margin_ratio
|
|||
|
|
max_width_ratio
|
|||
|
|
max_lines
|
|||
|
|
line_spacing
|
|||
|
|
safe_area
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验收:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
任何视频分辨率都能按比例得到同一字幕观感。
|
|||
|
|
横屏/竖屏不能共用死字号。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. ass-subtitle-renderer.py
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/engines/ass-subtitle-renderer.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
为什么要开发:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
商用字幕不应该靠Pillow临时画PNG。
|
|||
|
|
应该生成ASS字幕,让libass/FFmpeg按字幕标准渲染。
|
|||
|
|
ASS天然支持字体、粗体、描边、边距、对齐、换行、位置。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
srt_path
|
|||
|
|
style_json
|
|||
|
|
video_path
|
|||
|
|
output_path
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
styled.ass
|
|||
|
|
burned_video.mp4
|
|||
|
|
render_report.hdlp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
推荐实现:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
SRT → ASS
|
|||
|
|
ASS Style:
|
|||
|
|
Fontname
|
|||
|
|
Fontsize
|
|||
|
|
PrimaryColour
|
|||
|
|
OutlineColour
|
|||
|
|
Bold
|
|||
|
|
Outline
|
|||
|
|
Shadow=0
|
|||
|
|
Alignment=2
|
|||
|
|
MarginL/MarginR/MarginV
|
|||
|
|
FFmpeg subtitles/ass filter 或 libass 渲染
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
注意:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
如果当前FFmpeg没有 subtitles/ass filter,则工具必须检测并报错。
|
|||
|
|
不要静默降级到Pillow。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验收:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
同一句字幕在样片截图上视觉接近样片标准。
|
|||
|
|
字体不虚、不灰、不飘。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 4. subtitle-font-manager.py
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/tools/subtitle-font-manager.py
|
|||
|
|
video-ai-system/assets/fonts/subtitle/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
用途:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
管理字幕字体。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
原因:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
系统字体不稳定。
|
|||
|
|
不同机器字体不同,字幕观感会变。
|
|||
|
|
必须固定项目字幕字体。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
任务:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
列出本机中文字体
|
|||
|
|
测试字体是否支持中文
|
|||
|
|
生成字体预览图
|
|||
|
|
选择/复制批准字体到 assets/fonts/subtitle/
|
|||
|
|
记录字体许可证/来源
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
候选方向:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
思源黑体 Heavy/Bold
|
|||
|
|
阿里巴巴普惠体 Bold
|
|||
|
|
可商用中文黑体
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验收:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
字幕使用项目字体,不再依赖系统默认字体。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 5. subtitle-safe-area-qc.py
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/tools/subtitle-safe-area-qc.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
用途:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
检查字幕位置是否遮挡人物或关键画面。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video_path
|
|||
|
|
subtitle_ass_or_srt
|
|||
|
|
sample_frames
|
|||
|
|
可选: 人物bbox/手动主体区域
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
subtitle_bbox_per_frame
|
|||
|
|
bottom_margin
|
|||
|
|
overlap_with_character_bbox
|
|||
|
|
overlap_with_key_prop_bbox
|
|||
|
|
readability_score
|
|||
|
|
qc_report.hdlp
|
|||
|
|
contact_sheet.jpg
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
最小实现:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
先用抽帧 + 人工标注主体bbox。
|
|||
|
|
后续再接自动人物检测。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
硬失败:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
遮脸
|
|||
|
|
遮主要台词人物胸口表演
|
|||
|
|
遮关键道具文字
|
|||
|
|
贴到底边
|
|||
|
|
超出安全区
|
|||
|
|
背景太亮导致看不清
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 6. subtitle-preview-contact-sheet.py
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/tools/subtitle-preview-contact-sheet.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
用途:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
每次烧字幕后自动抽关键帧,让人一眼判断字幕是不是跳戏。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
contact_sheet.jpg
|
|||
|
|
frame_0001.jpg
|
|||
|
|
frame_0002.jpg
|
|||
|
|
frame_0003.jpg
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验收:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
不再只打开视频靠用户暂停截图。
|
|||
|
|
系统自己产出检查图。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 7. subtitle-style-ab-test.py
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/tools/subtitle-style-ab-test.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
用途:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
同一底片一次生成多种字幕版本,横向对比。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video_path
|
|||
|
|
srt_path
|
|||
|
|
style_json_list
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
版本A/B/C视频
|
|||
|
|
对比contact sheet
|
|||
|
|
评分表
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验收:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
字幕风格不要再一版一版盲调。
|
|||
|
|
一次对比,选最像样片的。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 8. script-to-srt-with-timing.py
|
|||
|
|
|
|||
|
|
路径建议:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
video-ai-system/tools/script-to-srt-with-timing.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
用途:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
从剧本原文和角色对白音频生成正式SRT。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
script line
|
|||
|
|
voice audio
|
|||
|
|
shot duration
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
line.srt
|
|||
|
|
timing_report.hdlp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验收:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
字幕时间跟角色说话同步,不靠手写测试时间。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 当前工具的处理
|
|||
|
|
|
|||
|
|
### subtitle-renderer.py
|
|||
|
|
|
|||
|
|
定位调整为:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
工程测试工具。
|
|||
|
|
可用于快速验证。
|
|||
|
|
不能作为最终商用字幕渲染器。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
必须追加警告:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
如用于最终样片,需经过 subtitle-safe-area-qc。
|
|||
|
|
推荐最终走 ass-subtitle-renderer.py。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 腾讯AI人格体开发顺序
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. subtitle-font-manager.py
|
|||
|
|
2. reference-subtitle-analyzer.py
|
|||
|
|
3. subtitle-style.reference-drama.json
|
|||
|
|
4. ass-subtitle-renderer.py
|
|||
|
|
5. subtitle-preview-contact-sheet.py
|
|||
|
|
6. subtitle-style-ab-test.py
|
|||
|
|
7. subtitle-safe-area-qc.py
|
|||
|
|
8. script-to-srt-with-timing.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
每完成一个工具必须提交:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
README
|
|||
|
|
命令示例
|
|||
|
|
测试输入
|
|||
|
|
测试输出
|
|||
|
|
失败边界
|
|||
|
|
是否已推送仓库
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 验收口径
|
|||
|
|
|
|||
|
|
一个字幕工具链算完成,必须满足:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
拿用户提供的样片截图,能量化字幕参数。
|
|||
|
|
拿我们的测试视频,能生成同标准字幕。
|
|||
|
|
输出前自动抽帧。
|
|||
|
|
不遮挡主体。
|
|||
|
|
不发灰、不发虚、不跳戏。
|
|||
|
|
能固定字体。
|
|||
|
|
能在不同分辨率按比例保持观感。
|
|||
|
|
```
|
|||
|
|
|