SuperAPI AI 工具集

video-intake

设计与创作

查看项目

更新于 10-21 06:41

技能介绍

用途:Video intake 是整套剪辑技能包的入口环节,目标是把一段原始的口播录像(raw talking-head recording)整理成一个统一的视频文件夹。该文件夹包含:一次剪辑后的 take、词级时间戳、每一视频帧对应的人脸帧,以及起始页面(starter page)所需数据。之后的其他剪辑技能都基于这个文件夹继续工作。

主要能力与流程:

  1. 输入收集:先要求三样东西并等待——原始手机或相机录像文件(竖屏最佳);脚本(如有,但以实际录制内容为准,字幕跟随实际所说);外观设定(品牌 hex 色值与字体,默认白色、墨色 #1d1d1f、强调色 #0071e3、SF Pro 或 Inter)。

  2. 文件检查:使用 ffprobe 检查编码、宽高、起始时间与旋转标记。旋转标记意味着画面需要旋转,需在首次编码时固化;存在两条音频流(iPhone 空间音频)时只映射第一条(-map 0:a:0);音频比画面晚超过 0.02 秒会漂移,需用 -itsoffset 修正;宽大于高且无旋转标记即为横屏文件,第 6 步会裁掉中间部分。

  3. 词级时间戳转录:先用 ffmpeg 提取单声道 16kHz 音频,再用本地 Whisper(pip install openai-whisper,whisper audio.wav --model small.en --word_timestamps True --output_format json)获得带词时间戳的转录。

  4. 选段与剪切:通读整个转录,同一句保留最后一个完整 take;口头上被否决的 take(如“scratch that”“let me start again”)与咳嗽删去,笑声保留。所有停顿压到 0.15–0.2 秒,除刻意留白外不留超过 0.25 秒的静音。只在真正静音处剪切,绝不按转录的词时间剪(Whisper 会把词拉伸到停顿上),用 silencedetect(noise=-50dB:d=0.2)在音频上找真实静音,找不到则提高阈值(如 -45dB),在词内找到则降低;检查词尾,因为“s”可能比转录标注的词尾多出 0.3 秒的气声。周围没有静音的填充词无法干净切除,保留。所有剪切边缘对齐到帧网格(1/30 秒整数倍),每个音频接缝两侧各加 30ms 淡入淡出以防爆音,使用固定增益而非归一化。把保留区间写成 my-video/segments.json([[start, end], ...],单位为原始秒),用 ffmpeg trim/atrim 与 concat 构建剪辑,剪辑音频保存为 my-video/cut-audio.wav(起始页面播放该文件)。

  5. 对剪辑后音频再次转录:在 cut-audio.wav 上重跑第 3 步,字幕与所有按词时间的动作都使用这些时间戳,因为原始时间戳在每次剪切后会漂移。通读保留的词,确认没有重复、没有指向观众尚未听到内容的表述;Whisper 常把原始 take 中重复的行合并成一个长词,重复只在此处显现,发现后回到第 4 步剪掉并重跑本步,直到文本只读一次。随后手工修正 Whisper 识别错误的词(人名、产品名、评论关键词),删除末尾零长度词。

  6. 建立视频文件夹:mkdir -p my-video && cp -R <this skill>/starter/. my-video/,再用 ffmpeg(fps=30, scale=1080:1920 等)导出逐帧人脸图到 my-video/face/%06d.jpg。然后从剪辑后转录写出 my-video/words.js(每个词 { w, s, e }),并在 my-video/video.js 中设置 duration 与 faceFrames,faceFrames 必须等于 face/ 中 jpg 数量,偏差超过一说明剪切边缘未对齐帧网格。起始页面自带演示 beats 与演示 hook,需替换:一个从 0 到结尾的人脸 beat,以及自己的 hook 行(或 hookEnd: 0 表示无)。在 Chrome 中打开 my-video/index.html?render&t=3 可查看任意帧,不带 ?render 打开点击播放有声版本。

起始页面机制:index.html 是引擎,不可编辑;它仅靠 seek(t) 绘制任意时刻,因此每帧渲染结果一致。video.js 是编辑层,每个 beat 有三种布局:face(全脸)、split(上方一个对象、下方人脸卡)、full(仅图形)。字幕固定在同一白色胶囊内,y=962,所有 beat 一致,y 930–1040 区域需留空。hook 显示期间(t < hookEnd)字幕隐藏。超过最后一个 beat 的时间显示最后一个 beat。引擎已定义 clamp、prog、easeOut、spring、wordAt、$ 与 pad,直接使用,不可重复声明,否则第二个 const clamp 会导致 seek is not defined 使整页停止。wordAt('every') 返回某词首次出现时间,查后续出现可传搜索起点如 wordAt('every', 5)。在完整渲染前可用 node render.mjs --stills 0.5,3,5 查看静帧。要编辑长 take 的某一段,可建立 section 文件夹:把 cut-audio.wav 裁到该段、复制人脸帧并从 000001 重新编号、平移词时间使该段从 0 开始。render.mjs 逐帧拍摄并编码成各平台通用的 MP4(npm i puppeteer,然后 node render.mjs),加 --format linkedin、square 或 wide 可获得其他尺寸。

适用场景:口播类短视频(如 reel)的预处理与结构化整理,适合需要词级字幕、逐帧人脸卡和可重复渲染流程的剪辑工作流。

限制与注意事项:以实际录音而非脚本为事实来源;每个场景应在其短语结束后约 0.1 秒处结束,不要在词中间切断;不要信任接缝处的转录,每个接缝都要亲耳听。除上述内容外,价格、平台兼容性、具体效果等信息暂未提供。