文章转播客
把一篇现成文章变成一期能听的 AI 播客,并顺手处理掉版权风险。
你的工作方式
按 4 个阶段顺序推进,每阶段有明确产出物:
- 获取源内容 → 得到 Markdown 全文
- 整理与合规改造 → 得到一份"观点为主、原文为例"的播客素材
- 生成播客 → 得到音频文件
- 交付 → 把音频交给用户
涉及两个确认门:参数确认(人数/音色/风格)与 版权改造确认(源为他人作品时)。
阶段 0:确认要素
开工前先确认(能从上文推断的就别问):
| 要素 | 默认 |
|---|---|
| 播客人数 | 双人对谈 |
| 音色 | 双人:明快·元气满满 + 醇厚·稳重低沉;单人:明快·元气满满 |
| 风格 | 自然对谈;用户可要求"犀利泼辣""温柔科普"等 |
| 素材来源 | 用户指定的那篇(链接/文件/笔记) |
用户说"默认""你决定""直接生成"时,立即用默认配置,不再追问。确认音色时只描述风格(如"明快·元气满满"),不要报人名。
阶段 1:获取源内容
按来源选择方法:
| 来源 | 方法 |
|---|---|
| X / Twitter 长文 | 运行 scripts/fetch_x_article.py <推文URL> <输出.md>(见下) |
| 其他网页 URL | fetch 工具,question 写明要提取全文 |
| 本地文件 | Read(文本)或 WebFetch(PDF/图片等) |
| 笔记 / 知识库 | WebFetch(note_id / media_id) |
X 长文的坑(务必走脚本)
X 长文(Article)正文藏在 tweet.article.content.blocks,爬页面拿不到。脚本已处理以下易错点:
- 实体映射键类型不一致:entityMap 的键是字符串,而 atomic 块 entityRanges 的键是整数,必须统一转 str 再匹配,否则图片全变成占位符。
- 图片 URL 需算法还原:JSON 里只有数字 mediaId,还原公式为 media_key = base64((mediaId << 24).to_bytes(11,'big')).decode().rstrip('='),URL = https://pbs.twimg.com/media/{media_key}?format=jpg&name=large。
- 加粗:取自 inlineStyleRanges 中 style == "Bold" 的区间。
- 脚本会自动提取标题、作者、发布时间、原文链接,并渲染标题层级、列表、引用、图片。
阶段 2:整理素材 + 版权安全改造
目标
形成一份能支撑播客的内容:有明确主题、核心论点、可展开的细节与角度。不要只堆关键词。
版权安全改造(源为他人作品时——关键步骤)
默认按"观点为主、原文为例"组织,降低侵权风险。详见 references/copyright-guidelines.md,核心原则:
- 观点做主体:整期以讲述者/对话者的判断、分析、延伸为主线。
- 原文只作"案例":用"我最近看到一个案例""有人做过这样一件事"的方式概括转述,点到为止。
- 不复述、不整段搬运:不照抄原句、不逐段改写;引用的是事实梗概,不是表达。
- 标注区分:素材中用【观点】/【案例】标出哪些是原创判断、哪些是引来的例子。
- 结尾声明来源:明确"案例不属于我,观点才是我要给的"。
若源是用户自己的原创内容,无版权顾虑,可自由整理使用。
产出
写一份素材 .md 文件(如 ./podcast_material.md),第一行作标题。素材质量自检:主题是否明确、是否有足够事实与观点支撑、是否能区分"素材事实"与"合理推断"。
阶段 3:生成播客
- 上传素材到 COS 拿 cosKey:
bash 文件上传工具 -f <素材文件路径> - 调用生成脚本(凭证由运行环境自动注入,无需任何手动配置):
bash python3 <skill_dir>/scripts/generate_podcast.py --cos-key <cosKey> \ --question "<风格与要求>" --people 2 --voice 小棠 小昊 --out ./podcast_response.json
---people:1 或 2(不支持三人及以上)
---voice:可选 小棠 / 小昊 / 思思 / 明宇 / 小雨 / 子言;单人写小棠,双人写小棠 小昊
---question写清风格、口径、结构要求(上限 4 KiB) - 生成脚本会把完整响应保存为 JSON;从中取
preview_url、media_id、title,运行scripts/download_podcast.py <响应JSON文件>下载音频并生成.metadata。 - 把音频重命名为
<title>.wav,对应的.metadata同步改名(保持在同目录,供交付时读取)。
素材变化规则:同素材改风格/音色/人数/措辞 → 复用原 cosKey;素材内容变了 → 回阶段 2 重写并重新上传。
阶段 4:交付
把音频文件交给用户,回复说明:标题、形式(单人/双人)、时长。时长必须读取音频真实时长(如用 Python wave 模块),禁止估算或编造。
关键约束
- 播客时长不可控,由素材量和模型决定,不要承诺时长。
question≤ 4 KiB,report_content≤ 2 MiB,超限先精简素材。- 单次生成通常耗时几分钟,
--max-time给足(如 1800 秒)。 - 源内容无法解析时,说明原因并建议更换来源,不要硬编造内容。
- 涉及他人作品、且用户计划公开传播或商业化时,提醒"取得原作者授权仍是最稳妥的做法"。
示例
示例 1:X 长文 → 播客(他人作品,需改造)
用户:"https://x.com/xxx/status/123,做成播客,要犀利一点"
→ 运行 fetch_x_article.py 拿到全文 → 按"观点为主、原文为例"写素材(标【观点】/【案例】)→ 确认人数/风格(默认双人对谈)→ 上传 COS → 生成 → 下载 → 交付文件,并提示公开传播需授权。
示例 2:自有公众号文章 → 播客
用户:"把我这篇公众号文章《XXX》转成播客"
→ fetch 文章 → 源为自有,无版权顾虑,直接组织成素材 → 生成音频 → 交付。
→ 若用户追加"再泼辣些",素材未变,复用原 cosKey 重新生成即可(风格/音色/人数变化都复用)。
参考
references/copyright-guidelines.md:版权判定要点、法条、判例与安全清单(涉及他人作品时必读)scripts/fetch_x_article.py:抓取并渲染 X 帖子/长文为 Markdownscripts/generate_podcast.py:调用平台播客生成接口(凭证由运行环境自动注入)scripts/download_podcast.py:下载播客音频并生成.metadata
平台适配说明
本技能的「生成播客」环节调用开放平台音频生成接口(/openapi/agent_podcast/v1/generate),需要运行环境提供 IMA_OPENAPI_CLIENTID 与 IMA_OPENAPI_APIKEY 两个环境变量。
- 已配置:全流程可直接执行。
- 未配置:抓原文、整理素材、版权改造三步照常可用;到生成音频这步会返回 401/403。此时直接告诉用户「播客生成需要先配置音频生成凭证」,不要反复重试,也不要把接口报错原文贴给用户。
> 若希望脱离该凭证独立运行,需要把 scripts/generate_podcast.py 换成通用 TTS + LLM 的组合实现。
运行环境
- 脚本:
scripts/download_podcast.py、scripts/fetch_x_article.py、scripts/generate_podcast.py(相对技能根目录) - Python:3.9+,脚本只用标准库,不需要 pip 安装任何包
- 外部命令:无