ai-news-podcast
已认证
AI
v1.0.0 · 小杨
📥 下载 493 次
📦 370.1KB
📅 2026-05-25
AI科技早报 Podcast 技能
将抖音AI新闻视频,变成你自己的语音播报,每天自动推送。
目录
系统架构
┌─────────────────────────────────────────────────────────┐
│ 抖音站(数据源) │
│ 大脚AI ──→ 每日发布AI新闻短视频(合集:每日必知AI圈) │
└──────────────────────┬──────────────────────────────────┘
│ opencli browser + douyin.js
▼
┌─────────────────────────────────────────────────────────┐
│ 03:00 — collect.js(采集调度) │
│ 1. 读取 sources/sources.json 作者列表 │
│ 2. 逐个调用作者模块(浏览器→下载→Whisper转写) │
│ 3. 汇总原始文案 → cache/raw-transcript.json │
└──────────────────────┬──────────────────────────────────┘
│ LLM 重写
▼
┌─────────────────────────────────────────────────────────┐
│ 03:00 — produce cron(AI重写) │
│ 1. 读取 raw-transcript.json │
│ 2. LLM 以口语化风格重写为播报稿 │
│ 3. 写入 cache/script.txt │
│ 4. 调用 produce-audio.js → TTS + 背景音乐 │
└──────────────────────┬──────────────────────────────────┘
│ 音频文件
▼
┌─────────────────────────────────────────────────────────┐
│ 06:00 — review cron(审核+发送) │
│ 1. 审核 script.txt 日期和内容 │
│ 2. 去重检查 │
│ 3. 调用 send.js → 复制到QQ媒体目录 │
│ 4. message 工具 → 发送到QQ │
└─────────────────────────────────────────────────────────┘
文件结构
skills/ai-news-podcast/
├── SKILL.md ← 本文件(操作手册 + 扩展指南)
├── collect.js ← 采集调度入口(03:00自动调用)
├── produce-audio.js ← 音频制作(TTS分块合成+背景音乐)
├── send.js ← 发送到QQ(复制音频到媒体目录)
│
├── sources/ ← ★ 作者采集模块目录(扩展入口)
│ ├── sources.json ← 作者配置清单(enabled开关)
│ └── dajiao-ai.js ← 大脚AI采集模块
│ (新增作者时:sources.json + 新 .js 文件)
│
├── cache/ ← 运行时缓存
│ ├── raw-transcript.json ← 原始转写文案汇总
│ ├── script.txt ← LLM重写后的播报稿
│ ├── 早报最终音频.mp3 ← 最终成品音频
│ ├── news-reported.json ← 已播报记录(去重用)
│ └── ...其他临时文件
│
└── prompts/ ← AI prompt 模板
├── produce.txt ← 重写播报稿
└── send.txt ← 审核发送
每日流程
时间线
| 时间 | 任务 | 说明 |
|---|---|---|
| 03:00 | collect.js + produce cron | 采集抖音 → 转写 → LLM重写 → 合成音频 |
| 06:00 | review cron | 审核文稿 → 发送到QQ |
第1步:采集(collect.js)
由 news-daily-produce cron 触发,Agent 先执行:
node skills/ai-news-podcast/collect.js
collect.js 内部:
- 读取
sources/sources.json,筛选enabled: true的作者 - 对每个作者,调用
sources/xxx.js的module.exports.collect(source)方法 - 每个 author module 负责:浏览器打开主页 → 找最新视频 → 下载 → Whisper 转写 → 返回文案
- 汇总结果 → 写入
cache/raw-transcript.json
第2步:LLM重写(produce cron 的 AI 部分)
Agent 读取 cache/raw-transcript.json,按 prompts/produce.txt 模板,
将原始转写文案改写成口语化的播报稿,写入 cache/script.txt。
第3步:音频制作
执行 produce-audio.js:
- 读取
cache/script.txt - 分块并发调用 edge-tts(zh-CN-XiaoxiaoNeural, +10%速率, +50%音量)
- 合并语音块
- 混入背景音乐(assets/早报背景音乐.mp3, 音量15%, 淡入/淡出5秒)
- 输出
cache/早报最终音频.mp3
第4步:审核发送(06:00 review cron)
Agent 审核 cache/script.txt:
- 日期正确性
- 去重对比
cache/news-reported.json - 确认无误 → 执行
send.js→ message 工具发送到QQ
使用方法
手动测试采集
node skills/ai-news-podcast/collect.js
手动测试音频制作
# 先确保 cache/script.txt 已存在
node skills/ai-news-podcast/produce-audio.js
手动测试发送
node skills/ai-news-podcast/send.js
扩展指南 — 新增抖音作者
当张总发来一个抖音视频链接说"把这个作者加进来",按以下步骤操作。
快速步骤
- 打开作者的抖音视频链接,获取
sec_uid(抖音用户唯一ID) - 编辑
sources/sources.json,添加一条新记录 - 在
sources/下新建一个采集模块(复制dajiao-ai.js修改) - 重启 Gateway 使 cron 配置生效
详细说明
#### 步骤1:获取 sec_uid
方法A — 用 opencli browser 打开视频页面:
opencli browser --session dy-find open "视频链接"
opencli browser --session dy-find state
# 在 state 输出中找类似 /user/MS4wLjABAAAA... 的链接
opencli browser --session dy-find close
方法B — 用 douyin.js info 获取视频详情(部分版本会返回作者信息):
node skills/zc-douyin-xiazai-txt-1.0.0/douyin.js info "视频链接"
方法C — 直接打开抖音网页版,进入作者主页,从URL中提取 sec_uid。
URL格式:https://www.douyin.com/user/{sec_uid}
#### 步骤2:编辑 sources.json
[
// ... 已有作者
{
"id": "ai-xiao-zhang", // 作者唯一ID(英文,不要空格)
"name": "AI小张", // 作者显示名称
"enabled": true, // true=启用,false=暂时关闭
"module": "ai-xiao-zhang.js", // 对应的采集模块文件名
"config": {
"sec_uid": "填入从步骤1获取的sec_uid",
"collection_keyword": "合集关键词(可选)",
"video_count": 1 // 采集最新几条(默认1)
}
}
]
#### 步骤3:创建采集模块
- 复制
sources/dajiao-ai.js为sources/ai-xiao-zhang.js - 修改
collect函数中的页面解析逻辑 - 关键要点:
- 模块必须导出
{ collect }函数 collect(source)接收 sources.json 中该作者的配置对象- 返回
{ videoTitle, videoUrl, transcript } transcript是转写后的文案文本
示例采集模块骨架:
/**
* ai-xiao-zhang.js — 作者采集模块
* ==============================
*
* 【新增作者模板】
* 复制自 dajiao-ai.js,修改以下内容:
* 1. 页面打开逻辑(如果主页结构不同)
* 2. 视频定位方式(合集/时间线/置顶)
*
* 必须导出:{ collect }
* collect(source) 返回:{ videoTitle, videoUrl, transcript }
*/
const { execSync } = require('child_process');
const path = require('path');
async function collect(source) {
const config = source.config || {};
const secUid = config.sec_uid;
// ... 你的采集逻辑
return { videoTitle, videoUrl, transcript };
}
module.exports = { collect };
#### 步骤4:重启 Gateway
openclaw gateway restart
故障排查
采集失败(collect.js 报错)
| 错误 | 常见原因 | 解决方法 |
|---|---|---|
opencli browser 超时 | Chrome 未连接 / 浏览器桥断开 | 运行 opencli doctor 检查 |
| 找不到视频 | 页面结构变了 | 手动打开主页看看是不是改版了 |
| Whisper 转写失败 | whisper 未安装 | pip install -U openai-whisper |
| douyin.js extract 超时 | 视频太长 / 网络慢 | 检查网络,或单独运行 extract |
音频制作失败
| 错误 | 常见原因 | 解决方法 |
|---|---|---|
| edge-tts 导入失败 | node-edge-tts 未安装 | cd skills/edge-tts/scripts && npm install |
| ffmpeg 找不到 | 未安装或不在 PATH | 检查 ffmpeg -version |
| 背景音乐找不到 | assets/ 下缺失 | 检查 assets/早报背景音乐.mp3 |
发送失败
| 错误 | 原因 | 解决 |
|---|---|---|
| 音频文件不存在 | produce cron 未成功 | 检查 cache/早报最终音频.mp3 |
| QQ消息发送失败 | 媒体目录问题 | 检查 .openclaw/media/qqbot/downloads |
Cron 配置
涉及的 cron 任务
| cron ID | 时间 | 功能 |
|---|---|---|
news-daily-produce | 03:00 | 采集 + 重写 + 音频合成 |
news-daily-review | 06:00 | 审核 + 发送到QQ |
旧任务(已禁用)
以下 cron 任务已被此技能替代,不应重新启用:
news-collect-intl(已禁用)news-collect-cnai(已禁用)news-collect-tech(已禁用)news-collect-fallback(已禁用)news-merge(已禁用)news-gatekeep(已禁用)news-daily-send(已禁用)
⚠️ 如果需要恢复旧的数据源(不再用抖音),才考虑重新启用。
一般情况下请保持禁用状态。
依赖清单
| 依赖 | 作用 | 安装检查 |
|---|---|---|
| Node.js | 运行所有脚本 | node --version |
| ffmpeg | 音频处理、混音 | ffmpeg -version |
| opencli | 浏览器自动化接口 | opencli doctor |
| Whisper (openai) | 语音转文字 | whisper --version |
| zc-douyin-xiazai-txt | 抖音视频下载 | 技能已安装 |
| edge-tts | 文字转语音 | skills/edge-tts/scripts/ |
更新日志
| 日期 | 变更 |
|---|---|
| 2026-05-20 | 初始版本。首版作者:大脚AI |
| 2026-XX-XX | 后续扩展在此记录 |
💡 安装方法
下载 ZIP 解压到 skills/ 目录即可使用