拆片有道 [知行出品]
把一条视频号爆款拆成「为什么火 / 哪几句能抄 / 下一支怎么拍」。全程在本机跑:下载用系统 Edge、抽帧用 ffmpeg、逐字稿用本地 whisper,报告由助手自己看帧图写——不调用外部模型、不需要任何 API Key、视频不外传。
名字里的「一键」指的是:用户把分享链接丢过来就够了,不需要自己先下载视频。本技能自带下载(首次要本人扫一次码,见第 1 步)。
触发场景
用户发来一条或多条视频号视频(https://weixin.qq.com/sph/... 分享链接,或本地 mp4),并希望知道「这条为什么火」「帮我拆一下」「能不能复刻」「出个拆解报告」。
一次给多条、或说「对比一下」「有什么共同规律」「这批为什么都火」→ 除了一人一份报告,再走轨道 B 出一份跨条内容公式卡(内部决策版 + 给甲方看的结论版)。
不适用:只要把视频存下来留着自己用(那不需要这个技能);要直接生成复刻成片(用「爆款复刻器」)。
先装一次(散户只需要做这一步)
判断要不要装,看的是「依赖齐不齐」,不是「技能目录在不在」。 先跑一次体检(下一节);只有体检报 needs_setup、或 faster_whisper / matplotlib 为 false、或 download_available 为 false 时,才让用户跑安装:
python "<Skill目录>/scripts/setup.py"
安装脚本会自己找一个能用的 Python(首选 WorkBuddy 自带的解释器,用户不需要自己装 Python),把缺的包装上,预下载语音模型,跑一次体检,并把选中的解释器路径记到
%LOCALAPPDATA%\zhixing-video-dissect\python.txt(macOS 是 ~/Library/Application Support/zhixing-video-dissect/python.txt)。幂等,重复跑不会重复下载。
弱网下的正确重试姿势(很重要):
- pip 会按 清华镜像 → 阿里云镜像 → 官方源 自动切换,并带 30 秒超时 / 5 次重试;设了
PIP_INDEX_URL就完全听用户的,不覆盖。 - 依赖是逐个装的:中途断了,重跑同一条命令即可,已经装好的会跳过,不会从头再下一遍。
- 如果只差语音模型(依赖都就绪、模型没下成),用
--model-only只补模型,不要整个重装。 - 装之前会先探 WorkBuddy 自带环境是否可写;只读环境会直接换成本技能专用环境,避免「下了几百 MB 才发现装不进去」。
> 为什么是 python …setup.py 而不是双击 .bat:SkillHub 的上传口不收 .bat
> (回话是「不允许的文件类型」),所以分发包里只有 .py / .md / .json / .txt。
> 本机开发用的 setup.bat / 安装.bat / run.bat / run.sh 仍然在 scripts/ 里,
> 但它们不进包,别在文档或提示语里让散户去双击。
装完之后,所有脚本一律用薄启动器调用——它负责找到那个「装了依赖的 Python」,你不用关心是哪一个:
python "<Skill目录>/scripts/run.py" <脚本名> [参数...]
# 例:python "<Skill目录>/scripts/run.py" dissect.py --doctor
> 下面的命令示例为省版面写成 run <脚本名> …,请按上面展开成 python "<Skill目录>/scripts/run.py" <脚本名> …。
> 启动器会把目标脚本的退出码原样返回——三道闸门只看退出码,这一环不许改意义。
> 直接 python "<Skill目录>/scripts/dissect.py" 也能跑,前提是你知道那个 Python 装没装依赖。
依赖与体检
whisper 和 matplotlib 都是必需项,不是可选增强——逐字稿是拆解报告的核心证据之一,七张图是这一版报告的主要读法。四个必需依赖各管一段路,缺哪个断哪段(详见 requirements.txt):playwright(下载)、faster-whisper(逐字稿)、imageio-ffmpeg(抽帧)、matplotlib(出报告里的七张图)。
python-docx 是可选项:交付物是 HTML,出网页不依赖它;它只在有人临时要把 md 转成 Word 时才用得上(备用转换器见第 7 步末尾)。缺了它体检照常报 ready,不拦、不提示装。
第一步永远先体检:
run dissect.py --doctor
status: ready→ 直接往下走。status: needs_setup(缺 ffmpeg 或 Python < 3.10)→ 告知用户缺什么,征得同意后跑一次上面的安装脚本。download_available: false→ 本地 mp4 拆解不受影响,只是吃不了分享链接;按download_reason处理(通常是没装 playwright 或没找到 Edge/Chrome)。probe_plan字段说明时长是怎么探到的:ffprobe最准;ffmpeg_stderr是退而求其次(imageio-ffmpeg只带 ffmpeg 不带 ffprobe,这条路径在散户机器上很常见),此时meta.degrade会记probe_via_ffmpeg_stderr,报告里要如实提到(闸门② 要求每项降级在报告里找得到对应说法)。faster_whisper: false不再是可接受的降级——回去把安装脚本跑完。真装不上时按下面的降级链处理,并在报告里显著标注。matplotlib: false同样不是可接受的降级——回去把安装脚本跑完。缺了它就别往下写报告:要么补装,要么明说这次交付没有图(CHART_SLOTS_MISSING会拦下没图的报告,这是故意的)。
工作流程
三条轨道,13 步。轨道 A 按 1→7 走完一条视频;用户一次给多条、或明确要「对比 / 公式 / 规律 / 这一批为什么都火」时,接着走轨道 B(8→11);轨道 C(12→13)每次都要走——拆解的意义就是二创,所以默认档成品是直接出的,不会停下来等你挑方向。
第 3、6、11 步是三道闸门,只看退出码,不看自我感觉。
轨道 A · 单条拆解(1 → 7)
一条视频从链接走到 .html。多条就重复走多遍——每条都要有自己过了闸门②的报告,轨道 B 才有样本可用。
1. 拿到视频文件
下载前不询问权属,一个字都不问。 拿到链接直接跑:
- 用户已给本地 mp4 → 直接用,进第 2 步。
- 用户只给分享链接 → 本技能自带下载,一条命令搞定:
run dissect.py "<分享链接>" --out "<输出目录>"
- 不问不等于不管:管束落在产物上。本次来源由
--source标注(默认public),写进meta.json的source.label留机器底账——报告里不再出现来源声明(用户拍板:报告不提来源)。这里说的「来源」是版权归属(public / self / authorized),不是让你别写视频链接——资料卡的「视频来源」必须写全,写成「分享链接」四个字会被闸门② 拦VIDEO_SOURCE_PLACEHOLDER。要回看某份拆解拆的是谁的东西,去读素材包的meta.json。 --source三档:public(默认,第三方公开内容,仅作分析用途)/self(本人发布)/authorized(已获授权)。不确定就留默认——把"别人的"标成"我的"才是真的会出事。- 首次会弹出窗口要用户本人扫码(扫的是腾讯元宝的登录,不是微信),扫完登录态会留在本机,之后复用,通常不用再扫。
- 视频落在
--download-dir(默认Downloads\视频号拆解\),同目录还会有<视频同名>.stats.json(互动数据)与.<视频同名>.cover.jpg(封面)。 - 这些产物会自动汇入第 2 步:命令接着就把素材包生成好了,不用再手工跑一次。
助手不代替用户登录,不索要密码 / Cookie / 票据。 不拆私密、付费、已删除内容。
> 视频号链接必须有登录态才能解析,没有免登录路径——这是平台限制,不是本技能的缺陷。所以"首次要扫一次码"是要提前告诉用户的事。
2. 生成素材包(一条命令,默认满配)
run dissect.py "<视频路径>" --out "<输出目录>"
- 长视频或要求更高准确度时加
--model medium(更准但明显更慢;默认small)。 - 互动数据会自动认领:视频旁若有
<视频同名>.stats.json就自动带上;没有就用--stats <路径>指过去。这是观众那一半的证据,能拿到就别浪费。 - 走第 1 步的链接入口时,这一步已经顺带做完了。
产出:
<out>/frames/f_001.png … 【满配】每个镜头至少 1 帧,长镜头另在其 25%/75% 处补采;
不设总数上限,最长边 1280
<out>/transcript.json 逐字稿 [{start,end,text}]
<out>/transcript.txt 逐字稿纯文本(带时间戳)
<out>/stats.json 平台互动数据(点赞/评论/转发/收藏/作者/发布地/是否硬广)
—— 只有拿到 sidecar 才有;计数会漂,引用必须带 fetched_at
<out>/meta.json 时长/分辨率/帧率/切点/镜头表/响度/degrade/shots_without_frame/stats
<out>/READ_ME.txt 读取指引
> 满配是本技能的默认档,不是可选项。 这份报告是拿给别人看的——不把每个镜头都看过,看报告的人就无从知道这条片子到底是怎么拍的。 少看一个镜头,分镜表那一格就只能靠时长猜,而猜出来的画面会被写进「照着拍」的施工图里,那才是真的害人。
>
> 所以默认永远全看,不需要额外开什么开关。--max-frames N 是反方向的降档开关,只在截图成本明显不可接受时才用(见下面的成本护栏);一旦用它,素材就变成采样包,第 3 步会拦下你(退出码 12),报告也必须按降级写明覆盖范围。
成本护栏(读帧之前必做,不许静默降档)
满配意味着帧数 ≈ 镜头数(长镜头还要多)。助手要把帧图都读完,所以先报账再开工:
- 跑完第 2 步、动手读帧之前,先输出一行:
本条 N 个镜头 / 将要读 K 张帧图(长镜头已补采)。N、K 取自meta.json的len(shots)、len(frames)——不许目测。 - 若 K > 150,停下来把代价讲给用户,让用户在两者间选:
(a) 满配继续;或 (b) 用--max-frames N降档重跑。
禁止静默降档——不许为了"快一点"自己偷偷改档。选 (b) 则闸门①会退 12,报告必须按降级写明覆盖范围。 - 视频超过 15 分钟时,另加一句转写的预计耗时(转写耗时大致与时长成正比,
small档约每分钟视频十秒量级,medium明显更慢)。 - 这两个数只用于当场告诉用户代价,不写进报告(原先有一节「运行证据自检」逐项复述它们,已于 2026-10-12 停用)。
多条链接:对每条视频各跑一次(输出到各自子目录),每条都要独立走完第 3–7 步、各自的报告都要过闸门②——没过门的报告不许当公式卡的样本。攒够 3 条以上再走轨道 B。
3. 闸门① —— 素材满配体检
run dissect.py --verify-pack "<素材包目录>"
只看退出码:
| 退出码 | 含义 | 怎么办 |
|---|---|---|
0 |
tier: A,满配(每个镜头都有帧) |
放行,进第 4 步 |
12 |
tier: B/C,不满配 |
停下来。按 blocking 里的 SHOTS_WITHOUT_FRAME 等条目重跑第 2 步(去掉 --max-frames)。不许带着不满配的素材往下写分镜表 |
2 |
目录里没有 meta.json |
第 2 步没跑成或路径给错了,回去查 |
4 |
探不到视频时长 | 素材会产出坏镜头表,已中止。检查 ffmpeg 是否可用、视频文件是否完整 |
判定同时输出镜头数、帧数、逐字稿来源与段数、degrade 列表——这几个数只在跑的时候看,不写进报告(原先那节「运行证据自检」已停用)。
4. 助手自己读素材(关键一步)
按 READ_ME.txt 的顺序读:
meta.json—— 时长、镜头表、切点、响度、degrade、stats。frames/*.png分批并发 Read —— 这是本技能的核心:助手直接看图,读字幕、卡点、章节卡、证据截图、封面感。零成本多模态,不调任何外部视觉 API。满配意味着镜头有几段就要读几张,这是应该花的时间。
- 每批 6–8 张一起发出(同一条消息里并列多个 Read 调用),读完一批再发下一批;宿主不支持并发时会自动退化成逐张,不会出错。
- 每张图只读一次,别回头重读;读完先在心里攒着,全部读完再动手写报告。
- ⚠️ 不要「读一张、想一段、再读下一张」。2026-10-20 的真实反馈:一条片子读图加写报告要 30–40 分钟,用户直接就走了。并发读图是整条链路里最省时间的一步。transcript.json—— 有就用,但必须回帧图校正;确实没有时整段从帧图读烧录字幕(视频号视频大多带烧录字幕,逐帧读即可还原 ≈100% 文案)。stats.json(若有)—— 平台互动数据,写进资料卡用。引用必须连fetched_at一起写,因为数字会漂(实测同一条视频两小时内点赞从 688 涨到 815)。
> ⚠️ 逐字稿是「时间轴」,不是「原文」。 实测 whisper small 的中文有错字:
> WorkBuddy→Workbody、工作流→工作榴、全链路→全连录、零一数科→01数科、扣→Code。
> 凡品牌名、数字、专有名词,引用前一律以帧图里的烧录字幕为准。
> 不要因为 whisper 给了完整句子就直接照抄进报告。
5. 写报告(交付物之一 · 分析档案)
先说文件名:拆解报告_<视频标题>_<日期>.md,写在素材包目录里(与 meta.json 同级)。
> ⛔ 不许叫 report.md。 交付物是给人看的,一个没有信息量的文件名等于没名字——用户拆了几十条之后根本分不清谁是谁。
> 名字不用你自己拼:READ_ME.txt 里已经给了一行「交付物文件名」(下载时从平台接口拿到的标题,
> 已去掉换行与 / \ : * ? " < > | 这些不能当文件名的字符,并截到 60 字)。
> 直接照抄那一行,别改写。只有本地文件拆解、或平台没给标题时(READ_ME.txt 会直说),
> 才由你按资料卡那行「视频标题」自己起名,规则同样是 拆解报告_<标题>_<日期>。
> HTML 用同一个主名换后缀 .html——源 md 与交付的网页天生配对。
按 @references/report_template.md 的结构写(正文从 第 1 节 连续排到 第 10 节,共 10 节,全部必需、没有可选节;「资料卡」与「平台规则备忘」不占编号、靠标题认;正文到「平台规则备忘」为止,后面不再挂附录**),按 @references/scoring.md 的口径打分。
先落成 Markdown,不要手写 HTML。 下一步要拿它过机器门禁,最后由渲染器统一出网页。
> 每个 ## 标题下面那两行引用块不能漏(模板里已经按节给好了):
> > 卡片:<卡片名>|<一句话说明> 和 > 分组:<分组名>。
> 第 7 步的 HTML 靠它们做标签页和卡片——分组名、卡片名、说明全从 md 读,
> 渲染器里没有写死的映射表。漏写不报错,但卡片名会退化成节标题、
> 缺分组的会挤进第一个分组,渲染器会打印告警。
> ⛔ 必须说人话。 报告是给普通观众看的,不是给工程师看的。用户 2026-10-13 的反馈原话:
> 「有英文又有汉字……这个用户也看不懂是什么意思。要讲人话,写文字」「有 F-001 等的标号,
> 很多人看不懂什么意思,这些要用时间简单表述,不能太过于复杂,看着像乱码一样的」。
> 四条硬规矩(都是闸门② 的 blocking 规则,违反会退 12):
>
> 1. 时间一律说「第 9 秒」「0 到 9 秒」。素材包里的 f_001.png 是机器内部编号,
> 报告里不许出现 f_001 这类帧号(FRAME_ID_IN_REPORT)——读者不知道那是第几秒。
> 2. 画面上的英文要翻成中文。01 INPUT → OUTPUT、HOW IT MOVES、SAY THE INTENT
> 这类章节卡文字,报告里要写成中文(如「第一步:输入 → 输出」),
> 成串的英文单词会被 ENGLISH_RUN_IN_REPORT 拦下。
> 单个产品名照写(WorkBuddy / HyperFrames / React / Premiere Pro 都可以)。
> 3. 章节引用写「第 N 节」,正文里不许出现 §(TECH_JARGON_IN_REPORT)——
> § 是公式卡证据列的机器语法,不是给人看的。
> 4. 程序标识符一律翻成中文说明(TECH_JARGON_IN_REPORT)。meta.degrade 里的
> scene_ladder_exhausted,报告里要写成「全片近乎一段长镜头,切点切不开」,
> 不许把变量名甩给读者。
> 5. 不许把内部文件名写进报告(TECH_JARGON_IN_REPORT)。模板里凡是写成
> @references/xxx.md 的行都是在交代你该去读哪个文件,不是给你抄进报告的话。
> 实测漏过一句「按 recreate_script_template.md 的约定……」,读者根本不知道那是什么。
> 6. 图的说明文字和图片文件名也都用中文()。
> 图注是你写的,不在「引用原话」的例外里;写成 
> 会同时撞上 ENGLISH_RUN_IN_REPORT(成串英文)和 TECH_JARGON_IN_REPORT(带下划线的内部标识)。
>
> 唯一例外:引用原话的地方一个字都不许改(第 8 节分镜表的台词列、第 10 节台账的原话列),
> 那里的英文单词、口语、错别字照抄。门禁也认这个例外。
「说人话」说的是字面;下面这四条可读性装置说的是读者能不能用得上。
同属闸门② 的 blocking,违反一样退 12(细节见 @references/report_template.md 顶部那块):
- 句内标来源(
LABEL_MISSING)。每条要紧的句子后面自己交代这是看得见的事实还是你的判断:
有真值的标 【实测】(能带时间点就带上,如「【实测·第 5 秒】」——全片时长、帧时间、响度、逐字稿、平台计数都算);
靠判断的标 【推断】(语气、动机、观众心理、算法归因都算)。两个标注全文都要出现——
全标【实测】是把猜测说成事实,全标【推断】是把测过的东西说虚了,两头都是错的。 - 每节末尾一句「所以呢」(
SECTION_NO_SO_WHAT)。第 1–10 节每节的最后一个非空行都要是
> **所以呢**:<这条信息对读者意味着什么>。读者看完一节要能立刻知道「这跟我有什么关系」,
不是自己从数据里悟。 - 报告最后一行是「下一步」(
MISSING_NEXT_STEP)。全文最后一个非空行写成
> **下一步**:<你该做什么>,要给到刻度(「先把 D3 补到 6 分以上再开拍」,不是「继续优化」)。
「下一步」是报告级的收尾块,压在整份报告的最后一行(也就是「平台规则备忘」的后面),
不是哪一节的内容。 - 二创方向池给 6 到 8 个(
DIRECTION_POOL_TOO_SMALL)。见轨道 C 第 12 步。
这几节最容易偷懒、但不许省:
- 第 8 节 逐镜分镜表——这是「照着拍」的施工图,结构分段代替不了它。满配下每一行的「画面内容」都要写实,空着或写「—」「待补」会被门禁拦下。时间列只能抄
meta.json里的实测帧时间或镜头起点,不许四舍五入成好看的整秒,更不许把帧时间当视频时间写。外部时间(发布时刻、抓取时刻)不要用19:55这种冒号写法——会被当成视频时间戳,撞上"超出片长"的检查。 - 第 10 节 文案功能台账——逐字稿只是记录,台账才是能抄的:把承担功能的句子挑出来标(钩子 / 留人 / 信任状 / 痛点 / 信息增量 / 情绪 / 金句 / 转折 / 行动召唤)。至少覆盖开头钩子、一条信任状、一条金句、结尾 CTA。
- 第 4 节 前 3 秒专项——视频号的生死线,四个要素(画面 / 字幕 / 声音 / 3 秒内变化)必须逐个拆,不许合成一句话糊过去。
- 第 2 节 八维评分表的三个判读数:爆款指数 / 短板分 / 差值。数字必须与上面八维得分算术自洽(门禁会重算),一位小数即可(写
6.8不要写6.75,浮点会在容差边界上抖动)。差值 > 2.0 要指出上限被哪一维卡住。 - 资料卡里的互动数据那一行——有数据就必须登记:数字要和
meta.stats逐位相同(改数、凑整、约等于都会被门禁拦),引用要带fetched_at;没有数据就写「数据缺失」,绝对不许编点赞 / 转发数。只登记原始计数:不算任何比值(转发:点赞 之类),不与任何基准或"通常水平"作对比,也不据此刻画观众类型——这是单条视频,没有对照组,比值看着精确、实则说明不了问题。要从数据那边说话,只问「有没有只挂在画面上、口播从没念过的话」这类内容侧的问题。
5.1 出图(报告写完之后,同一目录里跑)
报告里有七张图,它们不是装饰,是这一版报告的主要读法。 六处位置各配一句加粗导语
(**先看形状**——… / **再看配比**——… / **先看结论**——…),把「这张图该看什么」说死,
再跟图。位置与导语的样子在 @references/report_template.md 里;图的数据怎么给、
哪张图机器算、哪张图你来填,在 @references/chart_spec.md 里。
先把你要给的判断值写进 图/charts.json(第 3 节的四口档位、第 4.1 节的三轨事件与切镜秒、
第 5 节每段的短名、第 7 节方向池的类 / 改动幅度 / 潜力),然后:
run charts.py --report "拆解报告_<标题>_<日期>.md" --meta "meta.json"
出七张 PNG 到 图/,最后打一行 CHARTS_OK 7/7 → 图。图里的数字是从报告现算的
(第 2 节八维、第 5 节时间与功能、第 10 节台账计数)——脚本会拿它们跟 meta.duration、
跟台账行数对账,对不上退 12 并指到具体哪一格,不许你自己印一张好看的图去骗人。
> ⛔ 图是必需项,缺一张闸门② 就退 12(CHART_SLOTS_MISSING)。写报告时先写图和导语
> 再往两边填字,比写完正文再回来补图省事得多——图的文件名得在报告里出现,两处必须对得上。
> 中文字体由脚本自己按链找(雅黑 → 黑体 → Noto Sans CJK → …);图/charts.json 里
> 真要自己指字体,指错了会大声报错(不会静默回退成豆腐块)。
6. 闸门② —— 报告结构门禁
run verify_report.py "<报告.md>" --meta "<素材包目录>/meta.json"
只看退出码:
| 退出码 | 含义 | 怎么办 |
|---|---|---|
0 |
结构与数据自洽 | 放行,进第 7 步 |
12 |
不达标,逐条列出 blocking |
改报告,改完重跑。最多补 3 轮 |
2 |
报告文件读不到 | 路径给错了 |
门禁会核对:交付物文件名里有没有这条视频的标题(叫 report.md / 拆解报告.md 这类通用名会被 GENERIC_REPORT_NAME 拦下,名字跟视频对不上会被 NAME_WITHOUT_TITLE 拦下——照抄 READ_ME.txt 给的那行就不会错)、七张图在不在(缺图 CHART_SLOTS_MISSING、图前没有那句加粗导语 CHART_NO_LEAD、图路径写成绝对路径或跑到报告目录外面 CHART_PATH_NOT_RELATIVE、报告引用的图在盘上找不到 CHART_FILE_MISSING——见上一节)、第 1 节–第 10 节 是否齐全/乱序、资料卡与「平台规则备忘」在不在、资料卡里有没有「逐字稿」那一行、第 2 节 八维是否齐且分数在 1–10、三个判读数是否算得对、第 8 节 有没有空画面格或对不上实测点的时间、第 10 节 文案功能台账有没有、第 9 节 画面四招够不够 4 条、逐字稿来源有没有包装、时间戳有没有超出视频时长、结论里有没有越界断言(「这就是它上热门的原因」之类)、第 1 节/第 3 节/第 6 节里有没有「视频之外的世界」断言(EXTERNAL_ATTRIBUTION,见上一节那条硬规矩)、报告读不读得懂(帧号 FRAME_ID_IN_REPORT、成串英文 ENGLISH_RUN_IN_REPORT、§/程序标识符/内部文件名 TECH_JARGON_IN_REPORT——见第 5 步那五条硬规矩;同类违规会一次列全,所以一轮就能改干净)。meta.degrade 里每一项降级,报告全文都得说得出对应的话(不再限定写在哪一节)——而且说的必须是那一项的真原因:没人声 ≠ 没装 whisper ≠ 解不出音轨,原因不通用,写错照样拦。
> 不许绕过它。 门禁报什么就改什么,不许改门禁、也不许在报告里写「已通过」来假装通过——完成判定只认退出码。
7. 落成 .html(主交付物)
门禁过了(退出码 0)才渲染网页:
run md2html.py "拆解报告_<视频标题>_<日期>.md" "拆解报告_<视频标题>_<日期>.html"
输入输出用同一个名字,只换后缀——交付给用户的是一对文件(.md 源 + .html 网页),名字必须一致。
页头是自动的,不用你另带图:左边品牌标(知行FDE,内置在渲染器里;想换就 --logo <图片>)、
旁边大标题「知行FDE-出品 · 视频拆解报告」、下面一行「视频号 · 爆款拆解 · 拆解于 <日期>」、
右边「先看结论」。日期取资料卡的「拆解时间」,资料卡里没写这一行,页头就没有日期。
交付物只有这一个 HTML 文件。 七张图全部 base64 内嵌,发微信不用带文件夹,手机、电脑双击就能看:
- 首屏「视频的资料室」:由 md 的「资料卡」节解析生成(
>引用块与```card块都认),不是手写的; - 标签页:按 md 里
> 分组:…的分组名动态生成,按首次出现顺序排——脚本里没有写死哪三组; - 卡片:卡片名与一句话说明来自 md 的
> 卡片:<卡片名>|<说明>,点卡片弹窗读这一节全文,
点遮罩、按「关闭」、按 Esc 都能关; - 打印:三个标签页会自动全部展开、隐藏交互按钮。
渲染器会打印 HTML_OK 单元 N / 卡片 M / 分组 K / 内嵌图 X / Y MB,并自检「页面里没有非 data: 的图片地址」。
卡片数对不上节数(减去资料卡)、分组少于 2、体积超过 8 MB,都说明 md 那边有问题,先看告警再交付。
> md2docx.py 保留在包里,但流程里不再调用它。 它是备用工具:哪天要临时给甲方 Word,
> 手动跑 run md2docx.py "<报告.md>" "<报告.docx>" 即可(版式仍是微软雅黑 + 紫 #6020D0),
> 但要自己 pip install python-docx——默认交付、本技能的任何一步都不走它。
> 别因为不再调用就把它删掉,也别在交付物清单里提 Word。
轨道 B · 跨条公式卡(8 → 11)
单条报告回答「这条怎么办」;公式卡回答「这几条一起说明了什么」——把偶然的爆款变成能复用的配方。
什么时候走这条轨道:用户一次给了 3 条以上(或明确说「对比一下」「有什么共同规律」「这批为什么都火」)。只给 1–2 条时不要自作主张出公式卡,先问用户要不要凑样本。
8. 收集样本
把每条已过闸门②的素材包目录列出来,同账号优先(跨账号也能做,但结论只能到「行业通用」而不是「这个号的配方」)。
- 样本数 3–5 条最好,硬下限是 3。低于 3 就先多拆几条——两条视频之间的「共性」没有意义,
formula.py会直接退12。 - 用户明确只要「先看这两条」时才用
--allow-thin放行,产物会带「样本不足」标,且卡里必须保留这句话。 - 样本要能代表用户想问的那一类。挑样本、扔掉不合群的 outlier,是公式卡最常见的失真。
9. 聚合(一条命令)
run formula.py <包1> <包2> <包3> ... --out "<输出目录>"
--account v1=账号名标注分组(决定结论是「同账号配方」还是「跨账号通用」);--label起人话名字;--report ID=路径覆盖报告定位。- 退出码:
0成功;12可用样本不够或某份报告解析不出八维(回去补单条报告,不许硬写);2路径/参数错。 - 产物:
compare.md(你读这份)+compare.json(闸门读这份,别手改)。
> 报告必须与模板同版本。 如果有的条抠得出 第 10 节 台账、有的抠不出,说明它们写于不同模板版本——这时 compare.md 会给出 TEMPLATE_DRIFT 提示。老报告里那个「0」是「当年没这张表」,不是「当年没这么做」,别读成结论。
10. 写两张卡
读 compare.md(不要重读 N 份报告,那正是聚合器要替你省的事),按 @references/formula_card_template.md 写:
- 内部决策版(F1–F9,连续无空号)——给要照着拍下一条的人,保留术语与量化。原「F9 运行证据自检」那一节的内容已并入 F8 反模式,编号随重排整体 +1。
- 结论版(C1–C7,连续无空号)——给甲方/合作方看,只讲发现、依据、边界、建议,不做执行细节。C4「共性规律」的编号必须与内部版 F3「共性公式台账」一一对应。
公式台账每行一条公式,命中数必须等于证据里出现的样本数,分母永远是全部样本数。证据写成 v1§8.2@0:03"原话"(§ 后面的节号按那份报告出报告时的编号写,卡头必须写明用的是哪一套编号),原话逐字照抄报告——编一句就会被闸门③抓出来。
11. 闸门③ —— 公式卡门禁
run verify_formula.py "<内部版.md>" --conclusion "<结论版.md>" --compare "<compare.json>"
只看退出码:
| 退出码 | 含义 | 怎么办 |
|---|---|---|
0 |
命中/分母/证据/置信度/数据全部自洽 | 放行,渲染成 .html |
12 |
不达标,逐条列出 blocking |
改卡,改完重跑。最多补 3 轮 |
2 |
文件读不到或 compare.json 坏了 |
先修输入,别改卡 |
它专抓公式卡最致命的两种失真:把 1 条说成 3 条(命中 ≠ 证据数、分母自选、置信度注水、只拿 C 级样本当证据、基线表挑样本)和编造原话与时间点(引号里的话在该条报告里找不到、@时间 超出该条时长、引用了不存在的节号或样本 id)。另外还核:数据有没有改数、有没有编播放量/完播率、两张卡编号对不对得上、有没有越界断言。
> 与另外两道门同样的纪律:不许绕过它,完成判定只认退出码。
过门后两份卡各自渲染成 .html:
run md2html.py "<内部版.md>" "<内部版.html>"
run md2html.py "<结论版.md>" "<结论版.html>"
公式卡也是 md,渲染器一样认。想让它分组好看,就照第 5 步给每个 ## 标题补
> 卡片: / > 分组:;不补也能看——卡片名会用节标题(F1 一句话总公式…)、全部归到一组。
公式卡没有「资料卡」节,首屏资料室会留空并打印一条告警,这是正常的。
轨道 C · 二创脚本(12 → 13)
12. 给方向池(不做关卡,直接往下走)
主报告 第 7 节 给 6 到 8 个二创方向(宁可 6 个真的,不要 8 个假的),编号 D1–D8,
按换皮 / 换骨 / 借势三类各排 2–3 个,每个方向标:改动幅度 / 命中机制 / 资源需求 / 成本 / 潜力,
并逐个过三道闸门(不过闸门的不许留在池子里)。
不光给方向,还要给「你适不适合抄」(第 7.1 节)——一律写成条件式:
「如果你是做 X 的,建议主攻 D1/D3,要动哪里,别碰哪里」。不许写成「你是…」的断言
(我们不知道读报告的人是谁),更不许在拆解开始前问用户的行业 / 赛道。
> 方向池不是关卡。 2026-10-14 之前这里会停下来等用户勾选方向;现在不停——
> 用户的反馈是「拆解报告就是为了二创,不然为什么要拆解呢」。停下来等确认,
> 散户十有八九就停在这儿不回来了。方向池的作用变成了「不喜欢就换」的菜单,不是「必须先选」的门。
13. 出二创脚本成品(报告之后出,直接出,不等确认)
按 @references/recreate_script_template.md 出一条默认档成品,四块、别多写:
溯源表(这条脚本每一段是从原片第几秒长出来的)+ 可照念口播填空稿(带时间轴与气口)+ 分镜表 + 发布包装。
默认档 = D1(换皮):保留原片的结构与节奏,把题材、工具和全部事实数据换掉。
理由:六到八个方向里只有「换皮」在不知道用户是谁的前提下也大概率合适,
其余方向都押注在某一种具体处境上。成品开头一行必须标清「这条是给谁写的」
(照 第 7.1 节那张条件式表的口径),并写一句「想换方向说一声,按 D 编号点」。
用户点了别的编号,再出第二条。
交付顺序:报告在前、成品在后(先讲清楚「凭什么」,再给「拿去用的」)。
两份一次交齐,不用等任何人回话。
> 用户 2026-10-19 拍板改的:此前写的是「成品在前」,实际跑下来 WorkBuddy 会先把二创递出来,
> 拆解报告反成了附页。报告是主交付物,必须第一份递。
> 不许写:立项回执(八维打分)、方案头部那串字段、声音设计 / 配乐建议(尤其是可粘贴的英文 AI prompt)、
> 发布前合规自检回执、拍摄优先级与排期。用户 2026-10-14 明确只加「发布包装」。
> 合规红线看主报告里的「平台规则备忘」,排期看主报告 第 7.1 节——同一件事不写两遍,
> 写两遍就会出现两份说法对不上。
原则是学结构不搬事实:框架沿用原片,事实与数据全部换成用户的,数据位留占位符不许编。
溯源表里指不回原片实测时间点的段落,就是编的,删掉。
成品同样出 HTML,但要显式换抬头(不换的话页头会冒充「视频拆解报告」):
run md2html.py "<二创脚本.md>" "<二创脚本.html>" --title "知行FDE-出品 · 二创脚本"
脚本里必须先有「资料卡」节(```card 围栏,含 原片标题 与 拆解时间)——
首屏和页头那行日期都从它读;每个 ## 节下面要有 > 卡片:… / > 分组:… 两行,
否则卡片名和标签页会退化成告警。骨架见 references/recreate_script_template.md。
三道闸门(为什么必须有)
文字纪律写在文档里,助手漏读就等于没有;退出码是机器判的,骗不过去。所以:
- 闸门① 在写之前:素材不全就先补素材,堵住「拿采样当全景、按时长猜画面」。
- 闸门② 在交之前:报告不许自己说「我写全了」,由脚本逐条核。
- 闸门③ 在出公式卡之前:横向结论不许把 1 条说成 3 条,引用的原话与时间点必须回查得到。
三道门都过了,才能说这份拆解做完了。
三道门的分工是刻意的:①管素材,②管单条报告,③管跨条结论。
中间那道不能省——formula.py 只认「过了闸门②的报告」,跳过闸门②会污染整张公式卡的底账。
降级链(必须如实告知,不许假装满配)
| 缺失 | 降级方式 | 报告里要注明 |
|---|---|---|
| 无 ffmpeg | 无法抽帧,明确告知用户不可用,给安装命令 | 阻塞,不出报告 |
| 系统没有 ffprobe | 退到解析 ffmpeg -i 的 stderr 拿时长/分辨率(精度到 0.01 秒) |
✅ 标注 probe_via_ffmpeg_stderr |
| 探不到时长 | 已中止,退 4 | 不产出报告 |
| 无 whisper 且已尽力安装仍失败 | 逐字稿改由助手读帧图里的烧录字幕 | ✅ 标注「逐字稿来源:烧录字幕视觉读取」 |
| 音频里没有人说话(whisper 装好、也跑通了,只是 0 段:纯音乐 / 纯音效卡点片) | 逐字稿为空,文案只能从屏幕文字读 | ⚠️ 资料卡那一行必须如实写「无(音频里没有人声,文案改由画面文字读取)」。不许写成「未装 whisper」或「识别失败」——那是假话,degrade 码不同,闸门② 会拦 |
| 视频无音轨 | 跳过响度分析;逐字稿必然为空 | 标注「本条视频没有音轨」(同样不许说成「未装 whisper」) |
| 有音轨但解不出音频 / 语音识别运行时报错 | 同「无 whisper」:改读屏幕文字 | ✅ 如实写明是哪一种(解不出 / 报错) |
| 无烧录字幕且无逐字稿 | 只能做画面/结构拆解,文案维度留空 | ⚠️ 显著标注「本报告无逐字稿,文案类结论不可用」 |
显式用了 --max-frames |
只覆盖部分镜头 | ⚠️ 分镜表表头写明「本文只覆盖 N 个镜头,其余 M 个未采帧」,门禁会按此校验 |
| 拿不到互动数据(视频旁无 sidecar) | 资料卡只能写「数据缺失」 | ✅ degrade 记 no_platform_stats;想要数据就把这条的分享链接交给本技能重新下载一次(会顺带取回 .stats.json) |
| 首次吃分享链接但用户不便扫码 | 下载做不了,改用本地 mp4 入口 | 标注「本条未取到平台互动数据」 |
| 拆的是别人的片子(未获授权) | 不阻塞,--source public(默认档) |
✅ 只在 meta.json 的 source.label 留机器底账;报告里不写版权归属(但资料卡的「视频来源」要写全链接) |
| 全片近于一段长镜头(四档场景阈值都切不开:切点 <5 个,或有镜头长过全片 40%) | 不阻塞,按试出来最细的一档原样保留 | ✅ degrade 记 scene_ladder_exhausted;第 8 节 要写明「全片近乎一段长镜头,分镜表只能给到这个粒度」——否则那几个镜头看着像全貌,读者不知道是切不开 |
| 某条报告与当前模板不同版本(抠不出 第 10 节 台账 / 第 4 节 前 3 秒) | 该列在 compare.md 里留空,不参与横向对比 |
⚠️ compare.md 会报 TEMPLATE_DRIFT;卡片 F9 样本局限里要写明这一列比不了,别把缺失读成 0 |
| 公式卡样本不足 3 条 | 只出对比、不出公式 | ⚠️ 产物强制带「样本不足」标;用户坚持要才用 --allow-thin,且结论只能写「倾向」不能写「共性」 |
绝不允许:逐字稿缺失时靠猜写「原话」,或把推测的时间点写成实测值。有降级必须在报告里如实说明是哪一项、为什么——meta.degrade 里每一项都要在报告全文里找得到对应的话。
边界与注意事项
- 必须有能读图的助手宿主(WorkBuddy 即是)。
dissect.py只产素材包,报告是助手 Read 帧图写出来的(分批并发,6–8 张一批)——只用裸 Python 走不完这条链路。 - 视频号链接必须有登录态才能解析,没有免登录路径;首次要用户本人扫腾讯元宝的码。助手不代替登录、不索要密码 / Cookie / 票据。
- 下载前不询问权属(产品决定:用户把链接丢过来就跑,不再弹一个确认)。代价要说清楚:这个包因此是个「能拆任意公开爆款」的工具——发出去之前你得知道这一点,别以为它只吃用户自己的片子。
- 管束落在产物上:
--source写进meta.json的source.label留机器底账。报告里不再出现来源声明(用户拍板)——只指版权归属,资料卡的「视频来源」照常写全链接,要回看某份拆解拆的是谁的东西,就去读素材包的meta.json。 - 不拆私密、付费、已删除内容。
- 全程本地:不调用外部模型、不要求模型 API Key、不上传视频到任何服务器。
- 默认满配意味着帧数 ≈ 镜头数(长镜头更多),读图耗时与镜头数成正比——所以务必分批并发读;读帧前先按成本护栏报账,K > 150 时必须让用户选,不许静默降档。
- 长视频(> 15min)转写耗时较长,先告知用户预计时间。
- 拆解结论是基于画面与文案的推断,不等于平台真实推荐算法归因;不得宣称「这就是它上热门的原因」。
- 适配判断一律写成条件式,不在拆解开始前询问用户的行业 / 赛道(产品决定,用户 2026-10-14 拍板)。理由:散户把链接丢过来就该拿到报告,多问一句就多一个放弃的岔口;而受众与适配本来就可以从画面与文案本身读出来。所以受众与适配一律写成条件式或画面事实:「你适不适合抄」写进 第 7.1 节的条件式表,勾选权留给读者(第 7.2 节给可填写的确认栏);真要写「这条片子在对谁说话」,也只写称呼方式、举例处境、前提门槛这类看得见的证据,不许写年龄段 / 性别 / 城市 / 收入这些人口统计特征——那是编的。(附录 C.1 已随附录一起取消,这块判断并进 第 7.1 节。)
- 第 1 节 / 第 3 节 / 第 6 节 只许写画面与文案本身能证明的东西——这三处是对本条下判断的地方,凡是需要视频之外的世界才成立的判断一律不写:来源平台与出处归属(「这是微博/X 上的」「原作者是…」)、原帖/原作者/原视频是不是热门、搬运、热点窗口期、首发/首创、发布日与外部事件的时间差、受众普及度(「中文观众大多是第一次听说」)、与其他账号或同类内容的对比。单条视频没有对照组,外部断言无从核验,写上去看着精确、实际是猜测当结论。同一条画面被读错平台这类事也归在这条里:拿不准画面上是什么,就写看得见的(「一张自带出处的截图,画面里有账号标识、发布日期、浏览量、互动数」),不要替它认平台。闸门② 的
EXTERNAL_ATTRIBUTION会退 12。 - 报告质量取决于素材清晰度;画面糊、无字幕、纯 BGM 无口播的视频,报告会明显变薄,须提前说明。