feat: CCA 唱词助手子项目 v3 — 脚本版流水线完成

新增 cca/ 子项目:编导A稿+人声音频 → ASR+AI校对+AI折行 → 5段SRT字幕。
- 讯飞录音文件转写标准版(热词注入)
- DeepSeek AI校对(严格纪律:只改错别字/术语/填充词,不润色)
- DeepSeek AI折行(语义断句,≤14字/行)
- 节目结构自动切分(导视/正片×3/预告)
- 绝对时间戳SRT输出(大洋系统兼容)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
simonkoson
2026-07-04 15:25:08 +08:00
parent 1ccb37f0c7
commit ede30d3043
21 changed files with 5530 additions and 1 deletions
+147
View File
@@ -0,0 +1,147 @@
# 项目协作主控文件 (cca/CLAUDE.md)
---
## 🔖 状态栏 (STATUS — 每次结束 session 前必须更新这三行)
- **最后更新**Claude Code(动手开发)| 2026-07-04
- **当前状态一句话**:脚本版流水线 v3 完成(绝对时间戳+严格校对不润色),等制片人周一大洋系统验证 SRT 导入效果。
- **下一个动手的人从这里开始**:读完本文件,运行 `python cca_pipeline.py --help` 了解用法。凭证需填入 `cca/.env`XFYUN + DEEPSEEK)。可选下一步:用 `--audio` 跑真实 ASR(带热词注入)看是否比缓存版效果更好。
---
## 🤖 给 AI 的工作约定 (READ FIRST)
- 开始任何工作前,先读完本文件,特别是「状态栏」「交接备注」「关键决策」三节。
- 完成一段工作后**增量更新**:「已完成」追加一条、「待办」勾掉或新增、必要时更新「关键决策」,最后改「状态栏」三行。不要重写整份文件,不要删历史,只追加/勾选。
- 涉及发送、发布、删除、改权限、付款等不可逆操作前,先在对话里跟制片人确认。
- **本项目着急用**——优先出可用版本,不追求完美架构。先跑通再优化。
- **沟通**:全程简体中文;制片人不懂代码,解释说人话;给明确推荐不反复抛选项。
---
## 1. 项目概览
- **项目名**CCA 唱词助手(ChangCi Assist)— 《军事科技》栏目编导/责编用的唱词字幕生成工具
- **目标**:把编导 A 稿 + 粗编人声音频 → 经过 ASR + AI 校对 + 编导审稿 → 最终输出符合大洋系统的 SRT 字幕文件
- **使用角色**:编导(提供 A 稿+音频、审稿确认)、责编(拿 SRT 拉到大洋上线)
- **部署计划**:先独立部署在 lanhao 配音 2.0 网站测试,成熟后吸收进 TPS 主项目作为子功能
### 核心工作流
```
编导A稿 ──→ AI提取专有名词词典
粗编人声音频 + 词典 ──→ 讯飞ASR(录音文件转写标准版) ──→ 带时间戳ASR稿
ASR稿 ⊕ A稿 比对
┌─ AI自动修正(明显错别字)
└─ 编导审稿台(拿不准的差异)
B稿(定稿)
按拍词规则折行 + 时间戳
SRT文件(大洋格式)
```
---
## 2. 技术栈与运行方式
- **语言**Python(与主项目 backend 对齐)
- **前端**:Web 界面(编导审稿台需要双屏对比 UI),技术选型待定(可复用主项目 React 或轻量方案)
- **ASR**:讯飞开放平台 录音文件转写标准版(已有 API Key,与 doco 共用同一套讯飞凭证)
- **AI**:LLM 用于两处——① 从 A 稿提取专有名词词典;② ASR 稿校对(的地得、引号、错别字)
- **输出格式**:SRT(大洋系统兼容格式,有样本参照)
- **美术风格**:参考 `ai-labeling/example/`(功能区划.jpg、幅面参考.jpg、页面风格.webp),与 TPS 主项目 UI 风格对齐
- **凭证**:子项目自己 `.env`,不动主项目 `backend/.env`
---
## 3. 当前进度
- **已完成至**:脚本版流水线 v3 跑通——绝对时间戳 + 严格校对(只改错别字/术语/填充词,不润色不调序)+ AI折行 + 5段SRT。
- **正在做**:无,等制片人周一在大洋系统验证 SRT 导入效果。
- **卡点/待解**:无硬卡点。可选优化:用 `--audio` 跑真实 ASR(热词注入生效)看是否在转写层就避免"建制→舰只"类错误。
---
## 4. 已完成(只追加,最新在上)
- [2026-07-04] **脚本版流水线 v3(绝对时间戳+严格校对)**:① 恢复绝对时间戳(方便在大洋时间线对位);② 重写校对 Prompt——铁律:只改错别字/同音字、术语格式、口语填充词,绝不润色/调序/替换实词;③ 校对效果:60 处修正(vs v2 的 100 处,去掉了过度修改)。输出目录 `output_v3/`
- [2026-07-04] **脚本版流水线 v2 真实测试通过**:① 热词提取(规则+AI,127个术语)→ ② 讯飞ASR(94秒完成25MB音频,357句)→ ③ AI校对(DeepSeek,修正同音字/术语格式/口语填充,"建制"→"舰只"等)→ ④ AI折行(语义断句,98%行≤14字)→ ⑤ 5段SRT输出(段内相对时间戳,从00:00:00开始)。新增:hotword_extractor.py(热词提取)、ai_proofreader.pyAI校对)、ai_line_breaker.pyAI折行)。
- [2026-07-04] 脚本版流水线骨架完成:① asr_client.py(讯飞ASR适配,从doco复用);② line_breaker.py(折行引擎,≤14字/语义断句/空白行检测);③ srt_writer.py(大洋格式SRT输出);④ segment_splitter.py(节目结构切分:导视/正片×3/预告);⑤ cca_pipeline.py(主入口串联全流程)。本地测试全部通过。
- [2026-07-04] 子项目立项:目录结构、CLAUDE.md、Brief、主项目寄存条建立。
---
## 5. 待办(按优先级)
- [x] ~~PRD / 业务规则确认~~ → 已在对话中完成(2026-07-04
- [x] ~~脚本版流水线~~ → v3 完成(绝对时间戳+严格校对),等大洋验证
- [x] ~~AI 校对层~~ → 已实现(两层防线:热词注入+DeepSeek 严格校对)
- [ ] **大洋系统验证**:周一导入 SRT 测试兼容性
- [ ] **热词注入真实 ASR 测试**:用 `--audio` 跑完整流水线(非缓存),验证热词在转写层的效果
- [ ] **编导审稿台**:双屏对比 UI、差异高亮、编导确认/手改交互(第二步)
- [ ] **部署至 lanhao 配音 2.0**:先跑起来测试
---
## 6. 关键决策(跨 session 最易丢)
- [2026-07-04] **ASR 稿是权威底稿**:最终 SRT 必须和音频对应,ASR 稿(时间戳+内容)是基准。A 稿只提供专有名词写法和上下文参考,不能用 A 稿覆盖 ASR 的内容结构。
- [2026-07-04] **讯飞用录音文件转写标准版**(与 doco 一样,不要大模型版)。热词偏置注入专有名词词典。
- [2026-07-04] **编导审稿台是必要环节**:AI 拿不准的差异必须过编导确认,不能全自动。尊重编导创作主权(继承主项目设计哲学)。
- [2026-07-04] **先独立部署再吸收**:先在 lanhao 配音 2.0 上跑通测试,成熟后并入 TPS 主项目。不等主项目进度。
- [2026-07-04] **SRT 格式有样本**data/ 下 3 个 SRT 是人工拍词导出的真实样本,作为格式参照。
- [2026-07-04] **折行(拍词)规则**
- A. 每行 ≤ 14 字
- B. ASR 中 >2 秒空白 → 插入空白行(屏幕清字幕)
- C. 按语义断句(不机械凑满 14 字),符合阅读习惯
- D. 去掉逗号/句号/感叹号等标点,只保留引号
- [2026-07-04] **输出结构(5 个 SRT**
- 导视 1 个 + 正片 3 个 + 下期预告 1 个
- 正片 3 个拆分依据:按时长大致均分,优先在角色转换处(解说词→专家采访)切分
- 5 个 SRT 时间戳连续拼接 = 音频总长
- [2026-07-04] **节目结构标志词**
- 导视结束标志:听到"本期《军事科技》……"
- 正片开始标志:听到"各位观众你们好,我是主持人蓝皓"
- 正片结束标志:听到"好了观众朋友们,感谢您关注国防军事频道军事科技……"
- 正片之后是下期预告(无固定话术)
- [2026-07-04] **正片拆 3 个 SRT 的原因**:大洋字幕系统不稳定容易出错,责编提的需求。
- [2026-07-04] **音频是纯人声**:已分离好的干净音频(无 BGM/音效),无需人声分离。
- [2026-07-04] **先出脚本版**:命令行跑通流水线,审稿台第二步做。
- [2026-07-04] **讯飞代码从 doco 复用**`doco/src/doco/asr_adapter.py` 有完整签名/上传/轮询/解析逻辑,直接适配。
- [2026-07-04] **SRT 用绝对时间戳**:每段 SRT 的时间戳是音频中的真实位置(不从 00:00:00 开始),方便在大洋时间线直接对位。制片人实测确认比相对时间戳好用。
- [2026-07-04] **AI 校对严格纪律**:只允许改三类——① 错别字/同音字 ② 术语格式(F-15J)③ 口语填充词删除。绝不润色、绝不调序、绝不替换实词。ASR 是已录音频的转写,改不了内容。
- [2026-07-04] **两层 ASR 纠错防线**:第一层=热词注入(预防,让讯飞在转写时就认对专有名词);第二层=AI 校对(修正,用 A 稿上下文判断同音字)。两层互补。
- [2026-07-04] **LLM 选型已定**:校对+折行+热词提取统一用 DeepSeekdeepseek-chat),性价比最优。
---
## 7. ⏩ 交接备注
- **立项背景**:编导剪完节目后需要给责编一份 SRT 唱词字幕文件。传统流程是责编拿折行稿到大洋系统里 1:1 实时"拍词"(播放视频、听到对应句子拍空格记录时间戳),效率极低。CCA 用 ASR 自动化这个过程。
- **"拍词"术语解释**:折行稿(去标点、按规则断行的文稿)+ 时间戳对位 = 拍词。传统靠人工实时听拍,CCA 用 ASR 时间戳代替。
- **与 doco 的区别**doco 是"播出后"整理终版文稿(三方融合);CCA 是"剪辑后、播出前"生成唱词字幕(ASR→校对→SRT)。两者共用讯飞 ASR 能力,但流程目的完全不同。
- **数据样本**`data/` 下有 A 稿 docx + mp3 音频 + 3 个人工拍词 SRT(对应正片三段)。
- **代码文件**`src/` 下是核心流水线代码(asr_client / line_breaker / ai_line_breaker / ai_proofreader / srt_writer / segment_splitter / hotword_extractor),入口 `cca_pipeline.py`
- **凭证**:需在 `cca/.env` 中填写 `XFYUN_APP_ID``XFYUN_SECRET_KEY``DEEPSEEK_API_KEY`
- **输出目录**`output/`ASR 缓存 + v1 输出)、`output_v2/`(相对时间戳版)、`output_v3/`(绝对时间戳+严格校对,当前最优)。
- **运行命令示例**
- 从缓存跑(调试校对/折行):`python -X utf8 cca_pipeline.py --asr-cache output/asr_raw.json --script "data/重走战争老路的日本军备(A稿).docx" --output-dir output_v3`
- 完整流水线(含真实 ASR):`python -X utf8 cca_pipeline.py --audio "data/重走战争老路的日本军备A0.mp3" --script "data/重走战争老路的日本军备(A稿).docx" --output-dir output_v4`
- **时间压力**:这两天要出可用版本,功能不复杂但要快。
---
## 8. 待确认 / 开放问题
- [x] ~~拍词规则~~ → 已确认(见关键决策)
- [x] ~~大洋 SRT 样本文件~~ → data/ 下已有 3 个真实样本
- [x] ~~音频格式~~ → 纯人声 MP3,无需预处理
- [x] ~~LLM 选型~~ → DeepSeekdeepseek-chat),已验证效果好、价格低
- [ ] 前端审稿台技术选型(第二步再定)
- [ ] 大洋系统 SRT 导入兼容性(周一验证)