P3-C3: 交叉复审 fusion_review.py + doco fuse 命令,产融合B稿743行+fusion_review留痕,更新CLAUDE.md交接C4

This commit is contained in:
simonkoson
2026-06-17 13:27:41 +08:00
parent 0a4ab881bc
commit 60f22e6660
3 changed files with 623 additions and 11 deletions
+20 -11
View File
@@ -17,7 +17,7 @@
## 🔖 状态栏 (STATUS — 每次结束 session 前必须更新这三行)
- **最后更新**:账号A 2026-06-17
- **当前状态一句话**P3-C2 讯飞 ASR 跑通并收口(真转写310句带时间戳,热词命中良好),本轮已 git 提交推 main9340edc);**B稿_v2.txt 已就位入库,C3 卡点解除,下一步可直接开 C3**
- **当前状态一句话**P3-C3 交叉复审完工(融合B稿743行+fusion_review 5条留痕落盘),产品文件已就位,下一步 C4 语义融合→融合A稿 docx
- **下一个动手的人从这里开始**:见下方「⏩ 交接备注」
---
@@ -62,26 +62,29 @@
- `src/doco/term_extract.py` — C1:规则层 + AI 层提取 + 词典累积 + 热词清洗
- `src/doco/asr_adapter.py` — C2 讯飞 ASR 适配层(已完工):`get_hot_words(episode_id)` 读热词表、`transcribe()` 返回 `(句子, raw)``write_asr_result()``asr_v2_timed.txt` + `asr_result_raw.json`
- `src/doco/video_split.py` — P1:含 `extract_audio()`16kHz/单声道/16bit WAV),C2 直接复用,不另写 ffmpeg
- `src/doco/cli.py` — 命令入口(split / terms / asr
- `src/doco/fusion_review.py` — C3:B稿v2 ⊕ ASR 交叉复审 → 融合B稿(743行) + fusion_review.csv
- `src/doco/cli.py` — 命令入口(split / terms / asr / fuse
- `doco/data/term_dict.json` — 累积词典(当前 110 条)
- `doco/programs/<episode_id>/` — 每期产物(热词表、各阶段输出)
- **常用命令**
- C1(已实现):`doco terms --episode-id <id> --a-script <path> [--no-ai]`
- C2(已实现):`doco asr --episode-id <id> --input-video <绝对路径mp4> --output-dir <绝对路径 doco/programs/<id>>``--skip-asr` 只分离不转写)。**务必传绝对 `--output-dir`,否则落到当前工作目录的 `programs/` 会与 doco 产物分家。**
- C3/C4:待实现
- C3(已实现):`doco fuse --episode-id <id> [--no-ai] [--batch-size 35]`
- C4:待实现
- **环境变量 / 密钥**:只放 `doco/.env`(已在 `.gitignore`)。需要的 key`DEEPSEEK_API_KEY` / `DEEPSEEK_BASE_URL` / `DEEPSEEK_MODEL``XFYUN_APP_ID` / `XFYUN_SECRET_KEY`。**代码与对话里只引用变量名,绝不出现真值。**
---
## 3. 当前进度(核心交接区,以最新快照为准)
- **正在做**C2 已收口并推 main,准备进 C3(B稿v2 ⊕ ASR 交叉复审)
- **卡点 / 待解**:无。C3 三路输入均已就位于 `doco/programs/ep001_20260612_fangkong_fandao/``B稿_v2.txt`743行,P2)、`asr_v2_timed.txt`310句,C2)、A稿 docx。
- **正在做**C3 已收口C4 待开工
- **卡点 / 待解**:无。
---
## 4. 已完成(只追加,最新在最上)
- [2026-06-17 |账号A] **P3-C3 收口**`fusion_review.py` 逐行复审 B稿v2 ⊕ ASR(22 批×35行=743行),产 `融合B稿.txt`(行数/时间戳零偏移)+ `fusion_review.csv`(5条真OCR纠错留痕)。关键机制:断点缓存 `.c3_cache/batch_N.json` 可复用;硬校验行数/时间戳/change_type枚举不过不写文件;后处理修正 `final_text==B原文` 被 LLM 误标为 `minor_edit` 的行(19→5)。`--no-ai` 全 unchanged 可验证管道。
- [2026-06-17 |账号A] **P3-C2 收口**:密钥外置三验收点全过(硬编码已删/读 .env/已 gitignore+ 旧 key 已轮换;`asr_adapter.py` 并入讯飞上传·轮询·解析,复用 P1 `extract_audio` 分离 16kHz/单声道/16bit WAV;新增 `doco asr` 命令读 C1 64条热词。**真转写《现代防空反导大对决》27分钟音频 → 310句带时间戳**,萨德×6/塔米尔/爱国者/箭二箭三/见证者等术语命中良好,raw json 730KB 落盘。(顺带修 `extract_audio` 在 Windows 的 `text=True` 解码崩溃。)
- [2026-06-16 |账号A] **P3-C1 收口**A稿→规则+DeepSeek AI 提取→累积词典110条→热词清洗→本期热词表64条;AI 44 候选已逐个回查 A 稿原文无幻觉,算术对账一致。
- [P2 |本轮之前] 本地 OCRDeepSeek-OCR/Ollama+ 扒词流水线,产出 **B稿_v2.txt 743 行**
@@ -91,8 +94,8 @@
## 5. 待办(按优先级,做完打勾)
- [ ] **C3(下一步,输入已齐)**B稿v2 ⊕ ASR 交叉复审 → 融合B稿(保持743行碎句粒度 + 密集时间戳原样,ASR只复审纠错不改行结构)+ `fusion_review.csv`
- [ ] **C4**:融合B稿 + A稿语义对齐 → 融合A稿(公文 docx,用 docx skillGB/T 9704 格式)。
- [x] **C3**:B稿v2 ⊕ ASR 交叉复审 → 融合B稿(743行时间戳零偏移) + fusion_review.csv(5条留痕)
- [ ] **C4**(下一步)**:融合B稿 + A稿语义对齐 → 融合A稿(公文 docx,GB/T 9704 格式)。按 A稿分段把融合B稿碎句归拢、套 docx 格式,C4 语义融合可开 thinking
- [x] **C2** 讯飞 ASR 适配层(密钥外置 + asr_adapter 并入 + `doco asr` 命令 + 真转写310句)
- [x] P3-C1 术语提取 + 词典 + 热词表
- [x] P2 本地 OCR + B稿v2
@@ -113,6 +116,9 @@
- [2026-06-15] **B稿v2 权威升级**:屏幕术语/型号/番号 **B稿v2 ≈ A稿 并列权威**(B稿是屏幕实打的字,更贴近播出)。口语/语序/语气信 ASR;书面结构/分段信 A稿;同音事实错(美以→美伊)用 A稿/B稿v2 覆盖 ASR。
- [设计期] **分层不变**:OCR 错字纠正、术语统一、时间戳对齐走**规则层**(确定性);段落归属、整段删除判定、编导笔误识别走 **AI 层**(需语义判断)。
- [设计期] **顺序约束**:术语提取(C1,产热词)必须在 ASR(C2)之前——已成立。
- [2026-06-17] **`fusion_review.csv` 定位 = 留痕档案(给爱德华/复核),不是编导读物。** 编导读的是 C4 docx。CSV 可读性不优化,只看 final_text 准不准。
- [2026-06-17] **`final_text==B原文` 强制归 `unchanged` 不进 review。** LLM 有时把"考虑后决定保留 B 稿原文"标成 `minor_edit`,但实际没改字。`fusion_review.py``_normalize_unchanged_when_no_edit()` 在写文件前修正(review 19→5)。
- [2026-06-17] **`change_type``minor_edit`/`editor_typo` 边界 LLM 把握不稳**(OCR 错字两类混标)。仅 metadata 标签不一致,`final_text` 全对,不影响融合B稿正文。本轮决定忽略;若 C4/爱德华按 `change_type` 做逻辑分流,届时在 prompt 里收紧两个枚举的边界定义。
- [工程纪律] 各阶段解耦、中间产物落缓存、可断点续跑、可单独重跑;长批处理放独立终端。
---
@@ -121,10 +127,13 @@
> 下次开工读完这段应能 0 摩擦续上。接手后可清空重写。
- **第一句话该干的**C2 已收口推 main,C3 三路输入已齐(`B稿_v2.txt` 743行 / `asr_v2_timed.txt` 310句 / A稿 docx,都在 `doco/programs/ep001_20260612_fangkong_fandao/`)。直接给 Cline 出 C3 的 ACT 指令开工
- **C3 目标**B稿v2 ⊕ asr_v2_timed 交叉复审 → 融合B稿(**保持 743 行碎句 + 密集时间戳原样,ASR 只复审纠错不改行结构**)+ `fusion_review.csv`。权威优先级见关键决策「B稿v2 权威升级」那条
- **重跑真转写命令**(复用已分离 WAV,27分钟音频讯飞轮询等几分钟别中断):
`doco asr --episode-id ep001_20260612_fangkong_fandao --input-video "E:\tps-dashboard\doco\programs\ep001_20260612_fangkong_fandao\现代防空反导大对决VA0.mp4" --output-dir "E:\tps-dashboard\doco\programs\ep001_20260612_fangkong_fandao"`
- **第一句话该干的**C3 已完成,产物就位(`融合B稿.txt` 743行 + `fusion_review.csv` 5条留痕,都在 `doco/programs/ep001_20260612_fangkong_fandao/`)。直接开 C4
- **C4 目标**融合B稿(743行碎句)+ A稿 docx 语义对齐 → **融合A稿 docx**(公文格式,GB/T 9704)。按 A稿分段(【导视】【主持人N】【解说N】【专家N】【隔断】)把融合B稿碎句归拢到对应段落,套 docx 模板格式输出。C4 语义融合可开 thinking(非抽取类任务,质量优先)。一致性约束:融合A稿由融合B稿生成,不是拿 A 稿改
- **C4 输入**(均就位):
- `programs/ep001_20260612_fangkong_fandao/融合B稿.txt`743行,`[XmYs] 文本`
- `programs/ep001_20260612_fangkong_fandao/现代防空反导大对决A稿.docx`A稿,python-docx 可读)
- `programs/ep001_20260612_fangkong_fandao/fusion_review.csv`5条改动留痕,可选参考)
- **C3 重跑命令**`doco fuse --episode-id ep001_20260612_fangkong_fandao``--no-ai` 全 unchanged 验证管道,缓存 `.c3_cache/` 复用无需重跑 AI
- 通哥连轴转了几轮,回复要紧凑。
- **已知坑(务必记住)**
1. **A稿真实约 65007300 汉字**(栏目常态 60008000),**不是 2.2 万**——那是用 `wc -m` 把 UTF-8 字节当字数的乌龙(一个汉字 3 字节)。docx 无文本框无表格,`python-docx` 提取的 ~7.5k 字符就是全文。