精酿 BrewReel:让 DeepSeek 这类便宜模型也能做出好看的竖版宣传片。写一份产品简报,AI 挑镜头、写文案,一条命令出片。3 种配方、6 个行业、广告法校验,开源可商用。
# Add to your Claude Code skills
git clone https://github.com/Finderchangchang/brewreelLast scanned: 9/28/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-09-28T10:37:24.892Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}See how brewreel compares with popular alternatives.
brewreel is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by Finderchangchang. 精酿 BrewReel:让 DeepSeek 这类便宜模型也能做出好看的竖版宣传片。写一份产品简报,AI 挑镜头、写文案,一条命令出片。3 种配方、6 个行业、广告法校验,开源可商用。. It has 165 GitHub stars.
Yes. brewreel passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/Finderchangchang/brewreel" and add it to your Claude Code skills directory (see the Installation section above). brewreel ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
brewreel is primarily written in JavaScript. It is open-source under Finderchangchang on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh brewreel against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
| 用户给了什么 | 你读哪份 | 你只写哪个文件 | 跑哪条命令 |
|---|---|---|---|
目录里有 talk.mp4,或用户说给口播配画面 |
只读 <SKILL>/broll/SKILL-broll.md |
只写 broll.json。不要写 storyboard.json |
node <SKILL>/scripts/talk.mjs <项目目录> --out <仓库外目录> |
| 用户要一句话造一种 AI 画面风格 | <SKILL>/docs/style-factory.md |
不写分镜,也不要自己写 style.json。不要自己出图,不要替人跑 scripts/broll/approve-style.mjs |
node <SKILL>/scripts/broll/new-style.mjs --id <id> --name <名字> --desc "<一句话>"(不要加 --yes) |
| 要做讲解课、课程、普法、教程类横版视频 | 只读 <SKILL>/lesson/SKILL-lesson.md |
只写 lesson.json(或 brief)。不要写 storyboard.json |
node <SKILL>/scripts/lesson/make-lesson.mjs <lesson.json> --out <仓库外目录> |
| 其余:产品宣传片、推广短视频、功能演示 | 往下读这份 | promo/<片名英文>/storyboard.json |
node <SKILL>/scripts/make.mjs promo/<片名>/storyboard.json --out promo/<片名> |
拿不准是哪种就问用户,不要猜。<SKILL> = 本文件所在目录。讲解课不要继续读下面的宣传片步骤。
你只做两件事:挑镜头、填文字。不写代码,不改 template/、scripts/、industries/ 里的任何文件,不写坐标、帧数、颜色值。
便宜模型不要用 custom。custom 是强模型自己写组件的自由镜头,只在本地技能模式开放,插件里会直接拒绝。便宜模型继续只挑镜头、填文字。写法见 docs/custom-shot.md。
用户想改已经写好的某一处时,先跑 node <SKILL>/scripts/revise.mjs <storyboard.json> "一句话",不要整份重写。
下文 <SKILL> = 本文件所在目录。命令都用 Node 22 / Python 3.10 跑。English speaker or English video needed → read <SKILL>/SKILL.en.md instead.
选风格(meta.style,不写就是 cards)。先看产品属于哪一类,再读 <SKILL>/styles/<风格>/STYLE.md 和 recipes.md:
| 风格 | 状态 | 适合什么产品 |
|---|---|---|
cards 卡片信息流(默认) |
可用 | 单一卖点、要讲流程、要演示界面、实物门店;六个行业都支持 |
quiz 答题互动 |
可用 | 有常见误解、能出一道选择题的产品(外语短语、功能被误会、菜名名不副实、反常识知识点)。三套模板见 styles/quiz/recipes.md,样例在 styles/quiz/examples/。meta.theme 可选 sage-pine / rice-soy / ash-teal(不写:餐饮用 rice-soy,其余用 sage-pine);phraseTitle.params.voice 选口吻 exam / chat / show(不写按行业选),题号签、回放标题、印章、评论提示这些固定句式跟着口吻走,也可以在镜头里直接写字覆盖;提问句和评论提示自己写,别抄同类视频的套话(Q14 会提醒);clip 台词不许说出答案 |
journey 角色漫游 |
可用 | 内容多、类别清楚的产品(内容平台、功能多的软件、多门店多品类、课程体系、一条游线)。一站一个类别 / 功能 / 景点;三套模板和每拍字段见 styles/journey/recipes.md,样例在 styles/journey/examples/。默认 meta.aspect: "4:5",也可 9:16;背景 opening.params.skyline 选 modern / street / oldtown(古城古镇题材必须 oldtown),街区道具要和内容对得上;开场小引写路线或看点(如「这趟车停 5 站」),别套「跟 X 一口气…」(J18 会提醒);配色 post-green(默认)/ plum-ticket;价格、时间、总量数字只能抄 meta.facts |
cards,不用写 meta.style。开发中的风格校验会拦。meta.aspect:9:16(默认,1080x1920)或 4:5(1080x1350)。cards 只支持 9:16,不用写。cards 的写法。用别的风格时,镜头和字段以那个风格的 recipes.md 为准;行业合规、meta.facts、禁止事项、出片命令照旧。params 里,镜头顶层只有 type、dur、params。例(journey):{"type": "district", "dur": 4, "params": {"category": "预算提醒", "title": "月底前三天,提醒你收手", "scene": "phone"}}。meta.theme 是 cards 的配色,别的风格按它自己的 recipes 写或不写;cta 这类可选字段不需要就整个删掉,不要写空字符串。定行业和语言。
meta.industry:software(默认)/ food(餐饮)/ ecommerce(电商实物)/ education(教培)/ beauty(美业)/ travel(文旅住宿)/ general(没有专门行业包时,只跑通用广告法)。选错行业,禁用镜头(disabledShots)和合规规则都会不对。enabledShots 是推荐,不是能用镜头的名单。meta.lang:zh(默认)/ en。视频要出英文字幕、用户是英文用户,就写 en(用法见第 5 步)。<SKILL>/industries/<industry>/recipe.md(英文项目读 recipe.en.md):里面有这个行业推荐的镜头组合、brief-template.md(这个行业简报要问哪些栏目)、test-brief.md/expected.md(合规红线举例)。跳过这一步很容易写出会被拦的内容。六个行业包只有 software / food / ecommerce / education / beauty / travel。用户的产品不在里面(汽车、房产、金融、药品、医疗器械、家电整机等)时:
先告诉用户:精酿没有这个行业的专门合规规则包。不要编一个 meta.industry 名字,也不要假装已经按该行业审过。
版式可以借最接近的行业包(镜头组合看那个行业的 recipe.md),并在方案里写明借了哪个。借来的是版式,不是那个行业的完整审核。例如汽车可以借 ecommerce 的实物镜头结构,但电商日用品规则不等于汽车广告审查。
通用广告法照样查。要只跑 industries/_base 的通用规则、不套某个行业的专属拦截,写 meta.industry: "general"。general 不是第七个行业包。校验通过也不等于行业合规。
行业特有的合规必须提醒用户自己找人审。例如汽车的辅助驾驶用语、药品和医疗器械、金融宣传。这些不在六个包里,机器查不到。
不许把 general 或借来的行业说成「已经合规」。
读简报。按对应 brief-template.md 的栏目理解;缺「产品名 / 一句话卖点 / 痛点场景 / 核心动作 / 2–4 个卖点」就先问,别瞎编数据和功能。
meta.product 照抄简报的产品名,全片(hook 胶囊、片尾 brand)只用这一个名字,片尾 brand 必须和它一字不差。meta.action:必填,一句话「用户做什么 → 产品给出什么」(如「拍小票 → 自动填好金额和分类」),不上画面。演示类镜头(chat/phone/mockApp/photoShot)的画面文字要体现这个动作,校验会核对。meta.cta,片尾 cta 照抄它;简报写「无」→ 两处都不写。不要自己编「应用商店搜 XX」。meta.facts,格式是 [{"id":"f1","text":"原话…","source":"来源"}](不是纯字符串数组):
source 必填:照抄简报写的来源(「2026-09 价目表」「后台统计至 8 月」);简报没写来源就写 "简报未注明来源"。不许自己编来源,也不许自己编 fact。quote 可选:简报里的那句原话,逐字照抄。params.refs: ["f1"] 把某个说法(如「现做」、compare 的 stat/level、meter 的读数)和某条 fact 关联起来。"demoData": true,meta.disclaimer 写「演示画面,数据为示例」。示例数字只能出现在 mockApp/phone/chat/priceCard 等演示界面、价格条款和 dataChart 里。compare 同一栏的 stat 和 items 也不能自相矛盾(如左栏又写「5 分钟」又写「三天」)。meta.durationRange: [15, 60] 这样的两元素数组。meta.notices:字符串数组,最多 3 条,合并成一行显示在底部。notices 别和 meta.disclaimer 说同一句话(都写「演示」就算重复,校验会拦)。建目录,登记素材:promo/<片名英文>/,分镜写在 promo/<片名英文>/storyboard.json。用户给的截图/录屏/logo/照片复制进同一目录。
photoShot、beforeAfter、storeCard.photo):每个文件都要登记在 meta.assets:
"assets": [{"src": "photos/dish.jpg", "source": "merchant"}]。source 只能是 merchant(商家实拍)/ illustration(插画、示意图)/ screenshot(软件截图)。_dev/ 下的文件都算占位图,会被拦。beforeAfter 的两张必须是同一位顾客的两张不同照片:都登记 merchant,kind 分别写 customer-before / customer-after,pair 写同一个值(如 "A")。同一张图、改名复制的图都会被拦。{"source": "drawn", "tag": "示意", "illust": "<插画 id>"} 用插画兜底,校验会放行并列进「需人工复核」。不写「实拍」「顾客授权」,不设 consent。商家给了照片却一张没用,才会被拦。选主题(meta.theme):
warm-emotiontech-darkfresh-lightbusiness-bluefestival-redmono-premium
上面 6 套是默认老主题,字幕仍是描边大字。另有 12 套可选新配色,名单见 <SKILL>/styles/cards/THEMES.md。
有品牌色就写 meta.brandColor(#RRGGBB),它只换强调色。挑 5–9 个镜头(镜头说明看 <SKILL>/shots.md,19 个镜头一览表在最上面;用 quiz / journey 时镜头换成那个风格的,字段照第 0 步写进 params)。hook 必须第 1 镜(2–3 秒),endCard 必须最后 1 镜(4 秒)。
必须有一镜演示核心动作(第 2 步写的 meta.action),按行业用不同的镜头,校验会拦:
chat 写 messages + panel(提问 → 回答);或 mockApp 写 input(用户输入/提问)+ 结果(dashboard 的 stat、editor 的 items、done);有截图用 phone。
mockApp kind:"form" 只给本来就是填表的产品,别拿表单顶替核心动作。input 和 stat.label 要问答对得上(问「上月广州新增多少商户」,stat 就写「上月广州新增商户」);items 别写「数据」「信息」「内容」这种占位词。photoShot(实拍或插画兜底)或 beforeAfter,再配 steps / priceCard 讲清楚。
校验只拦合并后的 disabledShots(industries/_base/rules.json 叠上该行业的 rules.json)。enabledShots 是推荐,不是白名单:没写进去的镜头,只要不在 disabledShots 里就能用。例如电商的 enabledShots 没有 steps、meter、storeCard,这三镜照样能用。enabledShots 还有一个作用:把上层禁掉的镜头重新开放。目前 _base 只默认禁用 beforeAfter;美业把它写进 enabledShots 之后就不再禁用。推荐组合以 recipe.md 为准,不要因为 enabledShots 没写就不用某个镜头。只有选了 disabledShots 里的镜头,校验才会报「不开放」。
行业镜头里,真正会被禁用的只有这些:beforeAfter 前后对比滑块:默认禁用,只有美业重新开放,还要 consent:true + retouched:falsereviewCard 真实顾客评价:教培写在 disabledShots 里,所以教培不能用;其他行业可用,原文摘录,不能改写得更夸张photoShot 实拍/示意图、priceCard 价目表、storeCard 门店/地图/预订、factSheet 参数表/大纲/色卡、credCard 资历卡:各行业都能用,不因为 enabledShots 没写就被拦
中间按产品类型选镜头,别套固定模板,features 卖点卡不是必选。两条硬要求(校验会提醒):industries/<industry>/recipe.md 的推荐结构改):visual 同一批片子别总用一种:一条扎心消息用 bubble,有真数字用 stat,说一处风景/一样东西用 illust,痛点 vs 产品用 split。compare 写了 level 时,tone: good 那栏要在这把尺子上占优(写 higherIs 说清越高越好还是越差)。
总时长 20–30 秒最好(允许 15–45,或 meta.durationRange 的自定义范围)。同一种镜头别连着用。相邻两镜 mood 差别别超过 0.5(中间插一镜过渡),否则背景会硬切。写字幕(每镜的 caption):一镜一句话,抖音式大字,说给观众听,不描述画面怎么动(❌「卡片一张张出,讲它能做什么」这是镜头说明,不是字幕)。
\n 换行;每行 ≤12 个汉字(字母数字算半个)。meta.lang: "en" 时英文字幕按拉丁字符数折算(约中文限制的 1.8 倍),具体数字看 docs/shots/<type>.en.md{} 包住最关键的 2–5 个字,变强调色;每条最多 1 处params.slogan"caption": ["先别急着发,\n对方要的是{你的在乎}", "挑一条填进输入框,\n发不发{你决定}"]\n;字幕里要用引号就写「」,不要写英文双引号 "写 mood(0–1):痛点/紧张 0.8–1,转折 0.5,产品和卖点 0–0.3,片尾 0。背景颜色和配乐都跟着它变。
写 storyboard.json,格式见文末完整示例。时长用 dur(秒),写 0.5 的整数倍。
文件必须是 UTF-8 编码。中文 Windows 默认 GBK:用编辑器/写文件工具直接写 UTF-8;用 PowerShell 就 [IO.File]::WriteAllText($p, $json, [Text.UTF8Encoding]::new($false));用 Python 就 open(p, "w", encoding="utf-8")。不要用 echo >、Out-File(5.1 版)写中文。
chat 的 panel.replies 是产品建议**「我」**发给对方的话,站在 me 的立场写(我说要加班,建议回复不能是「别再加班了,陪我」——那是对方的口吻);有 panel 就别写 typing。
校验,按报错逐条改,直到通过。简报是文件时加 --brief,校验会核对 facts 里的数字和 quote 是不是真在简报里:
node <SKILL>/scripts/validate.mjs promo/<片名>/storyboard.json --brief promo/<片名>/brief.md
报错格式是「第 N 镜(类型)字段:问题 → 怎么改」,照「怎么改」做。结果分三档:
出片(2–4 分钟,会自动生成配乐;别的片子在渲染时会排队,每 15 秒打印一次排队情况):
node <SKILL>/scripts/make.mjs promo/<片名>/storyboard.json --out promo/<片名> --brief promo/<片名>/brief.md
--out 必填。测试时改用 --round <轮次>:产物放到仓库外的 promo-video-skill-tests/<轮次>/<片名>/(和仓库同级),同一轮的几支片子用同一个轮次名,不要自己按秒生成时间戳目录,也不要把测试产物写进仓库。--out 落在仓库里(promo/ 除外)时 make 会直接退出(退出码 2);测试用 --round,或给仓库外的绝对路径。manifest.json,直到 status 出现(delivered 才算成)。没看到 交付: 那一行之前,不许写交付报告、不许结束。video.mp4、sheet.png(每秒一帧拼图)、check/(第 0 帧 + 每镜结束前的全尺寸帧)、report.txt、layout.json、manifest.json(分镜和成片的 sha256、时长、各项检查结论)。开跑时会先清掉目录里上一次的这些产物。--stills 0,3.5,8(秒),只出单帧,不出整片(不是交付)。meta.voice(配音):make 会先合成旁白、按声音改写镜头时长,见下文「配音」。没有这家的 key 时加 --voice-provider mock 先看节奏(占位音,不能交付),或加 --no-voice 出无配音版。交付:<mp4 路径>,交给用户的路径只能抄这一行。没有这一行就是失败,不许把别的 mp4 当成片。video.rejected.mp4,只给人看哪里坏了)/ 4 渲染失败或时长不对 / 5 排队超时 / 6 内部错误 / 130 被中断。report.txt:「机器自查」「文字排版报告」「布局自查」里有一个 ✗ 就不能交付(make 会返回 3)。布局自查在渲染后量每个文字块:被卡片裁切、两块字互相压住、关键文字出了 x180–900、英文片画面上出现汉字(每半拍抽一帧查)。✗ 通常是某个字段写太多:删条目或缩短文字,改完回到第 9 步。全是 ✓ 之后再看 sheet.png 和 check/,按下面清单自查。node <SKILL>/scripts/make.mjs promo/<片名>/storyboard.json --out promo/<片名> --verify,确认成片还对应当前分镜(改过分镜会报「成片和分镜不一致,请重跑 make」)。把 make 最后一行的 mp4 路径、sheet.png 路径交给用户,附上「发布前自查清单」(见下)——第 9 步的「需人工复核」条目原样列进去,逐条让用户确认,不要替用户下判断。用户说节奏、字号、标题字体,或某一镜换一张背景图时,写这些字段,不要改 template/。不写 meta.tweak 时,画面和现在完全一样。
| 用户说 | 怎么写 |
|---|---|
| 节奏快一点 | meta.tweak.pace 写 fast(慢一点 slow,改回原来 normal)。拍长分别乘 0.88 / 1.15 / 1。每种镜头的最短、最长时长照样生效 |
| 字大一点 | meta.tweak.textScale 写 1.05–1.15(字小一点写 0.9–1)。只缩放字幕带、片尾大字和 hook 主视觉大字。quiz、journey 目前不吃这项 |
| 标题换楷体 | meta.tweak.headingFont 写 kai(衬线 serif,黑体 sans)。字体用仓库里的 BrewReel Kai、BrewReel Serif、Noto Sans SC,只影响标题和大字。quiz、journey 目前不吃这项 |
| 这一镜换张背景图 | 这一镜加 "bg": "photos/desk.jpg"(相对 storyboard.json 的 png / jpg / webp,出片时自动压暗)。没在 meta.assets 里登记 "source": "merchant" 的图,画面文字不能写「实拍」 |
textScale 和 headingFont 这两项目前只对 cards 生效。quiz、journey 的标题是风格自己画的,不跟着这两项变。这两种风格写了这两项,校验提醒一句,不拦截。pace 和镜头 bg 仍然生效。
改已经写好的分镜时,优先用 revise.mjs 只改这几个字段,不要整份重写。
用户要旁白 / 配音 / 口播时才开;不写 meta.voice 就是无配音片,和以前完全一样。开了之后声音就是时间轴:make 先合成每句旁白、拿到逐字时间,再把写了 vo 的镜头时长改成「0.15 秒 + 旁白 + 0.35 秒」向上取整拍(不短于这种镜头的最短时长),你写的 dur / beats 只对没写 vo 的镜头算数;字幕跟着声音逐字点亮,配乐在人声处自动压低约 10 dB。
meta.voice(只能写这 6 个字段,多写报错):
| 字段 | 写法 |
|---|---|
provider |
必填。minimax / aliyun / volcengine = 真人感配音(各要自己的环境变量,见下表);mock = 不联网的占位音,只用来听节奏。用户没指定就写 minimax |
voiceId |
音色,不写用这家的默认(下表)。音色 id 各家不通用,换 provider 要一起换 |
speed |
0.5–2,默认 1。广告旁白 1–1.15;念不完就删字或拆镜,别靠调快硬塞 |
emotion |
只有 minimax 认:calm / fluent / happy / sad / angry / fearful / disgusted / surprised / whisper。不写用音色默认;广告旁白建议 calm 或 fluent。aliyun / volcengine 写了会被忽略 |
model |
一般不写(用这家的默认,见下表)。volcengine 这里填资源 ID,音色要和它对上 |
subtitles |
karaoke(默认,逐字点亮)/ line(整句出现)/ off(只念不出旁白字幕) |
每镜的 vo(这一镜要念的一句话):
vo 的镜头按 dur 播,配乐照常。recipes.md。推荐一句 8–20 字。英文按每秒 2.5 词算。校验按中文 5 字/秒、英文 3 词/秒拦,出片时按真实配音时长再核一遍,超了会停并告诉你第几镜能念多少字。vo 和字幕走同一套检查——带单位的数字要能在 meta.facts 里找到,广告法极限词、绝对化用语、错别字、速度说法照样拦。念出来的数字和画面上的保持一致。{} 强调:和字幕一样,每句最多 1 处(24 字以内),字幕上变强调色。vo、没写 caption 的镜头,字幕由 vo 自动生成(逐字点亮);写了 caption 的镜头照旧显示 caption、旁白只念——hook 必须写 caption(它是封面标题);endCard 只念不出字幕。quiz / journey 在自己的字幕条上显示旁白。meta.product 一字不差)。
三家怎么选(都按字符计费、都能给逐字时间戳;以各家控制台为准,第一次用先试听):| provider | 要设的环境变量 | 默认模型 | 中文默认音色 | 英文默认音色 | 实测 |
|---|---|---|---|---|---|
minimax |
MINIMAX_API_KEY(可选 MINIMAX_GROUP_ID、MINIMAX_BASE_URL) |
speech-2.8-hd |
Chinese (Mandarin)_Male_Announcer(播报男声) |
English_expressive_narrator |
已用真实 key 出片 |
aliyun(阿里云百炼 CosyVoice) |
DASHSCOPE_API_KEY(可选 DASHSCOPE_WORKSPACE_ID、DASHSCOPE_REGION、DASHSCOPE_TTS_URL) |
cosyvoice-v3-flash |
longsanshu_v3(沉稳质感男) |
loongabby_v3 |
未实测 |
volcengine(火山引擎豆包语音) |
VOLCENGINE_TTS_API_KEY,或旧版 VOLCENGINE_TTS_APP_ID + VOLCENGINE_TTS_ACCESS_TOKEN(可选 VOLCENGINE_TTS_BASE_URL) |
seed-tts-2.0 |
zh_male_guanggaojieshuo_uranus_bigtts(广告解说) |
en_male_alex_uranus_bigtts |
未实测 |
「未实测」= 按官方文档接入、用假响应测过,还没用真实 key 出过片;第一次用出了问题,报错里会写是鉴权、限流还是参数,按提示改或换 minimax。
推荐音色:
Chinese (Mandarin)_Male_Announcer(默认):播报男声,稳重清楚,适合大多数产品片Chinese (Mandarin)_News_Anchor:新闻女声,稳重播报,适合 B 端、办公、工具female-shaonv:年轻女声,适合 C 端生活、情感、轻工具male-qn-qingse:年轻男声,口语感强,适合答题互动、种草presenter_female:女主持,适合讲解、教培meta.lang: "en"):English_expressive_narrator(默认);英文片最好写明 voiceIdlongsanshu_v3(默认,沉稳质感男)、longshu_v3(沉稳青年男)、longxiaoxia_v3(沉稳权威女)、longxiaochun_v3(知性积极女);英文 loongabby_v3model 用默认 seed-tts-2.0):zh_male_guanggaojieshuo_uranus_bigtts(默认,广告解说)、zh_male_cixingjieshuonan_uranus_bigtts(磁性解说男)、zh_female_tianmeixiaoyuan_uranus_bigtts(甜美女声)、zh_female_zhixingnv_uranus_bigtts(知性女声);英文 en_male_alex_uranus_bigtts没有 key 怎么预览:出片加 --voice-provider mock(不联网的占位音,时间轴、逐字字幕、配乐压低都照常,不用改分镜);或加 --no-voice 出无配音版。mock 出的片子只是看节奏,不能当成片交付——交付时要明说「这是占位音,设好 key 重跑才是真人配音」。没有 key 时 validate 只提醒、不拦。
费用:三家都按字符计费(旁白全文,价格看各家官网)。同一句(提供者、模型、音色、语速、情绪、文字都一样)合成过一次就缓存在用户目录 ~/.cache/brewreel/tts(环境变量 BREWREEL_TTS_CACHE 可改),改画面、改字幕、重渲染都不再计费;改了 vo 或音色才会重新合成。manifest.json 的 voice.billedCharacters 是这一次计费的字符数。
密钥:只从环境变量读(每家的变量名见上表;自定义接口地址只接受 https)。不要把 key 写进分镜、简报、命令行参数或任何文件,也不要打印出来。
配音相关退出码:旁白比这一镜最长时长还长 → 1(删字或拆镜);没 key、鉴权失败、限流重试用完、网络不通 → 2(让用户设 key 或稍后重跑;先看效果用 --voice-provider mock)。
这是宣传片的另一种写法,还在实验。模型只写语义(每屏说什么、强调哪几个字、版式名、风格名、动效性格名),引擎算位置和时间。它仍然属于宣传片,不另占上面的分流表。quiz 和 journey 不走这条路。旧的 storyboard.json 和 node scripts/make.mjs 一行不变。
什么时候用:想用版式原型(主张、条目、截图板、大数字、片尾),并且接受这一版标成实验。拿不准就继续写 storyboard.json。
怎么写:一份 scene.json。顶层写 product、aspect(9:16)、style、motion、facts、screens。每一屏写 role、layout、narration 和这一屏的文案。不写坐标、像素、帧号、毫秒。版式名用 hero、stack、grid、split、sequence、media、chart、end、board。风格:宣传片主题名见 template/src/core/themes.json(示例 fresh-light,渐变卡片),杂志用讲课的 editorial,资讯板用 techbrief。性格用 crisp、bounce、soft、paper、push。editorial 不要配 bounce,宣传片不要配 paper。说明和限制见 <SKILL>/docs/scene.md。给便宜模型的提示词用 scripts/scene/deepseek-layouts.mjs 导出的 prompt,不要改写。
node <SKILL>/scripts/scene/make-scene.mjs <scene.json> --out <仓库外目录> [--voice-provider minimax|aliyun|volcengine|mock] [--no-voice] [--no-bgm]
node <SKILL>/scripts/scene/brief-to-video.mjs <brief.md|json> --out <仓库外目录> [--assets <素材清单>]
有旁白却没写 --voice-provider 也没写 --no-voice,命令会停。没有密钥时用 --voice-provider mock 看节奏(占位音,不能当交付)。一条龙没有 DeepSeek 密钥时会直接说明。一句话改稿:node <SKILL>/scripts/revise.mjs <scene.json> "一句话"。能改屏上的文案、强调、版式名、风格名、性格名、疏密。示例在 <SKILL>/examples/scene/。
\n、反斜杠这类怪字符meta.facts 里找到来源beforeAfter 只在美业;reviewCard 的引用是原文,没有改写得更夸张human 列表,原样抄给用户,别替用户判断「应该没问题」。常见的有:reviewCard/credCard 的引用是否和简报原文一字不差、平台规则口径是否有更新、行业资质是否齐全。meta.industry 选对了吗(不对的话禁用镜头和合规规则都会错)。产品不在六个行业里时,按「产品不在六个行业里」处理,不要假装已经合规。consent/retouched 这类字段只是校验要求写,真实取得同意是用户的责任,不是校验能替你核实的)。meta.platform 一致,对应的平台专属规则(如购物车不能挂价格字幕)是否已经确认。hook;endCard 放最后meta.durationRange 的自定义范围);每种镜头有自己的时长范围(见 shots.md)meta.lang: "en" 时英文有自己的字符数上限,见对应字段的说明)meta.action(见第 5 步);同一句字幕最多停 5 秒brand = meta.product;片尾 cta = meta.cta(简报没给就都不写)\\n 会原样显示在画面上)meta.allowWords,不要为了过校验改产品名meta.allowWordsmeta.facts 里找到同样的数字,没有就是编造,一律报错;每条 fact 必须有 sourcemeta.demoData: true + disclaimer 带「演示/示例」meta.assets 登记来源;beforeAfter 前后必须是同一位顾客的两张不同的商家实拍template/、scripts/、industries/ 里的任何文件;不写坐标、像素、帧号、颜色值、CSSmeta.facts 里找得到。没有真数据:效果类镜头(counter、带数字的 compare、「变好」的 meter)不用,演示界面里的示例数字用 demoData 声明bgm 字段(make.mjs 自动填);顶层也不写 voice(配音设置写 meta.voice,每镜念的话写 vo)| 报错 | 改法 |
|---|---|
| 第 N 行 … 字,每行最多 12 字 | 缩短,或在语义停顿处用 \n 断成两行 |
| 用了 2 处 {} 强调 | 只留最关键的一处 |
| {} 没有成对 | 每个 { 都要有 },不要跨行 |
| 含《广告法》极限词「最」 | 换成可证实的说法:「最快」→「3 秒出结果」 |
| 第 1 镜必须是 hook | 在最前面加 hook |
| endCard 这一镜不能写字幕 | 删掉 caption,大字写在 params.slogan |
| 多了一个不认识的字段 | 看报错里的「可用字段」,改拼写(如 mockApp 用 kind 不是 variant) |
| 没有叫「xx」的图标 | 从 shots.md 顶部的图标清单里选 |
| 总时长 … 要在 15–45 秒之间 | 加/删镜头,或改 dur |
| 素材文件找不到 | 检查路径,相对 storyboard.json 所在目录 |
| JSON 解析失败:第 N 行 | 看那一行:漏逗号、多了结尾逗号、字幕里写了英文双引号(改成「」) |
| 这一句要在屏幕上停 N 秒 | caption 写成 2–3 句的数组,或把这一镜拆成两镜 |
| 全片没有一镜在演示核心动作 | 加 chat(提问 → panel 回答)或 mockApp(input + 结果) |
| 片尾产品名和 meta.product 不一致 | brand 改成和 meta.product 一字不差 |
| 写了 cta,但 meta.cta 是空的 | 简报有获取方式就写进 meta.cta 再照抄;没有就删掉 cta |
| 里有字面的 \n | JSON 里换行只写一个反斜杠 |
| vo:旁白 N 字,这一镜最长 M 秒,要每秒念 X 字才念得完 | 删字,或把这句拆到两镜(每镜一句);别靠调快 speed |
| 配音失败:旁白念完要 N 秒,超过这一镜最长 M 秒 | 按提示的字数缩短,或拆镜 |
| 当前环境没有 MINIMAX_API_KEY / DASHSCOPE_API_KEY / VOLCENGINE_TTS_API_KEY(提醒) | 让用户设好对应的环境变量再出片;先看节奏加 --voice-provider mock |
| 配音设置要写在 meta.voice 里 | 顶层的 voice 挪进 meta,每镜要念的话写 vo |
| 含平台名「公众号」(提醒) | 产品本身的品类词:加进 meta.allowWords;引流:删掉 |
| 缺少必填字段 meta.action | 写一句「用户做什么 → 产品给出什么」 |
| 数字在 meta.facts 里找不到来源 | 简报给了这个数字就原话抄进 meta.facts({"id":"f1","text":"…","source":"…"} 格式);没给就把具体数字换成定性说法 |
| meta.facts[N].source:缺少 source | 照抄简报写的来源;简报没写就写 "简报未注明来源" |
| 来自标了「示例/演示」的 fact,但没声明这是演示数据 | meta 写 "demoData": true,disclaimer 写「演示画面,数据为示例」 |
| 只在你自己标了「示例/演示」的 fact 里有 | 这是效果说法,示例数据撑不住:删掉数字,compare 只比做法;counter 换成 steps 或 compare |
| level(8 对 2)…meta.facts 里没有这个分数 | 删掉两栏的 level 和 meterLabel,差别写进 items |
| 刻度方向反了 | 让 tone: good 那栏在这把尺子上占优,或写 higherIs / 换 meterLabel 的说法 |
| 读数 N 没有依据 | 产品演示里给出的判断 → demoData: true;效果/评分 → 数字抄进 facts 并写 refs,没有就删掉这一镜 |
| 限定语丢了:没写 facts 里跟着它的「周日至周四」 | 把 fact 里的日期范围/条件原样写进同一镜(字幕、标题或卡片),别改写成「平日」「周末」 |
| 说 29.9 元,但简报里这个价要满足条件才有 | 同一句写清条件,如「领券后29.9元」;放不下就别在这里报价 |
| 是实物/门店行业,mockApp 是编出来的 App 界面 | 删掉 mockApp,用 photoShot(实拍或插画兜底)+ steps 演核心动作 |
| 素材没登记 / 前后两张是同一个文件 | 在 meta.assets 登记每个文件的来源;前后对比换成同一位顾客的两张不同照片,没有就改用 steps |
| 「现做」类说法需要依据 | 给这一镜写 refs 指向简报里的那条 fact;这一镜没有 refs 字段就删掉这类说法 |
| 字幕含镜头说明词(如「卡片一张张出」) | 这是说给观众听的字幕,不是给剪辑的说明;换成用户视角的一句话 |
| 「登陆」是错别字,应为「登录」 | 改成「登录」(「登陆舰/登陆月球」这类不算) |
| 「一清二楚」是绝对化承诺 | 换成有分寸的说法,如「关键信息看得到」 |
| 「XX」行业不开放镜头「YY」 | 只有镜头在合并后的 disabledShots 里才会这样报(常见是 beforeAfter,教培还有 reviewCard)。enabledShots 没写不等于不能用。换镜头,或核对这个行业是不是真的禁用了它 |
| [B-xxx] 命中行业合规规则 | 报错信息里的「怎么改」照做;确有依据的极限词才考虑 meta.allowWords(只对 warn 级有效,block 级必须删) |
优先用 mockApp 镜头(它会动)。如果一定要演「手机里点这里」,先把 mockApp 渲成一张示意截图再给 phone 用:
cd <SKILL>/template
npx remotion still src/index.ts Screen <分镜目录绝对路径>/screen.png --frame=145 --props=<分镜目录绝对路径>/screen-props.json
screen-props.json 写 {"type":"mockApp","theme":"<主题>","dur":5,"params":{...mockApp 的 params...}},参考 <SKILL>/examples/_src/screen-props.json。然后 phone 镜头写 "src": "screen.png",并在 meta.disclaimer 写「演示画面,内容为模拟」。
9 份样例都能直接通过校验并出片,产品和数据都是虚构的:
<SKILL>/examples/jev.json:C 端情感,software(聊天演示配 2 句字幕 → 对比 → 仪表 → 快切 → 片尾;仪表读数是演示判断,写了 demoData)<SKILL>/examples/ledger.json:工具提效,software(痛点快切 → 只比做法的对比 → mockApp 拍小票出结果 → 预算读数 → 片尾;没有真实效果数据,所以不用 counter)<SKILL>/examples/meeting.json:B 端办公,software(截图圈注 → 待办列表 → 前后对比 → 步骤 → 片尾;获取方式「官网申请免费试用」)<SKILL>/examples/en-focus.json:meta.lang: "en" 的英文样例<SKILL>/examples/food.json:餐饮上新(插画兜底的 photoShot → 到店三步 → 甜度读数有 fact 撑 → 活动价 → 片尾)<SKILL>/examples/ecommerce.json:电商实物(分屏钩子 → 新旧对比 → 商家实测数字 → 券后价写清条件 → 片尾)<SKILL>/examples/education.json:教培(服务条款 → 课程大纲 → AI 演示 → 讲师 → 价格)<SKILL>/examples/beauty.json:美业,没有实拍照片时怎么拍(插画 + 步骤 + 答疑 + 价目表)<SKILL>/examples/travel.json:文旅住宿(插画钩子 → 看房 → 地图 → 价格按 facts 原样写日期范围)vo,provider 写的是 minimax;没有 key 时出片加 --voice-provider mock,或把 provider 改成 mock 预览):<SKILL>/styles/cards/examples/voice-reminder.json(cards)、<SKILL>/styles/quiz/examples/software-archive-voice.json(quiz)、<SKILL>/styles/journey/examples/software-notes-voice.json(journey)industries/<industry>/test-brief.md + expected.md:test-brief 是一份示例简报,expected 写清楚照这份简报写的分镜哪些地方会被拦、为什么。开新行业的第一支片子建议先看这两份。{
"meta": {
"title": "省心记账 宣传片(痛点 → 产品 → 3 卖点 → 片尾)",
"product": "省心记账",
"theme": "fresh-light",
"disclaimer": "演示画面,数据为示例",
"demoData": true,
"action": "拍小票 → 自动填好金额和分类",
"facts": [
{"id": "f1", "text": "演示账本示例条目:外卖 ¥860、奶茶咖啡 ¥326、忘关的自动续费 ¥98、深夜打车 ¥410(示例数据)", "source": "虚构产品的示例数据"},
{"id": "f2", "text": "演示识别结果:午饭 ¥38.5,本月餐饮预算已用 62%(示例数据)", "source": "虚构产品的示例数据"}
]
},
"shots": [
{
"type": "hook",
"dur": 2.5,
"caption": "工资刚到手,\n月底又{见底了}",
"mood": 0.85,
"params": {"visual": "stat", "text": "¥ 0.00", "sub": "这个月花哪了", "badge": "拍张小票就记好", "tone": "bad"}
},
{
"type": "quickList",
"dur": 3.5,
"caption": "钱花哪了,\n却{一笔都想不起}",
"mood": 0.8,
"params": {
"title": "本月去向不明",
"items": [
{"text": "外卖", "tag": "¥860", "tone": "bad", "icon": "bell"},
{"text": "奶茶咖啡", "tag": "¥326", "tone": "warn", "icon": "heart"},
{"text": "忘关的自动续费", "tag": "¥98", "tone": "bad", "icon": "calendar"},
{"text": "深夜打车", "tag": "¥410", "tone": "warn", "icon": "clock"}
]
}
},
{
"type": "compare",
"dur": 4.5,
"caption": "记账这件事,\n{别再靠毅力}",
"mood": 0.45,
"params": {
"mode": "lr",
"left": {"title": "手动记账", "items": ["每笔手动输入", "分类全靠猜", "拖到最后就放弃"], "tone": "bad", "icon": "doc", "stat": "全靠手打"},
"right": {"title": "省心记账", "items": ["拍小票自动识别", "自动分好类", "月底一键复盘"], "tone": "good", "icon": "bolt", "stat": "拍一下"},
"verdict": "记账不用再硬撑"
}
},
{
"type": "mockApp",
"dur": 4.5,
"caption": "拍一下小票,\n{金额分类都填好}",
"mood": 0.25,
"params": {
"kind": "editor",
"title": "记一笔",
"source": "示意数据,非真实用户账单",
"input": "拍照:午饭小票",
"button": "识别",
"items": [
{"text": "午饭 ¥38.5"},
{"text": "商家:楼下面馆"},
{"text": "分类:餐饮(自动)"},
{"text": "本月餐饮已用 62%"}
],
"highlight": 3,
"done": "已记好"
},
"note": "核心动作演示:用户拍小票 → 产品给出金额、商家、分类"
},
{
"type": "meter",
"dur": 3,
"caption": "预算快花完,\n{它先提醒你}",
"mood": 0.35,
"params": {"value": 62, "max": 100, "label": "餐饮预算已用", "unit": "%", "style": "ring", "higherIs": "bad", "word": "留神", "note": "超过八成会弹提醒"},
"note": "单个读数(演示账本里的预算进度),不是效果对比;meta.demoData 已声明"
},
{
"type": "endCard",
"dur": 4,
"mood": 0,
"params": {
"brand": "省心记账",
"slogan": "花出去的每一笔,\n{心里都有数}",
"points": ["拍小票自动记账", "账本只存在你手机里"],
"icon": "money"
}
}
]
}
用户给的是一段真人口播(talk.mp4,talk.srt 可选,没有就脚本本地转写),要在讲解的句子上加解释画面时,不要写宣传片分镜。改读 <SKILL>/broll/SKILL-broll.md,只写 broll.json;也可以直接让用户跑 node <SKILL>/scripts/talk.mjs <项目目录> --out <仓库外目录> 一条命令做完。画面分免费的动效画面和花钱的 AI 画面,时间、费用和合成由脚本做。
便宜模型也能出合格视频:给素材,一条命令出片。
为什么是精酿 · 快速开始 · 宣传片 · 口播配画面 · 讲课视频 · 文档 · English
宣传片:一份产品简报 → 竖版宣传片(9:16)
口播配画面:一段口播 talk.mp4 → 配好画面的口播(动效卡片 / AI 画面)
讲课视频:一份讲稿或 brief → 16:9 讲解课(可切竖版)
原名 promo-video-skill / 蒸馏视频,旧地址自动跳转。
便宜模型只填表,不写代码。 宣传片填 storyboard.json,口播填 broll.json,讲课填 lesson.json:挑版式、填文字。所以 DeepSeek 这类模型也能出合格片。
合规和质检先拦一遍。 广告法、行业规则、数字出处、版式、动效有没有停死,有一项不过就不出片。
开源,可以商用。 Apache-2.0。分发时注明出处。渲染出的视频不要求署名。
装依赖。
git clone https://github.com/Finderchangchang/brewreel.git
cd brewreel/template && npm install && npx remotion browser ensure
cd .. && pip install numpy scipy imageio-ffmpeg
宣传片(examples/ledger.json)
node scripts/validate.mjs examples/ledger.json
node scripts/make.mjs examples/ledger.json --out ../brewreel-out/ledger
校验通过后出片,要几分钟,最后一行是「交付:<mp4 路径>」。--out 不能指向仓库里面。
口播配画面
node scripts/talk.mjs path/to/project --out ../brewreel-out/talk
项目目录里放好 talk.mp4。本机转写,动效画面直接画;AI 画面先占位,不花钱。
讲课视频(examples/lesson/mascot-demo.json,mock 配音)
node scripts/lesson/make-lesson.mjs examples/lesson/mascot-demo.json --out ../brewreel-out/first-lesson --voice-provider mock --no-bgm
用占位配音看版式和节奏,不花配音费。成功时最后一行是「交付:」。
需要 Node.js 18+、Python 3.10+;Windows 只支持 x64。平台、环境变量和完整说明见 安装与上手。
你给什么:一份产品简报。
你得到什么:竖版宣传片(9:16;journey 默认 4:5)。
一条命令:node scripts/make.mjs examples/ledger.json --out ../brewreel-out/ledger
实验写法 scene.json:模型写语义,引擎算样子。node scripts/scene/make-scene.mjs examples/scene/c-techbrief.json --out ../brewreel-out/scene --voice-provider mock。说明见 场景。
cards 卡片信息流(默认,9:16)、quiz 答题互动(9:16)、journey 角色漫游(默认 4:5,也可 9:16)。详细说明 → 功能
你给什么:一段口播 talk.mp4。
你得到什么:配好画面的口播。动效卡片不花钱;AI 画面要先估价、人审。
一条命令:node scripts/talk.mjs path/to/project --out ../brewreel-out/talk
talk.srt 不会被覆盖。--motion-look cutpaper-meadow 或 cutpaper-dusk 换成剪纸拼贴:纸纹底、手剪卡片,说到重点词卡片抛起再落下。也不花钱。见 动效外观。broll/character.json 里的一个机器人:积木风(wood-blocks,默认)、黏土定格(clay-stopmotion)、分层纸艺(paper-layers)。手绘线稿(ink-sketch)只能占位预览。默认最多 2 段。风格工厂。 用一句话描述一种 AI 画面风格。脚本写配置、出参考图、看图打分、做一张静态试拍。看图会看错,最后要人看。人自己跑 node scripts/broll/approve-style.mjs <id>,AI 助手不许替人运行。欢迎把批准后的风格用 Pull Request 贡献回来。见 风格工厂。
花钱和人审:AI 画面先加 --provider minimax-h3 --dry-run 估价,加上 --yes 才生成。正式片要人自己跑 node scripts/broll/approve.mjs <项目目录> --out <仓库外目录>。talk.mjs 不会替你跑,批准命令只能人跑。
详细说明 → 口播配画面
你给什么:一份讲稿 lesson.json,或一份 brief。
你得到什么:16:9 讲解课。可以另出竖版切片和封面。
一条命令:node scripts/lesson/make-lesson.mjs examples/lesson/mascot-demo.json --out ../brewreel-out/first-lesson --voice-provider mock --no-bgm
paper 卷宗(普法默认)、lecture 讲台(其余默认)、product 产品、editorial 杂志(只能手选,不能用于普法)。tech 技术讲解,legal 普法。普法的法条只从已核对的《民法典》语料回填。花钱和人审:照片建角色要本人同意,照片会发给 MiniMax 做识别,会花钱。没有当次明确要求不要跑。未确认的角色不能正式出片,确认只能人跑。
详细说明 → 讲课视频
Claude Code 把仓库放到 ~/.claude/skills/brewreel/,Codex 等放到 ~/.agents/skills/brewreel/。说要做什么。技能开头按你给的材料分流到宣传片、口播配画面或讲课视频。
node scripts/revise.mjs <分镜/讲稿/broll.json> "第三镜慢一点,开头换成提问"。便宜模型只改你说的那几处,改完先校验,宣传片先出改动镜头的静帧。见 安装与上手。meta.tweak 调节奏、字号、标题字体,每一镜可以换背景图。见 功能。custom),字仍从分镜里读、校验照跑。便宜模型不要用。见 自由镜头。仓库自带插件 dsh-brewreel。7 个工具管宣传片的校验、出片和核对。注册进去的技能说明也会分流:口播配画面写 broll.json、跑 scripts/talk.mjs;风格工厂读 docs/style-factory.md、跑 scripts/broll/new-style.mjs;讲课视频读 lesson/SKILL-lesson.md、跑 scripts/lesson/make-lesson.mjs。这三件不走那 7 个工具。安装和版本要求见 安装与上手。
| 文档 | 讲什么 |
|---|---|
| 安装与上手 | 平台、环境、口播命令、风格工厂、DeepSeek Harness |
| 功能 | 配方、配音、行业、校验 |
| 口播配画面 | 只放一段口播,配动效画面或 AI 画面 |
| 风格工厂 | 一句话造一种 AI 画面风格,人批准 |
| 讲课视频 | 讲解课、课程、普法、教程 |
| 动效外观 | 剪纸拼贴等动效卡片外观 |
| 截图 | 三种宣传片配方的画面 |
| 它怎么工作 | 从简报到成片的步骤 |
| 常见问题 | 配乐、环境、出片时碰到的问题 |
| 已知限制 | 还不能直接发的原因,和测试方法 |
| 更新日志 | 每个版本改了什么 · 历史版本 |
| 贡献说明 | 怎么交一份宣传片配方 |
官网:首次出片指南 · 产品简报模板。仓库里的通用模板:brief-template.md。
测试方法和仍存在的问题见 已知限制。
如需联系,请公众号私信。 合作、赞助、反馈都走公众号私信。暂时还没有精酿 · BrewReel 的专属交流群。
问题反馈走 GitHub Issues:误伤或漏拦的校验规则、渲染出错、看着别扭的画面,附上分镜 JSON 和报错最好(别贴 API Key)。
想听真实需求:你想给什么产品做片?缺哪种配方、哪个行业?哪条合规规则误伤了你?公众号私信或开 issue 都行。
想出现在这里?加微信 jskjkf007,添加时请备注「BrewReel 商务合作」。
如果精酿帮你省下了一晚上剪片的时间,欢迎请我喝杯咖啡。每一份配方都是一杯杯咖啡熬出来的:这杯续上,下一份配方就调得快一点;哪天仓库里突然多了一个新风格,多半是这杯起了作用 😄
同一作者放在 jev-chat 组织下的开源项目:
Copyright © 2026 Finderchangchang。代码以 Apache-2.0 协议开源,另见 NOTICE 和 THIRD_PARTY_LICENSES.md。
基于 精酿 BrewReel(https://github.com/Finderchangchang/brewreel)二次开发。template/public/fonts/。使用边界:industries/ 和校验脚本里的规则整理自公开法规和平台规则,只用于辅助自查,不构成法律意见,也不保证覆盖所有平台的最新规则。内容是否合规,以监管部门和平台当时的最新规定为准,责任由发布者自行承担。