doco: ep003 全流程跑通(P1→C4)+ OCR并发版 + compose出稿改名

This commit is contained in:
simonkoson
2026-06-18 20:06:45 +08:00
parent 10b0ab757b
commit 8df9c798e7
18 changed files with 6756 additions and 31 deletions
+30 -20
View File
@@ -16,9 +16,9 @@
## 🔖 状态栏 (STATUS — 每次结束 session 前必须更新这三行)
- **最后更新**:账号A | 2026-06-18(建议接手者开新 session
- **当前状态一句话**C4 已收口 + **A稿解析器升级完工**(正则→LLM分段骨架+人工确认+ignore合并,三期 ep002/003/004 骨架已产并人工核验通过:人名零泄露/覆盖完整/隔断与小剧场正确)。**但 ep002/003/004 上游全空**(连抽帧都没做)。下一步=**这三期从 P1 抽帧起走完整流水线 P1→P2→C1→C2→C3→C4 + 串一键脚本**
- **下一个动手的人从这里开始**:见下方「⏩ 交接备注」(新 session 必读)
- **最后更新**:账号A 2026-06-18晚,收摊;建议接手者开新 session
- **当前状态一句话****ep003(小尺寸大讲究)全流程 P1→P2→C1→C2→C3→C4 端到端跑通,通哥已复查、管道判过**——产出 `..._孙逸昊_融合A稿.docx`,红线汉字零改/对齐正确(4 空段=播出剪掉的狙击枪段,非 bug)。**复查发现一个必修项:标点层整篇偏保守(88% 逗号),ep002 铺开前要修标点 prompt**(详见待办);专家/三维动画标签缺失=原稿没标、不赖程序。**ep002/ep004 上游全空**,下一步=配 Ollama 并发 + 修标点后跑这两期
- **下一个动手的人从这里开始**:见下方「⏩ 交接备注」(新 session 必读,已为 ep002/ep004 重写
---
@@ -77,13 +77,14 @@
## 3. 当前进度(核心交接区,以最新快照为准)
- **正在做**:批量化首批三期ep002 潜艇/ep003 小尺寸/ep004 枪王)。已完成 A稿解析器升级 + 三期骨架产出并人工核验通过。**下一步:这三期从 P1 抽帧起跑完整流水线**(上游全空,连抽帧/OCR/ASR 都没做),并把 C1→C2→C3→C4 串一键脚本。
- **卡点 / 待解**:无硬卡点。待 Cline 确认 Step5(parse_a_segments 改造)+Step6(compose 前置检查)是否已接好(上一轮其措辞含糊)。OCR 漏字决定不补、seg8/seg27 一逗到底(见关键决策)。
- **正在做**:批量化首批三期。**ep003 已端到端跑通**P1→P2→C1→C2→C3→C4 全过,融合A稿出稿,红线/对齐核验通过。**下一步:ep002(潜艇)+ ep004(枪王)跑完整流水线**,并发 OCR 在 ep002 首秀;再把 C1→C2→C3→C4 串一键脚本。
- **卡点 / 待解**:无硬卡点。**ep002 跑前必做:配 Ollama 并发**(设 `OLLAMA_NUM_PARALLEL=4` + 重启 Ollama + 看显存别溢出共享内存;客户端 stage_a 已改 4 线程,两边都要才生效)。OCR 漏字决定不补、seg8/seg27 一逗到底(见关键决策)。
---
## 4. 已完成(只追加,最新在最上)
- [2026-06-18 晚 |账号A] **ep003(小尺寸大讲究)批量首期·全流程端到端跑通**P1→P2→C1→C2→C3→C4 六阶段)。产出 `20260331枪械设计中的小尺寸大讲究_孙逸昊_融合A稿.docx`。逐阶段实测数:P1/P2 出 **B稿_v2.txt 698 行**OCR 串行,未用并发);C1 出 **60 热词**(词典累至 172 条,AI 候选回查 A稿无幻觉);C2 讯飞真转写 **278 句带时间戳**(热词偏置生效,型号命中良好);C3 fuse 698 行零偏移、仅 1 处 minor_edit、留痕 1 条;C4 compose 20 段、硬校验**汉字零改逐段通过**、1 处标点回退(seg_6)。**核验三连**:① **4 个空段(seg1518:主持人7/解说8/主持人8/解说9)确认是播出剪掉的 VSS 微声狙击枪 + NTW-20 南非大炮整段**——融合B稿里 VSS/NTW/南非/消音/反器材**零出现**seg14 边界抽查(593681 全 HK416、682 起进结束语)证对齐正确,非 bug;② **C3 同音字坑已抓修**LLM 把权威 B稿"斯泰尔"按 ASR 同音盖成"斯太尔"(519 行),已改回,与 487 行及 A稿一致;③ **出稿命名生效**——`{原A稿stem}_融合A稿.docx`,不覆盖原始定稿。**本期间改的代码**:(a) `stage_a_extract_ocr.py` 修 GBK 崩溃(ffmpeg 子进程加 `encoding=utf-8,errors=replace`)+ 去掉 A3 硬编码 ep001 台词断言改通用中文冒烟检查 + **加并发 OCR(ThreadPoolExecutor/`OCR_NUM_WORKERS`默认4/idx-set 续跑)**——并发**未在 ep003 实跑**(ep003 走串行)ep002 首秀;(b) `fusion_align.py` a_candidates glob 排除"融合/批改"稿(防重跑把自己输出当输入) + 出稿改名带原稿信息。
- [2026-06-18 |账号A] **A稿解析器升级:正则 → LLM分段骨架 + 人工确认 + ignore合并**。起因:量产三期(ep002/003/004) A稿格式与 ep001 天差地别(冒号头/正文同段、`【固摇轨】`镜头标记酷似段头、正文整段加粗、小剧场对话角色头),原 `parse_a_segments` 纯正则(`^【.+?】$`)必散架。新机制(`fusion_align.py`)`extract_a_paragraphs`(带 bold/align 样式) → `extract_skeleton_llm`(thinking=True/max_tokens足量,**LLM 只判结构不碰正文**,输出 type/role_label/para 区间 JSON) → `validate_skeleton_coverage`(全覆盖硬校验,抓 LLM 数错下标/JSON 截断) → 落 `<id>_a_skeleton.json` + 人类预览表 → `parse_a_segments` 改读骨架按下标原样抽正文(inline 头切冒号、standalone 头取后续段、**ignore 段丢弃**、**相邻同 role_label 仅隔 ignore 的 normal 段合并**)。新命令 `doco skeleton --episode-id <id> --a-script <docx>`。**三期骨架已产并人工核验通过**:人名零泄露(刘通/孙逸昊/左鑫/穆佩弦/主持人真名都没混进 role_label)、覆盖完整、ep002 四隔断认对、ep003 九个`(出枪柜)`等归 ignore 且主持人被运镜切断后正确合并(37→20段)、ep004 小剧场卡/斯角色保留。ep001 无骨架时仍走旧正则 fallback,不受影响。
- [2026-06-18 |账号A] **P3-C4 第一批(保守版)收口**`fusion_align.py` 把融合B稿743行碎句按 A稿 28 段(含 4 隔断)对齐归拢,套公文 docx 出稿 `融合A稿.docx`。**两条铁律守死**:①汉字零改——正文 100% 来自融合B稿;②标点由 LLM 按语义增删(一逗到底→正常断句)。机制:(a) **AI 对齐层**喂完整 A稿正文、seg_id 单调不减、thinking=True/4096、缓存 `.c4_cache/batch_N.json`(b) **标点层** `punctuate_segment` 用 STRICT prompt(只许插标点、禁增删改字)+ 硬校验 `strip_punct(出)==strip_punct(入)` 不过即 3 次重试、再不过回退裸文本进 review,缓存 `punct_seg_N.json`thinking=False/3000。**红线核验脚本逐段 strip_punct 比对 28/28 全过**diff 全 equal)。隔断按 `^隔断:【(.+?)】` 正则识别、独立成段、line_count=0、位置正确(解说1/主持人2/3/4 后各一)。标点 `punct_ok` 26/28seg8(专家2)、seg27(专家7) 两段 LLM 顽固插连接词触发回退、已落裸文本+标记"需人工",归第二批。产物:`融合A稿.docx` + `c4_alignment.csv`32行对齐表,含 start/end_line、confidence、punct_ok、note)。命令 `doco compose --episode-id <id>`
- [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 可验证管道。
@@ -99,7 +100,11 @@
- [x] **C3**:B稿v2 ⊕ ASR 交叉复审 → 融合B稿(743行时间戳零偏移) + fusion_review.csv(5条留痕)。
- [x] **C4(全部收口)**:融合B稿按 A稿28段对齐归拢 → 融合A稿 docx(公文格式)。汉字零改 + LLM 按语义加标点,红线 28/28 段逐字一致。`doco compose --episode-id <id>`。**OCR 漏字决定不补**(讨论见关键决策);seg8/seg27 两段标点接受一逗到底。
- [x] **A稿解析器升级**:正则 → LLM分段骨架+人工确认+ignore合并;三期骨架已产并核验通过。`doco skeleton`
- [ ] **批量化首批三期·跑完整流水线(下一步主线)**ep002/003/004 上游全空(连抽帧都没做)。需对每期跑 **P1抽帧 → P2 OCR(出B稿v2) → C1术语 → C2 ASR → C3融合(出融合B稿) → C4 compose(出融合A稿)**。重活在 P2 OCR(本地约半小时/期)与 C2 ASR(讯飞额度)。建议从 **ep002(最规整)** 起当烟雾测试,再 ep004(最难)、ep003。**注意:现在还不能直接跑 doco compose——三期都没有融合B稿。**
- [~] **批量化首批三期·跑完整流水线(下一步主线)****ep003 已跑通收口**(见已完成)。剩 **ep002(潜艇,中等)+ ep004(枪王,最难·小剧场密)** 仍上游全空。每期顺序 **P1抽帧 → P2 OCR(出B稿v2) → C1术语 → C2 ASR → C3融合 → C4 compose**。重活在 P2 OCR 与 C2 ASR(讯飞额度)。**ep002 跑前先配 Ollama 并发**(见下条 backlog)。stage 脚本从**已修好的 ep003 版**复制,别再拿 ep001 的。
- [ ] **【ep002 跑前必做·其一】标点层 prompt 修复(高优)**:ep003 复查实锤标点层整篇偏保守——逗号 511 vs 句号 70(断句标点 88% 逗号),语义该断句处全是逗号。根因判断:标点层关 thinking + STRICT prompt 只强调"别改字"、没强调"完整陈述句结尾用句号"。修法:prompt 里明确要求正常断句 + 给反例(过度逗号→句号),**有 strip_punct 硬校验兜底,标点层可放开手脚不怕越界**。修完重跑 ep003 `doco compose` 刷新 docx。不破红线(汉字零改),但不修则每期都要人工大改标点=自动化失义。
- [ ] **【ep002 跑前必做·其二】配 Ollama 并发**:设 `OLLAMA_NUM_PARALLEL=4` + 重启 Ollama(托盘退再开,别在有任务时退) + 重启后看显存别溢出共享内存。客户端 stage_a 已是 4 线程,光设环境变量没用,两边都要。
- [ ] **【产品 backlog】原稿缺【专家N】/【三维动画N】标签**:ep003 复查发现编导原稿里就没有专家、后续三维动画的分段标注,骨架如实反映=融合A稿里也没有(通哥手工补了高亮)。不赖程序(原稿零信号,LLM 与人一样猜不准),**不让程序猜**。治本=提醒编导/责编原稿把【专家N】等段头标全;50 期前在导入须知里写清。
- [ ] **【backlog】C3 prompt 收紧**:专有名词(厂名/型号/番号)遇 ASR 同音异写,必须以 B稿v2/A稿为准、不许采 ASR——ep003 已踩"斯泰尔→斯太尔",50 期批量前在 prompt 里收紧防复发。
- [ ] **串一键脚本**:把 C1→C2→C3→C4 串成"一条命令跑一期"(薄壳,各阶段已有断点缓存),验 2-3 期稳定后再谈监控文件夹/绑定界面。
- [ ] **骨架小瑕疵 backlog(不拦路,后期顺手或跳过)**:ep002 演播室主持人 vs 主持人 是否统一;ep004 小剧场角色编号乱(斯9/斯通纳10、卡8跨场)直接改 JSON 即可,不必重调 LLM;ep003 行内`【固摇轨】`留在参照正文(无害,不进输出)。
- [x] **C2** 讯飞 ASR 适配层(密钥外置 + asr_adapter 并入 + `doco asr` 命令 + 真转写310句)
@@ -129,6 +134,9 @@
- [2026-06-16] **C1 术语源 = A稿(规范写法),不是 B稿。** Cline 曾擅自换成 B稿v2,已纠正。
- [2026-06-15] **讯飞用「录音文件转写标准版」,不要大模型版**(免费包阉割 `language` 参数,会报误导性 `language verify fail`)。参数锁定:`pd=mil``eng_smoothproc=true``eng_colloqproc=true``hotWord=<C1热词>``language=cn`。签名 `signa=base64(HmacSHA1(MD5(appid+ts), secretKey))``/upload` 拿 orderId,轮询 `/getResult` 到 status=4。
- [2026-06-15] **B稿v2 权威升级**:屏幕术语/型号/番号 **B稿v2 ≈ A稿 并列权威**(B稿是屏幕实打的字,更贴近播出)。口语/语序/语气信 ASR;书面结构/分段信 A稿;同音事实错(美以→美伊)用 A稿/B稿v2 覆盖 ASR。
- [2026-06-18 晚] **C3 会拿 ASR 同音字盖权威 B稿专名——必须核验留痕、专名一律以 B稿/A稿为准。** ep003 实证:B稿"斯泰尔"(奥地利厂名)被 C3 LLM 按 ASR 同音改成"斯太尔",造成 487/519 行不一致。已手改回。这正是上条权威规则的反例落地:**厂名/型号/番号遇 ASR 同音异写,零容忍采 ASR**。50 期批量前应在 C3 prompt 收紧(见待办 backlog);每期 fuse 后扫一眼 `fusion_review.csv` 的 minor_edit 是不是专名同音改。
- [2026-06-18 晚] **C4 出现空段≠对齐 bug,先查"是不是播出剪了这段"。** ep003 有 4 个空段(seg1518 整段 VSS 微声狙击枪 + NTW-20),一度疑似对齐错乱。核验路径:去**融合B稿**里 grep 该段专属词(VSS/NTW/南非/消音/反器材),零命中=播出确实剪了;再抽查相邻实段边界确认没把别段内容错塞过来。结论是 C4 如实留空、对齐正确。**空段是常态(播出删戏),别当 bug 去"修"。**
- [2026-06-18 晚|通哥复查] **C4 标点层整篇偏保守是真缺陷,须在批量铺开前修——但不破红线。** ep003 复查实测逗号 511 vs 句号 70(断句标点 88% 逗号),语义该断处全逗号。根因:标点层关 thinking + STRICT prompt 只强调"别改字"未强调"句子结尾用句号"。**红线(汉字零改)由 strip_punct 守着没破,所以标点层尽可放开 prompt 让它正常断句、不怕越界**。修复列 ep002 前必做,修完重跑 ep003 compose 刷 docx。这条把先前"seg8/seg27 一逗到底可接受"的范围收窄:个别段一逗到底可接受,但整篇 88% 逗号不可接受、必须修。
- [设计期] **分层不变**:OCR 错字纠正、术语统一、时间戳对齐走**规则层**(确定性);段落归属、整段删除判定、编导笔误识别走 **AI 层**(需语义判断)。
- [设计期] **顺序约束**:术语提取(C1,产热词)必须在 ASR(C2)之前——已成立。
- [2026-06-17] **`fusion_review.csv` 定位 = 留痕档案(给爱德华/复核),不是编导读物。** 编导读的是 C4 docx。CSV 可读性不优化,只看 final_text 准不准。
@@ -140,22 +148,24 @@
## 7. ⏩ 交接备注(写给下一个接手的 session)
> 下次开工读完这段应能 0 摩擦续上。接手后可清空重写。**(本段已为「ep002/003/004 批量化」新 session 重写,2026-06-18**
> 下次开工读完这段应能 0 摩擦续上。接手后可清空重写。**(本段已为「ep002 + ep004 续跑」重写,2026-06-18**
- **大局**首期 `ep001_20260612_fangkong_fandao` 全流程 C1→C4 已跑通、红线核验 28/28 逐字一致、`融合A稿.docx` 就位。代码管道(C1 terms / C2 asr / C3 fuse / C4 compose + 新增 skeleton)全部可用。现在进入**量产首批三期**
- **这期现状(关键!)**`ep002_20260127_qianting_fangsheng`(潜艇仿生,中等)/`ep003_20260331_qiangxie_chicun`(小尺寸大讲究,最简单)/`ep004_20260526_qiangwang_duijue`(枪王对决,最难)。**只做了 A稿分段骨架(skeleton),上游一片空白**——没抽帧、没 OC、没 B稿v2、没 ASR、没融合B稿。每期目录现有:原始 A稿 docx + mp4(约 1GB,规格与 ep001 同 = 黑底白字字幕视频OCR/ASR 共用)+ `<id>_a_skeleton.json` + `<id>_a_skeleton_preview.txt`
- **骨架已人工核验通过**(通哥过目):人名零泄露、覆盖完整、隔断/小剧场/ignore 分类正确。ep003 还修过两个真缺陷(主持人被 ignore 切成重复同名段→已合并 37→20;预览表"前20字"显示错位→已修)。**所以 skeleton 阶段对三期都算完成,别重跑。**
- **第一句话该干的**:**给这三期补上游流水线**。每期顺序:P1 抽帧 → P2 本地 OCRDeepSeek-OCR/Ollama约 30min/期,放独立终端)→ C1 术语热词 → C2 讯飞 ASR(花额度)→ C3 fuse → C4 compose。**`doco compose` 现在跑不了这三期**(没有融合B稿C3 产物),别误试。
- **推荐节奏**:先拿**最简单的 ep003** 当冒烟测试走完整条链验证管道,再 ep002,最后**最难的 ep004**(小剧场 58 段、历史人物对话密)。
- **要串的一键脚本**:把 `doco terms → asr → fuse → compose` 串成"一条命令跑完一期"C1→C4 链;P1/P2 OCR 可先独立跑因为重且慢)。**批量化形态(监控文件夹 vs 绑定界面)通哥还没拍板**,先把半自动脚本串顺、验 2-3 期稳定,再回来定要不要做花活。
- **大局**ep001 + **ep003 两期已全流程跑通**、融合A稿就位。代码管道(C1 terms / C2 asr / C3 fuse / C4 compose + skeleton)全部可用且经 ep003 实战验证。现在剩 **ep002 + ep004** 两期要跑
- **这期现状(关键!)**`ep002_20260127_qianting_fangsheng`(潜艇仿生,中等)/`ep004_20260526_qiangwang_duijue`(枪王对决,最难·小剧场密)。**只做了 A稿分段骨架(skeleton),上游全空**——没抽帧、没 OCR、没 B稿v2、没 ASR、没融合B稿。每期目录现有:原始 A稿 docx + mp4(约 1GB,规格与 ep001/ep003 同 = 黑底白字字幕,OCR/ASR 共用)+ `<id>_a_skeleton.json` + `<id>_a_skeleton_preview.txt`骨架已人工核验过,**别重跑 skeleton**。
- **第一句话该干的**:**ep002 起跑上游流水线,但跑 P2 OCR 前先配 Ollama 并发**(ep003 是串行跑的,慢)。配法:设 `OLLAMA_NUM_PARALLEL=4` → 重启 Ollama(托盘退再开,别在有任务时退)→ 重启后看显存别溢出共享内存。**客户端 stage_a 已改 4 线程(`OCR_NUM_WORKERS` 默认 4),光设环境变量不生效,两边都要。** 并发是 ep002 首秀,盯一眼是否真比串行快、有没有掉帧/重复行(stage_a 用 idx-set 续跑,乱序写安全)。
- **每期顺序**P1 抽帧 → P2 OCRDeepSeek-OCR/Ollama,独立终端)→ C1 术语 → C2 讯飞 ASR(花额度)→ C3 fuse → C4 compose。**stage 脚本从已修好的 `ep003` 目录复制,别拿 ep001 的**ep003 版已修 GBK 崩溃 + 去掉硬编码 ep001 台词断言 + 加并发)。`doco compose` 跑前必须先有融合B稿C3 产物),否则报错——别跳着试。
- **推荐节奏**:先 ep002(中等、当并发烟雾测试),最后 ep004(最难,小剧场历史人物对话密)。
- **量产坑(务必记住)**
1. 每期热词/术语不同,**C1 每期重跑**;A稿分段编号各有各的重复/空格脏,**按出现顺序走、别假设单调唯一**,任何按段头文本做 key 的字典都会把重复段头合并(核验脚本初版踩过,用 occurrence 队列)
2. **ASR 花讯飞额度、embedding 花 MiniMax 额度**,批量前估下成本;长转写/OCR 放独立终端别让 Cline 盯
3. **OCR 漏字本期不补**(通哥拍板,见关键决策)——根在抽帧/OCR 漏掉两三字单屏,LLM 补词=破红线;治本是提醒编导别让两三字单独一屏
4. Cline 会偷换模型/术语源、误判字数、口头猜错根因——**自报结果一律对源数据核验**
5. **thinking 分任务用**:语义对齐/骨架开、标点/抽取关(见关键决策 2026-06-18)
- **代码待落实的两处(让 Cline 确认已接线,没接就先接)**:① `parse_a_segments()` 改造(读 skeleton.json 抽正文、丢 ignore、合并 ignore 切断的同角色段)是否真生效;② `run_compose` 的"compose 前置检查"(无融合B稿/无骨架要报清错而非跑崩)是否真加
- **骨架小瑕疵 backlog(非阻塞,可不动)**:ep002「演播室主持人」与「主持人」可统一称呼;ep004 小剧场角色编号(卡8/斯9/斯通纳10 等)可清成连续(直接改 JSON,**别重跑 LLM**);ep003 参考正文里内联的 `【固摇轨】` 镜头标记无害
1. 每期热词/术语不同,**C1 每期重跑**;A稿分段编号各有各的重复/空格脏,**按出现顺序走、别假设单调唯一**。
2. **C3 fuse 后必扫 `fusion_review.csv`**:专名(厂名/型号/番号)若被 ASR 同音字改了要打回(ep003 踩过"斯泰尔→斯太尔",见关键决策)
3. **C4 出现空段先别当 bug**:多半是播出剪了那段戏,去融合B稿 grep 该段专属词确认(见关键决策)
4. **OCR 漏字本期不补**(通哥拍板)——根在抽帧/OCR 漏两三字单屏,LLM 补词=破红线
5. **ASR 花讯飞额度、embedding 花 MiniMax 额度**;长转写/OCR 放独立终端别让 Cline 盯
6. Cline 会偷换模型/术语源、误判字数、口头猜错根因——**自报结果一律对源数据核验**
7. **thinking 分任务用**:语义对齐/骨架开、标点/抽取/融合关(见关键决策 2026-06-18)
- **出稿命名已改**`{原始A稿stem}_融合A稿.docx`(不覆盖原始定稿);`fusion_align.py` 选 A稿的 glob 已排除"融合/批改"字样,重跑 compose 不会把自己输出当输入。
- **串一键脚本(ep002/ep004 验稳后做)**:把 `doco terms → asr → fuse → compose` 串成"一条命令跑完一期"C1→C4;P1/P2 OCR 重且慢,先独立跑)。批量化形态(监控文件夹 vs 绑定界面)通哥未拍板,先把半自动脚本串顺。
- **骨架小瑕疵 backlog(非阻塞)**:ep002「演播室主持人」vs「主持人」可统一;ep004 小剧场角色编号(卡8/斯9/斯通纳10)可清连续(直接改 JSON,别重跑 LLM)。
- **字体坑(C4 出稿)**:大标题方正小标宋_GBK(商业字体),出稿前确认制片机/编导机已装,否则脚本回退(标宋→宋体加粗)。
- 通哥连轴转了几轮,回复要紧凑。