无人短视频生成器 是做什么的?
你从主题制作一个完整的竖屏短视频:脚本、配音、单词同步字幕、动画镜头、音效和音乐,渲染为 MP4。一切都是代码:Canvas 绘图、无头 Chrome 捕获、ffmpeg、本地 Kokoro 语音、本地 Whisper 单词时间戳、numpy 音频。没有 AI 图像或视频,没有 API 密钥,没有 Credits。
SKILL = 此文件所在的文件夹。项目文件存放在 ~/faceless-shorts/<short-name>/。
| 风格 | 功能 | 时长 · 宽高比 |
|---|---|---|
深度潜入 3D deep-dive | 旗舰风格,类似 Zack D. Films:雕塑般的 3D 人物在阳光明媚的场景中,发光的 X 光身体,穿过血管的镜头,浅景深。"如果……会发生什么?" 身体和科学 | 30-45 秒 · 9:16 |
黑夜档案 3D night-file | 未解之谜 / 真实犯罪:昏暗的 3D 场景仅有一盏灯,无脸人物(主体发出红光),打字机日期,案件档案插入 | 30-45 秒 · 9:16 |
内部揭秘 inside-out | 扁平 2D "如果……会发生什么?" 解说:一个简单的主角,X 光剖面,粗体 1-3 个字幕,干脆的剪辑 | 25-40 秒 · 9:16 |
火柴人故事 stick-story | "如果你……会怎么做?" 生存步骤:带有表情眼睛的火柴人,扁平房间日/夜,金色步骤卡 | 30-45 秒 · 9:16 |
纸制地图集 paper-atlas | 纸质剪裁的历史:羊皮纸地图,深红色路线,金色日期缎带,时代人物 | 30-45 秒 · 9:16 |
趣事 3D tall-tale | 有趣的真实故事:扁平 2D 卡通人物(大头圆脸,墨水轮廓)在阳光明媚的 3D 小镇世界中表演,镜头始终运动,单字字幕 | 40-60 秒 · 9:16 |
选择哪种风格:身体 / 健康 / 科学 "如果……会发生什么" → 深度潜入 3D (或 内部揭秘 以获得更轻、更快的 2D 外观) · 诡异、未解、真实犯罪、"1971 年发生的这件事" → 黑夜档案 3D · 生存、生活技巧、"你应该这样做" → 火柴人故事 · 历史事件、"X 是如何发生的" → 纸制地图集 · 有趣或聪明的真实故事、骗局、漏洞、"这家伙做了 X" → 趣事 3D。如果不明显,询问一次。
每个风格 = styles/<style>/style-sheet.png(一种图像展示外观,由风格自己的代码绘制)+ STYLE.md(规则 + 引擎手册)+ example/(一个可直接渲染的完整项目)。在计划之前,请完整阅读该风格的 STYLE.md。
0. 在计算机上首次使用
bash SKILL/scripts/setup.sh 直到它打印 All set(检查 Node 22+、ffmpeg、Chrome;构建 ~/.faceless-shorts/venv;下载 Kokoro 语音 ~340 MB 和 Whisper small.en ~0.5 GB)。使用免费官方方式安装任何缺失的组件,对于需要密码的任何操作要询问。然后 bash SKILL/scripts/selftest.sh 必须打印 SELFTEST PASSED:打开联系表(contact sheet)并截图其名称和外观查看。
1. 需求收集(一条消息,默认值已填好)
一次性询问所有未知信息:主题(或 "你选 3 个想法")、他们喜欢的短视频格式的链接(可选)、时长(默认 ~30 秒)、语音(SKILL/scripts/py SKILL/scripts/voice.py --list;默认 am_michael)、配音模式:AI 语音(默认)· 他们自己的录音(他们看过脚本后录音;words.py --audio)· 仅字幕(尚无语音;estimate.py)、音乐(内置背景音乐 · 无音乐 · 他们自己的免版税文件)、结尾标语 / handle。"开始吧" = 默认设置。
2. 计划(一个屏幕,然后等待)
显示:标题 · 完整的旁白,每行一个剪辑,带有其字幕块(如果 *你 | 吞咽 *口香糖?) · 镜头列表,每行一个(我们看到什么,什么移动,它落在哪个单词上) · 你将添加到工具包的新组件(如有) · 事实及其来源。询问 "开始构建?" 并等待。
脚本规则。 按照一个人实际和朋友交谈的方式编写:完整、流畅的句子,带有连接词("好吧"、"当"、"但是"、"所以"、"这意味着"),而不是一个简短的类似字幕的陈述列表。35 秒大约 90-110 个单词。一行是一个剪辑,而不是一个句子:将每个句子在自然停顿处(逗号、"和"、"当")拆分为 1-3 行,这样图片每 1.5-3.5 秒变化一次,同时语音保持流畅(voice.py 一次说完整个句子)。结构:钩子问题,然后升级,一个神话或惊喜,一个转折("但是如果你……"),一个有力的最后一行以循环结尾。按所说方式写数字("七")。在心里大声读出来:如果听起来像字幕,重写。仅原创写作:采用你喜欢的格式,但绝不使用其他创作者的脚本或镜头。每个事实都要对照可靠来源进行核查(在 script.json "sources" 中列出)。健康话题:准确,无血腥,无恐怖错误信息。
3. 构建
bash SKILL/scripts/new_video.sh <style> <short-name>将示例复制到~/faceless-shorts/<short-name>/。- 编写
script.json(行 + 字幕 + 间隙;参见 STYLE.md)。 - 时间同步:
SKILL/scripts/py SKILL/scripts/voice.py <proj>然后SKILL/scripts/py SKILL/scripts/words.py <proj>(自己录制:words.py <proj> --audio their.m4a;仅字幕:estimate.py <proj>)。 - 重写
src/shots.js:每行一个镜头(对于长行可以是两个),每个使用cut(i)放置,并在单词上使用Wd('word', line)放置关键时刻。重用工具包(src/core/kit.js);在那里以风格的外观添加新组件。 - 在项目中:
node tools/capture.mjs check(必须显示 CHECK OK)→node tools/capture.mjs cues→SKILL/scripts/py tools/mix.py .→ QA(第 4 节)→node tools/capture.mjs video renders/<name>.mp4。 迭代一个镜头:node tools/capture.mjs frames review/f "4.2,4.6"并查看。
4. QA:绝不展示你没有看过的帧
node tools/capture.mjs sheet review/all.jpg 0.5 10(每 0.5 秒一帧,带时间戳)并阅读整个联系表,然后全尺寸查看关键帧。对于每一帧询问:
- 它有意义吗? 每个镜头一种视觉模式:如果身体是 X 光,那么 ALL 都是 X 光(X 光身体上没有衬衫袖子)。道具随握持它们的东西移动(口香糖在手到达嘴之前一直留在手中)。没有任何东西在其原因之前出现。
- 它在那一刻与旁白匹配吗? 图片在其行之前变化;揭示落在其单词上。
- 有任何碰撞吗? 移动的东西不会意外穿过标签、药丸、字幕区域(y 1250-1550)或彼此。
- 字幕: 1-3 个单词,确切地一个黄色单词,拼写正确,正在被说出的单词上,在手机上可读。
- 风格表: 仅调色板,平面形状,X 光视图为青色,危险为红色。
- 声音: 语音清晰,音乐不干扰;音效柔和(无刺耳的滴答声或哔哔声)。 修复,重新渲染联系表,重新检查。告诉用户你发现并修复了什么。
5. 交付
为用户打开 MP4。另外提供:如果 > 35 MB 则提供分享副本(ffmpeg -i in.mp4 -c:v libx264 -crf 21 -preset slow -c:a aac -b:a 160k -movflags +faststart share.mp4)、最佳封面帧(capture.mjs frames)、标题、字幕和 5-8 个话题标签。对于自己录制模式,还要给他们脚本及其每行的时间以便对照朗读。提供一轮精确修改并仅重新渲染已更改的内容。
5b. 通过 Zapier 发布到 YouTube(仅当用户要求上传时)
所有调用都是代码模式工具:在 execute 内部作为 tools.zapier.* 运行(不要作为普通工具调用)。在真实上传中已验证一次;下面的值是确切的。
- 连接。 如果
list_zapier_skills有一个用于上传的已保存技能,则使用它。否则确保 YouTube 应用已启用:discover_zapier_actions({ app: "YouTube" })→enable_zapier_action({ selected_api: "YouTubeV4CLIAPI", app_display_name: "YouTube", action: "upload_video" })。 如果尚不存在连接,manage_zapier_connections({ selected_api: "YouTubeV4CLIAPI" })会返回一个连接 URL 供用户使用。 - 托管文件。 该操作的
video/thumbnail参数需要一个 Zapier 服务器可以获取的 URL;本地路径会静默出错。 将 MP4 放置在临时托管上,按此顺序(所有已于 2026-11-03 测试;在 Windows 上使用curl.exe):- a. litterbox(1 小时到 72 小时过期,最大 1 GB):
curl -F "reqtype=fileupload" -F "time=1h" -F "fileToUpload=@renders/<name>.mp4" https://litterbox.catbox.moe/resources/internals/api.php→ 返回直接 URL 为纯文本。 - b. uguu.se(约 3 小时过期,适合小于 35 MB 的短片):
curl -F "files[]=@renders/<name>.mp4" https://uguu.se/upload→ 返回 JSON;使用files[0].url(d.uguu.se/...链接)。 - c. catbox(永久,无过期):与 (a) 相同调用,但不加
-F "time=1h"。永久公开,因此仅限用户同意。 - 跳过这些(已确认于 2026-11-03 损坏,不要浪费重试):0x0.st(上传已禁用)、tmpfiles.org(链接是查看器页面,不是原始文件)、gofile.io(原始下载需要账户令牌)、file.io(curl API 重定向到其 Web 应用)、bashupload.com、temp.sh(已失效)。
- 始终验证 URL 后再使用:
curl -sSI <url>必须返回 200/206 并带有视频内容类型。绝不要仅信任主机的 JSON 而不检查。 - 告诉用户这会将他们的视频放在一个会自行过期的公共临时主机上。
- a. litterbox(1 小时到 72 小时过期,最大 1 GB):
- 首先确认。 这将写入用户的真实频道,因此在执行前确认:标题、可见性(private / unlisted / public)和类别。
如有必要,使用
inspect_zapier_actions({ tool_name: "youtube_upload_video", enum_property: "category_id" })解析category_id。 喜剧 = 23(Tall Tale 和 Deep Dive 的默认建议),教育 = 27,宠物和动物 = 15。 - 上传。
execute_zapier_write_action({ selected_api: "YouTubeV4CLIAPI", action: "upload_video", tool_name: "youtube_upload_video", params: { video: "<temp URL>", title, description(以 #shorts 结尾), tags: [5-8 个不带 # 号的话题标签], category_id: "23", privacy_status, made_for_kids: false, embeddable: true, notify_subscribers: true, default_language: "en", license: "youtube" } }) - 报告。 结果包含
id;链接是https://www.youtube.com/watch?v=<id>。60 秒或更短的竖屏视频会自动变成 Shorts(无需额外字段)。 为用户打开本地文件(tools.browser.preview({ path: "renders/<name>.mp4" }))并以文本形式提供 YouTube URL。应用内浏览器经常无法加载 youtube.com,显示 ERR_ABORTED;这并非上传失败。 - 缩略图。 Unlisted 上传无法通过此操作设置自定义缩略图;如果用户稍后将视频设为公开,提供保存的封面帧。
添加新风格(当用户要求时)
制作 styles/<new-style>/,包含 style-sheet.png、STYLE.md(与 Inside Out 相同的部分:外观规则、调色板、格式、引擎/工具包映射、组件、镜头结构、提示类型、QA 陷阱)和一个完整的 example/。复制 Inside Out 的 tools/、index.html、src/main.js、src/core/{lib,timing,captions}.js,然后构建新外观的工具包和镜头。共享脚本(voice、words、estimate、new_video、selftest)无需更改即可工作。在上面的表格中添加一行,并运行 selftest.sh,直到每个风格都通过。
3D 风格(Deep Dive, Night File, Tall Tale)
它们使用 headless Chrome 中的 three.js 渲染真实 3D。有显卡时速度快且质量高。没有显卡(没有 GPU 加速的笔记本电脑、云沙箱)时,在 node tools/capture.mjs ... 前面添加 SOFTWARE_GL=1 QS='&res=0.6&aa=0&shadow=1024' FPS=24 进行渲染(约每帧 2 秒;提前告诉用户渲染时间,在后台运行,并先使用 sheet review/all.jpg 1 10 进行 QA)。它们的 STYLE.md 文件列出了 3D API。
绝不能
使用 AI 生成图像或视频;花费用户的钱或 Credits;未经用户请求和确认上传到 YouTube 或任何主机;复制其他创作者的脚本、镜头或帧;未经询问覆盖用户的项目;交付未经检查的帧。