chengfeng-visual

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

画面(分镜)

Visuals (Storyboard)

这是一件事,不是流程的一段。 用户什么时候喊它就什么时候做,改完剪辑可以回来再做。
前提只有两个:账本和字幕已经存在(层按字幕屏放、时间从账本算)。
text
需要   edit-list.json、transcript.json、subtitles.json
产出   visuals.json + modules/<序号-名字>/index.html
干完就停,不指挥用户下一步
先读取并执行 业务 Skill 的阶段合同。 模块写法的硬规矩见 模块契约, 判断规则见 画面判断
This is a standalone task, not part of a workflow. Do it whenever the user requests, and you can come back to it after editing is revised.
There are only two prerequisites: the edit list and subtitles already exist (layers are placed according to subtitle screens, timings are calculated from the edit list).
text
Requires   edit-list.json, transcript.json, subtitles.json
Outputs    visuals.json + modules/<sequence-name>/index.html
Stop once done, do not instruct the user on the next step.
First read and execute the Business Skill Phase Contract. Hard rules for module writing are in Module Contract, judgment rules are in Visual Judgment.

0. 就绪

0. Readiness

先执行 检查更新 的「就绪检查」——skills 是否 最新、Runtime 是否配套;插件根也在那里定位(本文命令里的
<插件根>
都代入 那个字面路径)。只有「就绪」才继续;「需新会话」或「停」按它的处置执行 (含「禁止自制替代界面」禁令),业务 Skill 不自带环境逻辑。
若就绪结果为
runtime.kind=desktop-managed
,直接复用桌面 App 已安装的稳定 CLI 与 同一
launchd/windows-task
服务;不要解析 Electron 路径、另装依赖或起第二个 Runtime。
First execute the "readiness check" from Check Updates —— whether skills are up-to-date and the Runtime is compatible; the plugin root is also located there (replace
<plugin root>
in all commands in this document with that literal path). Only proceed if the result is "ready"; if it's "new session required" or "stop", follow its instructions (including the "prohibit custom alternative interfaces" ban), business Skills do not include their own environment logic.
If the readiness result is
runtime.kind=desktop-managed
, directly reuse the stable CLI installed in the desktop App and the same
launchd/windows-task
service; do not parse the Electron path, install additional dependencies, or start a second Runtime.

命令

Commands

bash
node "<插件根>/scripts/ensure-running.cjs" --json
node "<插件根>/scripts/videocut-cli.cjs" visual get   <project> --json
node "<插件根>/scripts/videocut-cli.cjs" visual frame <project> --cues sub-0004,sub-0005 --count 12 --out <dir> --json
node "<插件根>/scripts/videocut-cli.cjs" visual add   <project> --module modules/01-xx/index.html --cues sub-0004,sub-0005 [--zoom x,y,w,h] [--id vis-0001] --json
node "<插件根>/scripts/videocut-cli.cjs" visual remove <project> --id vis-0001 --json
ensure-running
必须先证明 canonical 5190 属于当前平台的托管服务;失败就透传并 停止,不回退 foreground 或自选端口。
层绑字幕屏
--cues
),产品自己换算成词 id——层永远不可能绑上没人说的词, 剪辑变了层自己跟着挪。不存秒数。
bash
node "<plugin root>/scripts/ensure-running.cjs" --json
node "<plugin root>/scripts/videocut-cli.cjs" visual get   <project> --json
node "<plugin root>/scripts/videocut-cli.cjs" visual frame <project> --cues sub-0004,sub-0005 --count 12 --out <dir> --json
node "<plugin root>/scripts/videocut-cli.cjs" visual add   <project> --module modules/01-xx/index.html --cues sub-0004,sub-0005 [--zoom x,y,w,h] [--id vis-0001] --json
node "<plugin root>/scripts/videocut-cli.cjs" visual remove <project> --id vis-0001 --json
ensure-running
must first verify that canonical 5190 belongs to the managed service of the current platform; if it fails, pass through the result and stop, do not fall back to foreground or select a custom port.
Bind layers to subtitle screens (
--cues
), the product converts them to word IDs automatically —— layers can never be bound to words that weren't spoken, and layers will move automatically if editing is changed. Do not store timestamps in seconds.

四步,一步不跳

Four Steps, No Skipping

text
① 文字定任务    读 subtitles.json,按语义分段,每段回答:
               教程/演示/证明,还是概念/逻辑/过渡?
② 抽帧看画面    visual frame 抽 8-12 帧,真的用眼睛看。
               实测 12 段里有 2 段被画面推翻文字预判 —— 这步不是走形式
③ 量运动窗口    相邻帧做像素差,找出滚动/切换/操作的时刻。
               层只盖稳定窗口,圈在画面开始动之前退场
④ 做层放层     写模块 → visual add → 在预览里逐层核对
text
① Define task via text    Read subtitles.json, segment by semantics, and answer for each segment:
                         Is it a tutorial/demonstration/proof, or concept/logic/transition?
② Check frames for visuals    Use visual frame to extract 8-12 frames, and actually check them visually.
                         In practice, 2 out of 12 segments had their text-based predictions overturned by visuals —— this step is not a formality
