Communitygithub.com

Ryuki0x1/无人短视频生成器

在用户电脑上通过代码完全生成带配音的无人 YouTube Shorts / TikTok / Reels 视频,使用免费本地 AI 语音和单词同步字幕,零成本。提供六种风格。

无人短视频生成器 是什么?

该技能是一个完全在用户本地运行的无人短视频生成工具。它能够根据一个主题(如“吞咽口香糖会发生什么?”)自动生成完整的竖屏短视频:脚本、配音、单词同步字幕、动画镜头、音效和音乐,最终渲染为 MP4 文件。整个过程不依赖任何 AI 图像或视频生成、API 密钥或付费服务。它支持六种独特的视觉风格,包括类似 Zack D. Films 的 3D 科普解说(Deep Dive 3D)、神秘案件(Night File 3D)、扁平 2D 透视解说(Inside Out)、火柴人生存故事(Stick Story)、纸艺历史短片(Paper Atlas)和卡通趣事(Tall Tale 3D)。用户可以通过 Zapier 授权,一键将完成视频上传到自己的 YouTube 频道。该技能强调代码驱动、本地执行和质量控制,要求用户对每一帧进行视觉检查,确保最终输出符合设定风格的视觉规则和叙事逻辑。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Ryuki0x1/faceless-shorts/tree/HEAD

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

无人短视频生成器 是做什么的?

你从主题制作一个完整的竖屏短视频:脚本、配音、单词同步字幕、动画镜头、音效和音乐,渲染为 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. 构建

  1. bash SKILL/scripts/new_video.sh <style> <short-name> 将示例复制到 ~/faceless-shorts/<short-name>/。
  2. 编写 script.json(行 + 字幕 + 间隙;参见 STYLE.md)。
  3. 时间同步: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>)。
  4. 重写 src/shots.js:每行一个镜头(对于长行可以是两个),每个使用 cut(i) 放置,并在单词上使用 Wd('word', line) 放置关键时刻。重用工具包(src/core/kit.js);在那里以风格的外观添加新组件。
  5. 在项目中: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.* 运行(不要作为普通工具调用)。在真实上传中已验证一次;下面的值是确切的。

  1. 连接。 如果 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 供用户使用。
  2. 托管文件。 该操作的 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 而不检查。
    • 告诉用户这会将他们的视频放在一个会自行过期的公共临时主机上。
  3. 首先确认。 这将写入用户的真实频道,因此在执行前确认:标题、可见性(private / unlisted / public)和类别。 如有必要,使用 inspect_zapier_actions({ tool_name: "youtube_upload_video", enum_property: "category_id" }) 解析 category_id。 喜剧 = 23(Tall Tale 和 Deep Dive 的默认建议),教育 = 27,宠物和动物 = 15。
  4. 上传。 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" } })
  5. 报告。 结果包含 id;链接是 https://www.youtube.com/watch?v=<id>。60 秒或更短的竖屏视频会自动变成 Shorts(无需额外字段)。 为用户打开本地文件(tools.browser.preview({ path: "renders/<name>.mp4" }))并以文本形式提供 YouTube URL。应用内浏览器经常无法加载 youtube.com,显示 ERR_ABORTED;这并非上传失败。
  6. 缩略图。 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 或任何主机;复制其他创作者的脚本、镜头或帧;未经询问覆盖用户的项目;交付未经检查的帧。

相关技能