播客视频 是做什么的?
生成一个1920x1080的双人对话视频。每个话题都有独立的背景图片、标题卡、图标和带有语音动画条的主讲人标签。话题切换时会有全屏划屏转场和嗖声,图标会弹出,最后一场会显示订阅按钮和鸣谢。可以以用户自己克隆的声音开场。
在更改任何编排之前,请先阅读/hyperframes。以下脚本位于该技能的scripts/文件夹中。请从视频项目文件夹中运行它们。
0. 先访谈
在完成这一步之前,不要进行研究、写作或生成任何内容。渲染视频后重新制作很慢,所以先敲定所有决策。此方法源自Matt Pocock的grilling技能。
决策构成一个树形结构:有些决策只能在其他决策确定后才能提出。按轮次进行:
- 提出当前所有满足前提条件的问题,不提出任何依赖于尚未收到答案的问题。该问题等待下一轮。
- 为每个问题编号,并给出你推荐的答案,措辞需使得“是”即表示接受。
- 等待答案,然后根据答案决定下一轮可以提出哪些已解锁的问题。某个答案可能使得一个已计划的问题变得毫无意义:将其删除。
每个问题格式如下:
❓ **Q1** - **<标题>**:<问题内容>
➡️ <你的推荐答案>
事实是你的工作,决策是他们的工作。 永远不要询问你自己可以查证的事情:VoiceStudio是否在运行,有哪些语音配置文件(GET /profiles),文件夹里有什么,研究结果是什么。永远不要替他们做决策。用纯文本提问,以便他们用自己的话回答。
需要覆盖的决策,大致按此顺序:
| 轮次 | 决策 |
|---|---|
| 1 | 主题和具体角度。谁在看,他们已知什么。希望观众之后做什么。目标时长。 |
| 2 | 两位主持人:他们是谁以及他们之间的关系,例如专家和客户。语气。节目名称。是否以用户自己的声音开场。 |
| 3 | 如果以用户的声音开场:使用哪个配置文件,以及确切的词句。为设计的主持人设定口音和声音角色。 |
| 4 | 研究之后:使用哪些发现,以及任何希望排除的说法。话题列表,按顺序排列。 |
| 5 | 视觉和听觉:图片的类型,每个话题的图标,对划屏转场、嗖声和弹出效果的任何更改。视频将在哪里发布。 |
跳过请求中已回答的任何内容。如果他们说“直接做”或“你决定”,则停止提问,采用你的推荐答案,并列出它们。问题数量没有限制,但不要为了提问而提问:每个问题都必须改变视频。
最后用几行话回顾计划:主题、观众、时长、主持人、开场方式、话题列表以及行动号召。等待用户确认后再开始步骤1。 如果后续有事情重新打开一个已关闭的决策,例如研究结果削弱了原定角度,则停止并询问。
1. 检查设置
curl -s "$VOICESTUDIO_URL/profiles"应能返回响应。默认URL:http://localhost:3000。如果服务器有API密钥,则必须设置VOICESTUDIO_API_KEY。切勿将密钥写入项目文件。ffmpeg和node已在PATH中,并且HyperFrames技能已安装。
如果缺少某些组件,请停止操作并引导用户查看此技能的README。
2. 创建项目
npx hyperframes init <dir>,然后将 templates/script.example.json 复制到 <dir>/script.json。
3. 研究并编写 script.json
首先研究主题。每个统计数据都需要真实来源:将其放入该场景的 source 字段中,不要编造数字。编写自然的对话脚本,大约每分钟150个词。
| 字段 | 含义 |
|---|---|
show | 节目名称,每个场景都会显示 |
chips | 最后一个场景上的鸣谢标签 |
voices | 每个发言人一个条目。name、role、color,以及 profile_id 或 instruct 和 seed |
scenes | 按出现顺序排列。kicker、title、icon,可选的 sub 和 source。最后一个场景是片尾 |
lines | 按顺序排列的口语轮次:who、scene、text。同一场景的台词必须连续 |
icon 是一个适合该主题的 Lucide 图标名称,例如 phone-call。
要以用户自己的克隆声音开场,请添加一个包含其VoiceStudio profile_id(来自 GET /profiles)的声音,为其创建一个独立的第一个场景,并以诸如“让我们开始吧!”的交接语结束该台词。只有在获得所有者许可的情况下才能克隆声音。
在生成语音之前,向用户展示脚本。
4. 生成语音
python3 <skill>/scripts/make_voice.py
这将写入 assets/audio/ 和 assets/lines.json。音频会被缓存,因此编辑脚本后,只会生成发生更改的部分。如果用户重新克隆声音,请从 assets/audio/ 中删除其音频以使其重新生成,并首先确认配置文件的 ref_audio_path 已更改:未保存的克隆会保留旧声音。让用户在渲染之前先试听音频。
5. 添加图片、图标和音效
图片: 每个场景需要 assets/img/<scene-id>.jpg,横向,宽度至少1920,并且与前一场景的图片不同,以便每次话题变化都能看到。仅使用用户可以发布的图片,例如来自Wikimedia Commons的CC许可照片。将每张图片记录在assets/img/credits.json 中,格式为 {"<scene-id>": {"artist": "...", "license": "...", "page": "..."}}。最后一个场景会显示艺术家姓名。
图标:
npm pack [email protected] --silent && tar xzf lucide-static-0.460.0.tgz
mkdir -p assets/icons && cp package/LICENSE assets/icons/LICENSE
cp package/icons/<icon-name>.svg assets/icons/ # 每个场景的图标一次
rm -rf package lucide-static-0.460.0.tgz
音效: 运行以下命令并复制每个命令打印出的文件:
npx hyperframes media-use resolve --type sfx --intent "short whoosh transition" --project .
npx hyperframes media-use resolve --type sfx --intent "quick pop badge" --project .
mkdir -p assets/sfx
cp <whoosh路径> assets/sfx/whoosh.mp3
cp <pop路径> assets/sfx/pop.mp3
通过 chips 在最后一个场景上鸣谢任何CC BY音效。
6. 构建并检查
python3 <skill>/scripts/build.py,然后运行 npx hyperframes check。修复所有错误。然后在渲染前,运行 npx hyperframes snapshot --at <秒数> 并检查场景切换处的帧。全屏划屏转场出现在 build.py 打印出的场景开始时间。
7. 渲染
npx hyperframes render。MP4文件会生成在 renders/ 文件夹中。预计每分钟视频需要几分钟的渲染时间。
检查文件,然后告知用户你的测量结果:npx hyperframes audio <视频> --json 会显示声音是否存在以及响度是否在范围内。你可以测量声音但无法听取,因此请用户亲自试听。