--- name: skill-video-lapian description: 平台级短视频拉片技能:下载→转写→抽帧→方法论逐段分析→HTML报告→S3个人空间发布。动态身份参数(每个数字生命用自己飞马身份/S3空间),零硬编码。触发词:拉片、拆解视频、逐帧分析、视频复盘。 --- # skill-video-lapian — 平台级拉片技能 > 命名规则(全平台技能遵守): `skill-<领域>-<功能>` > skill-video-**lapian** = 处理 **video**, 功能是 **拉片**(逐段逐帧拆解)。 > 本技能是**平台级**: 任何数字生命克隆本仓库后, 用**自己的身份参数**即可跑全流程, > 产物发布到**自己的** S3 个人空间。**零硬编码凭据**。 ## 何时用 - 用户发来抖音/短视频链接说「拉片 / 拆解 / 逐帧分析 / 复盘这条为什么火」 - 编导知识库沉淀: 把爆款视频拆成结构+技法+可复用模板 - 批量研究某账号/某赛道的内容打法 ## 前置条件(生命周期初始化时配好) ```bash # 飞马身份(每个生命不同, 见各自容器 /opt/data/fmode-identity.json) export FEME_USERID=sr2WiPsDyQ # ← 换成你自己的 Parse objectId export FEME_SESSION_TOKEN="r:..." # 飞马会话 export FEME_NEWAPI_TOKEN="sk-..." # API计费token(调VOC网关/转写/模型全走它) export FEME_STUDIO_URL="http://server.fmode.cn:" # 自己的studio端点 # S3 (过渡期可用容器env; studio /api/storage/credentials 上线后自动切换) export CLOUD_SDK_AK=... export CLOUD_SDK_SK=... export S3_BUCKET=storage-s3-nkkj S3_REGION=cn-north-4 export S3_ENDPOINT=https://obs.cn-north-4.myhuaweicloud.com ``` 依赖: `python3.8+`(纯标准库, 无需 pip 装包) · `ffmpeg/ffprobe` · `node/npx`(fmode-listen) 身份参数优先级: `FEME_*` 环境变量 > `fmode-identity.json` > 兼容旧名(FMODE_*)。 **S3 只能写 `user/<自己的FEME_USERID>/` 前缀, 写他人前缀=越权。** ## 全流程(5 步, 每步可独立重跑, 幂等) ```bash REPO=/opt/data/git-repos/skill-video-lapian # 克隆后放哪都行 WD=/tmp/lapian-$(date +%s) # 工作目录 # 1. 拿视频(三选一): 抖音短链 / 视频ID / 已有本地文件 python3 $REPO/scripts/fetch_video.py --url "https://v.douyin.com/xxxx/" --out-dir $WD python3 $REPO/scripts/fetch_video.py --aweme-id 7677548065384877346 --out-dir $WD python3 $REPO/scripts/fetch_video.py --local /path/to/video.mp4 --out-dir $WD --platform douyin # 可选: 采评论区VOC(报告自动带上) python3 $REPO/scripts/fetch_comments.py --aweme-id 7677548065384877346 --workdir $WD --max 100 # 2. 转写(fmode-listen → 讯飞LFASR, 分段时间戳, 毫秒) python3 $REPO/scripts/transcribe.py --workdir $WD # 3. 抽帧+豆包视觉逐帧点评(计费可控: --fps/--max-frames, 或 --skip-vision 只抽帧) python3 $REPO/scripts/frame_analysis.py --workdir $WD --fps 0.15 --max-frames 12 # 4. 生成报告(暗色主题/手机自适应/分段点击跳转播放/词频情绪/VOC/相对路径) python3 $REPO/scripts/build_report.py --workdir $WD --title "拉片分析:XXX" # 5. 发布到自己的S3个人空间 → 得公开URL python3 $REPO/scripts/publish.py --workdir $WD # → https://s3.fmode.cn/user//report/lapian/douyin//report.html ``` ## 产物结构(S3 路径规范, 全英文小写) ``` user//report/lapian/<平台简称>// ├── report.html ← 报告入口(资源全部相对路径, 目录自包含) ├── video.mp4 / audio.wav / transcript.json ├── frames/f0001.jpg... └── assets/ # analysis.json / comments.json / meta.json ``` 平台简称映射: douyin / xiaohongshu / weixin / bilibili / tiktok / kuaishou / shortdrama。 发布后对每个产物做 HEAD 校验, 全 200 才算成功。 ## 报告包含 1. 原视频播放器置顶(粘性顶栏), 每段「⏵播放这一段」跳转对应时间 2. 逐段可折叠卡片: 时间戳+台词+抽帧截图(画面描述)+技法标签(导师·技法)+可复用模板 3. 整体结构表(起承转合)+核心发现 4. 词频TOP/情绪分布/语速(纯CSS条形图, 零外网依赖) 5. 评论区VOC: 正/中/负分布+高赞TOP5+每条洞察 6. 3 条可执行建议 ## 分析依据 - `references/methodology.md` — 薛辉/郑经说/三把刀/小希/南门 技法表(点评提示词的来源) - `references/voc-api.md` — VOC 网关接口(搜索/详情/评论, 解析层级与坑) - `references/s3-upload.md` — S3 发布规范(virtual-hosted/ACL/相对路径/凭证回退) ## 实现要点(读脚本前先看) - `scripts/common.py` — 身份参数解析/VOC调用/S3 SigV4 纯stdlib实现(不依赖boto3, OBS必须virtual-hosted寻址) - `scripts/build_report.py` — 内置 mini-Jinja(stdlib), 无需安装 jinja2; LLM 点评失败自动回退规则启发式, 永不中断流程 - 转写短路: transcript.json 已存在则跳过(转写按分钟计费, 别重复花钱) - 视频下载完整校验: ffprobe 时长异常即报错, 禁止截断件进入分析 ## JS/ESM 演进方向(JSS, 2026-08-30 起) 核心函数逐步 JS/ESM 化(`js/` 目录, 纯 ESM 零依赖, Node/浏览器双端), Python 只保留必须的系统级操作(ffmpeg/网络/文件IO): - `js/type_classify.mjs` — **JSS-01 类型预判**: 拉片前先判类型。特征打分制(标签3分/标题2分/口播1分/节奏指纹2分/AIGC强制信号4分), 类型体系见 TYPES(aigc_music/aigc_shortdrama/aigc_animal/talking_head/vlog/drama/food/knowledge), 输出 `{primary, mode}` → mode 路由: `lapian`(方法论文拉片, 原流程) | `aigc_storyboard`(AIGC分镜仿制拉片, 新流程)。CLI: `node type_classify.mjs workdir` → classify.json - `js/aigc_storyboard.mjs` — **JSS-02 AIGC分镜+仿爆款长提示词**: ①歌词结构检测(detectLyricStructure, 段落优先级: sections.json 人工精修 > 自动检测) ②视觉注册表(人物/场景/风格词频提取) ③分镜表合成(shot×frame×lyric, 每镜含 remake_prompt 生词提示: 主体|场景|运镜|风格) ④六维评分 ⑤buildLongPrompt 生成可直接投喂 AIGC 创作智能体的长提示词({{核心人物}}/{{核心产品或概念}}占位符换皮复刻)。CLI: `node aigc_storyboard.mjs workdir` → aigc_remake.json + aigc_prompt.md - `js/aigc_report.mjs` — **JSS-03 AIGC拉片报告**: 暗色HTML, 分镜卡片(逐镜截图+生词提示+AI痕迹), 注册表/结构表/评分/长提示词/VOC全展示。CLI: `node aigc_report.mjs workdir` → aigc_report.html AIGC 拉片流程(mode=aigc_storyboard 时): 场景检测(`select='gt(scene,0.10)'` 双阈值, AIGC渐变转场阈值要低于真人剪辑) → 逐镜中点抽帧 → 批量视觉点评(4帧/批, AIGC专用提示词: char/scene/shot/style/aigc/desc 六字段) → 能量高潮分析(astats RMS 找副歌位) → 台词+唱段合成 sections.json → JSS-02/03。 ## 交付规范(硬性, 2026-08-30 用户确认) - **唯一标准交付 = 报告发布到用户 S3 个人空间(公开读) + 群里发公开链接**。不发文件附件(.md/.html 直传文件不是交付, 用户明确拒绝)。 - **对外链接 host 必须是 `https://s3.fmode.cn/`, 严禁用 OBS 原生域名 `storage-s3-nkkj.obs.cn-north-4.myhuaweicloud.com`** —— 报告的相对路径资源(iframe视频/截图/数据)只有经 s3.fmode.cn 反代才能被浏览器正常加载, OBS 原生域名的链接在浏览器里会加载异常。此规则 2026-08-29 用户已沟通, 任何"公开URL生成点"(public_url/publish脚本/临时拼URL)一律走 s3.fmode.cn。上传/签名的 host 仍是 OBS 原生(协议层), 只有**对外分发的链接**用 s3.fmode.cn。 - 发布是流程必经步(第5步), 发布失败 = 流程未完成: 必须修复发布通道后重试, 或明确告知用户"发布被阻断+原因", 不得静默改用文件附件兜底。 - 链接格式: `https://s3.fmode.cn/user//report/lapian/<平台>//<报告名>.html`(口播流程 report.html / AIGC 流程 aigc_report.html)。发布后必须逐产物 HEAD 200 校验通过(校验也用 s3.fmode.cn!)才算完成, 校验通过才发链接。 ## 坑(实测) - VOC 网关 401 先查 token 是否 `sk-` 开头且 Bearer 前缀完整 - OBS path-style 上传报 `VirtualHostDomainRequired` → bucket 必须放进 Host - urllib 对该网关要先设 UA(默认 UA 偶发被 WAF 拦, curl 不拦) - fmode-listen 是异步转写, 长音频耐心等(脚本已设 30 分钟超时) - 豆包视觉模型: 用 `doubao-seed-2-0-pro-260215`(当前账号唯一可用豆包pro), DeepSeek 系无视觉 - 同一视频当天重跑: publish.py 幂等覆盖同日期目录, 直接重传即可 - **抖音下载铁律(2026-08-29 三次坏文件实测)**: `play_addr` 流对非APP客户端返回**损坏流**(moov 声称259s但 mdat 截断, ffprobe 时长正常但解码报 Invalid NAL unit size)。**必须用 `download_addr.url_list[0]` + curl 带浏览器UA/Referer 下载**(该流是高码率 1958kbps 版本, 时长可能与 play 版差几秒)。**唯一可信校验 = `ffmpeg -xerror -i 全量解码`, ffprobe 时长正常/尾部分段解码都可能假阴性**。下载会话中断后转写/抽帧全部作废重跑(音频只覆盖已下载部分)。 - **孤儿进程陷阱**: 会话中断后下载进程可能还活着继续写文件, 恢复会话先 `ps aux | grep fetch_video` + 隔几秒对比文件大小, 确认没有写入者再动手, 避免双写或误判。 - **报告点评 LLM 空响应**: build_report.py 内置 call_llm 走 deepseek-v4-flash 会路由到 reasoning 模型, reasoning 吃满 max_tokens 导致 content 为空。解法: 自己(编排 agent)按 methodology.md 逐段写点评 → 写 `workdir/llm_out.json`(格式: `{"segments":[{"i","techniques","func","comment","reuse"}...], "structure_summary"}`) → build_report.py 自动优先采用(手动 > LLM > 启发式)。 - **S3 发布的 storage API 是设计稿未部署**(2026-08-29 实测): `/api/storage/credentials`、`/api/storage/upload` 在 443 网关与各 studio 端口全部 404, fmode-identity.json 也无 CLOUD_SDK_AK/SK。**用跳板机通道: `scripts/publish_via_obs.py`** — 容器打包 → SFTP 到 server.fmode.cn(139.159.253.131) → 云端 obsutil(`/opt/obsutil/obsutil_linux_amd64_5.4.11/obsutil`, 自带 nkkj 主账套 AK/SK, `cp -acl=public-read -e=obs.cn-north-4...`, 旗标别加 `-p -f`) → OBS 公网 HEAD 校验。paramiko 连云服务器偶发 SSH banner 瞬断, 脚本已带重试。注意容器 tar 打包时 assets 类文件本地在根目录、需 arcname 映射到 assets/ 前缀。