③ Measure motion windows    Calculate pixel differences between adjacent frames to find moments of scrolling/switching/operations.
                         Layers only cover stable windows, and annotations exit before the screen starts moving
④ Create and place layers    Write modules → visual add → verify layer by layer in preview

② 的判断规则

Judgment Rules for Step ②

text
画面正是他说的东西     → 标注:圈住、说到哪个词圈哪里。真证据不许盖
画面弱相关/空白       → 小黑动画:整屏白底,从风格库做
画面自身足够清楚      → 不动。这是最常见的正确答案(实测 13 段里 4 段不动)
text
Visuals exactly match what was mentioned     → Annotation: Circle the area, circle where the corresponding word is spoken. Do not cover real evidence
Weakly related/blank visuals       → Black animation: Full-screen white background, created from the style library
Visuals are clear enough on their own      → Do nothing. This is the most common correct answer (4 out of 13 segments required no changes in practice)

③ 的产出物是数字,不是感觉

Outputs of Step ③ are numerical values, not subjective judgments

text
圈的坐标      像素统计量出来(灰度扫描找文字行),不许目测 —— 目测差过 50px
互动时刻      逐帧像素差找突变(实测一次从 4 跳到 335),圈在它之前 0.2s 退完
稳定窗口      开头常有滚动(他在找内容),层从停稳那屏的 cue 开始绑
text
Annotation coordinates      Calculated via pixel statistics (grayscale scan to find text lines), no visual estimation —— visual estimation can have errors over 50px
Interaction moments      Find sudden changes via frame-by-frame pixel differences (one case jumped from 4 to 335 in practice), annotations must finish exiting 0.2s before this moment
Stable windows      The start often has scrolling (the user is looking for content), layers start binding from the cue where the screen stabilizes

推近(zoom)用之前先想

Think Before Using Zoom

text
默认不推近。   960x720 的录屏放大就糊,用户会立刻看出来
非推不可时     ≤1.6 倍、区域取 62.5% 见方居中 —— 构图完整 > 读清小字
字太小读不清   用圈引导视线就够了;真要读清,答案是高分辨率重录,不是放大
text
Zoom is disabled by default.   960x720 screen recordings become blurry when zoomed, and users will notice immediately
When zoom is absolutely necessary     ≤1.6x magnification, select a 62.5% square area centered —— complete composition > reading small text
Text is too small to read   Use annotations to guide attention; if reading is truly necessary, the solution is re-recording in high resolution, not zooming

审阅循环

Review Cycle

模块目录用序号命名
01-daily-report
05-anim-task-split
), 时间线轨道上显示目录名,用户报号你改那一层,别的不动。
两条改层纪律,各对应一次真事故:
text
改层必查模块     层收窄/延长后,模块里写死的相对时刻不会跟着变 ——
                圈的出场时刻可能落到层结束之后,永远不出现
验收看像素      截图看画面,不查 DOM 属性。「可见性翻转正确」的 iframe
                曾经物理上不在画面里 —— 属性全对、屏幕全空
Module directories are named with sequence numbers (
01-daily-report
,
05-anim-task-split
), the directory name is displayed on the timeline track, and you only modify the layer the user specifies, leaving others unchanged.
Two rules for modifying layers, each corresponding to a real incident:
text
Always check the module when modifying layers     After narrowing/extending a layer, hardcoded relative timings in the module will not update ——
                the exit timing of annotations may fall after the layer ends, causing them to never appear
Check pixels during acceptance      Check visuals via screenshots, do not check DOM attributes. An iframe with "correct visibility toggle"
                once physically did not appear on the screen —— all attributes were correct, but the screen was blank

不许做什么

Prohibited Actions

  • 不许跳过抽帧和运动窗口直接做(两种错各犯过一次:盖掉真证据、圈悬在滚动上)
  • 不许把每段都做点什么——铺满不是目标,不动是常见答案
  • 不许存秒数、不许目测坐标、不许在白底页面上加压暗
  • 没有真实内容不许拿占位图充数
  • 风格从注册表选,不得凭空发明
  • 品牌图标用官方字形,不许手画替身(X 用两笔交叉线画过,被用户抓了)。 本地索引没有的,从 simple-icons 取单色官方 glyph(黑白风格正好配), 原 svg 存进模块目录备查;同一条片里同一品牌只能长一个样
  • Do not skip frame extraction and motion window measurement (two mistakes were made: covering real evidence, annotations hanging over scrolling content)
  • Do not add changes to every segment —— filling the screen is not the goal, doing nothing is a common correct answer
  • Do not store timestamps in seconds, do not estimate coordinates visually, do not add darkening to white background pages
  • Do not use placeholder images when there is no real content
  • Select styles from the registry, do not create them arbitrarily
  • Use official glyphs for brand icons, do not draw substitutes by hand (X was drawn with two crossed lines once and caught by the user). If not available in the local index, take monochrome official glyphs from simple-icons (the black-and-white style matches perfectly), save the original svg in the module directory for reference; the same brand must have the same appearance in the same video