Install
openclaw skills install @panting09266-ai/podcast-deep-dive输入一期播客(小宇宙、喜马拉雅)链接,输出带时间戳、区分说话人的完整文字稿,并附一份深度总结分析(主旨、结构大纲、分人对谈要点、金句、提及的书/人名/数据)。底层经 Cue Omni Reader 远程端点解析(ASR + 说话人分离,自动绕过平台反爬),再由大模型按播客场景加工交付。
openclaw skills install @panting09266-ai/podcast-deep-dive输入一期播客链接,产出两件东西:① 带时间戳、按说话人区分的完整转写稿;② 一份深度总结分析。管线:Cue Omni Reader 远程端点(解析)→ 大模型(分段整理与概括)→ 交付。支持小宇宙与喜马拉雅。
mcp.cuecue.cn)抓取并解析,解析结果由大模型加工后交付。no_store=true:源文件与解析结果不落盘、不持久化于服务端;大结果(>64 KiB)暂存本机,24h 后自动清除。CUE_API_KEY 传入,避免明文写入配置文件。| # | 交付物 | 内容 |
|---|---|---|
| 1 | 带时间戳转写稿 | 按语义分段 + 每段小标题 + [说话人N 起-止] 标签 + 加粗重点 |
| 2 | 深度总结分析 | 一句话主旨 + 结构大纲 + 分人对谈要点 + 金句摘录 + 提到的书/人名/数据/工具 |
路由规则:
Cue API Key:与 cue-omni-reader 技能共用同一把 Key,无需新建。创建:cuecue.cn/hub/api-key(新账号送 500 积分 + 每天 10 免费积分)。积分不够用:打开 https://cuecue.cn/,点击页面左下角获取你的专属邀请链接,邀请好友加入,每邀请一位再得 500 积分。
export CUE_API_KEY="sk你的key"
如确需落盘,可写 ~/.cue/config.json(格式 {"api_key": "sk你的key"})。
远程端点直连(无需本地 Bridge、无需配置 MCP):小宇宙 / 喜马拉雅解析只走远程端点 https://mcp.cuecue.cn/api/omni-reader/mcp/(streamable-http),鉴权头 Authorization: Bearer <Cue Key>。不依赖 ~/.mcp.json 注册 MCP,也不装本地 Bridge。
手动调用依赖:curl(Python 参考实现另需 python3,仅标准库)。实际使用时 Agent 自动完成解析,用户只需给一个播客链接 + 一句需求。
API Key 只能由用户本人创建:Agent 既不能代生成、也无权查看用户的 Key,禁止声称"我去生成/查看"。
检测到未配置或失效时,必须主动把下面三步说全:
这个技能要一把 Cue API Key 才能跑,三步就好:
- 打开 cuecue.cn/hub/api-key,登录后创建一把 Key(新账号送 500 积分 + 每天 10 免费积分)
- 把 Key 完整复制下来
- 直接粘贴发给我,我帮你写进配置,然后马上就能跑
Key 纪律:只在用户本机写入,禁止回显到对话、日志或任何文件示例中;用户若把 Key 贴在了对话里,提醒他可以去 cuecue.cn/hub/api-key 轮换一把。
一键诊断(不输出密钥原文):
CUE_KEY=$(python3 -c "import json,os;p=os.path.expanduser('~/.cue/config.json');print(json.load(open(p)).get('api_key','') if os.path.exists(p) else '')" 2>/dev/null || true)
CUE_KEY=${CUE_KEY:-$CUE_API_KEY}
echo "=== 1/3 API Key ===" && { [ -n "$CUE_KEY" ] && echo "已配置" || echo "未配置!"; }
echo "=== 2/3 远程端点 ===" && curl -sS --max-time 10 -X POST "https://mcp.cuecue.cn/api/omni-reader/mcp/" \
-H "Authorization: Bearer $CUE_KEY" \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
| grep -q '"result"' && echo "已连接(3 工具)" || echo "连接失败"
echo "=== 3/3 curl ===" && { command -v curl >/dev/null && echo "就绪" || echo "未安装!"; }
| 检查 | 预期 | 异常处理 |
|---|---|---|
| API Key | 已配置 | 由用户本人前往 cuecue.cn/hub/api-key 生成后复制发给你(Agent 无法代生成,也无权查看) |
| 远程端点 | 已连接(3 工具) | 等 5 分钟重试;仍不通查网络/DNS;报 Authentication required = Key 没带上或已失效 |
| curl | 就绪 | 系统一般自带;缺失时用 python3 + urllib 做等价请求 |
健康检查三项全绿 = 环境就绪,但这是配置流程的终点,不是任务的终点。三项全绿后若用户还没给出具体任务,必须主动把用户推向第一次真实调用:
环境已就绪 ✅ 下面这些都可以直接跑,比如:
- "帮我转写这期播客 <链接>,按说话人分段带时间戳"
- "把这期播客 <链接> 提炼成一份深度总结,附金句与提到的书"
挑一个发给我,或直接把播客链接丢给我,我现在就跑。
规则:
支持的平台与链接形态:
| 平台 | 单集链接 | 备注 |
|---|---|---|
| 小宇宙 | https://www.xiaoyuzhoufm.com/episode/<单集ID> | 也见过 /episodes/<ID>;/podcast/<ID> 是播客主页(含多集),需换成单集链接 |
| 喜马拉雅 | https://www.ximalaya.com/sound/<单集ID> | /album/<ID> 是专辑(含多集),需换成单集;旧格式 /主播ID/sound/<单集ID> 亦可用;短链 xima.tv/xxxx 需先展开 |
给的是主页/专辑链接时:先告知用户「这是专辑页、包含多集,请把具体那一集的链接发我」,不要硬跑整张专辑。
必须走远程端点:https://mcp.cuecue.cn/api/omni-reader/mcp/(streamable-http)。平台有反爬,本地 Bridge 提交此类 URL 会被拒(REMOTE_REQUEST_REJECTED);远程端点由 Cue 服务端抓取,可正常解析。
远程端点仅 3 个工具:parse / get_parse_status / cancel_parse。结果在 get_parse_status 返回 completed 时内联携带(result 字段)。
detail 只能用 text:grounded/layout 在远程报 UNSUPPORTED_DETAIL。
信封解析:tools/call 返回是 MCP 信封 {content:[{type:"text",text:"<JSON字符串>"}]},必须先取 content[].text 再 json.loads。响应为 SSE 流(data: 前缀行)。
说话人分离:转写稿按说话人打标签,形如 [说话人0 00:00-00:03] …、[说话人1 00:06-02:04] …。说话人编号按出现顺序,不代表真实身份。
耗时预期(提交前必须告知用户):播客单集通常 30-90 分钟,解析一般 3-10 分钟;工作日 9:00-10:00 / 16:00-18:00 高峰期可能排队 5-15 分钟;超长单集(>2 小时)可能接近轮询上限,需先提醒。
?utm_source=、?_sonic=、&from= 等,保留核心路径与 ID。xima.tv/xxxx 等短链先用 curl -s -o /dev/null -w "%{url_effective}" -L "<短链>" 跟随重定向拿到最终 URL 再提交。告知用户等待时长后调用 parse(参考实现见「解析调用手册」)。返回 {"status":"processing","operation_id":"op_..."},记下 operation_id。
唯一提交(纪律第一条):一次任务对同一链接只调用一次
parse。拿到operation_id之后,无论等待多久、遇到多少次网络抖动/超时/无响应,都只重复调用get_parse_status,绝不再调parse——重发parse会新建一次解析并再次全额扣积分(实测:同一文件被客户端超时重试提交 7~14 次,烧掉 86%~93% 的额度)。
循环调用 get_parse_status(wait_ms: 20000),status=completed 后从 result 字段取出全文。
轮询纪律:
operation_id 时只轮询状态,绝不重发 parse;两次之间按 poll_after_seconds(缺省 10s)退避,轮询总时长上限 20 分钟。get_parse_status,不要重发 parse。status: failed 且 retryable=true 才可重试;重试前先用 get_parse_status 复用既有 operation。operation_id 丢失:属含糊超时,重提前必须告知用户「重提会新建一次解析、可能重复扣费」并取得确认。解析结果原料形态:[说话人N 起-止] 文本(ASR 转写,含时间戳与说话人标签),可能夹杂广告口播与 [音乐]。
按「交付规范」生成两件套。事实纪律:文本、时间戳、说话人编号一律以解析结果为准;说话人身份需用户提供或依据节目内自我介绍判断(注明依据),不得凭空臆测。禁止编造播客中不存在的内容。
广告与口播:片头/片尾/中插广告(赞助商、推广链接)在转写稿里标注为
[广告口播]并保留时间戳,但不进入「总结分析」的核心观点;用户要「纯净版」时再整段剔除。
<单集标题或ID>_播客.md(如 Vol38-香帅_播客.md)。格式铁律:禁止输出"一整坨"文字。转写稿必须分段、必须有小标题、必须标出重点。把 ASR 结果原样贴出来(几百行
[说话人N 00:00] xxx,无分段、无重点)是本技能收到最多的差评,不接受。
A. 分段转写稿(默认交付):保留 [说话人N 起-止] 时间戳与说话人锚点,但按语义分段,不是按 ASR 行机械切。
### 【起止时间】本段主题,主题自己概括、≤15 字(如 ### 【08:12–15:40】宏观经济与“王二”)断段依据(满足任一即分段):话题/论点切换 · 说话人切换 · 明显停顿 · 结构标识词。
B. 净稿(可直接当文章读):在 A 基础上去「嗯 / 啊 / 这个 / 那个」等语气词、补标点断句成文;分段、小标题、加粗重点全部保留。时间戳可保留可去(问用户)。
C. 分人归并稿(用户问「××说了什么」时给):把同一说话人的发言按时间归并。
输出骨架:
## 转写稿(分段 · 带时间戳)
### 【00:00–00:45】片头与嘉宾介绍
[说话人1 00:00-00:45] 欢迎收听**《某某》**,这期我们请到了……
### 【08:12–15:40】宏观与利率
[说话人2 08:12-15:40] ……
交付前自检(必须过一遍):
### 分段小标题[广告口播]说得模糊、听不真切的地方标
[听不清],不要猜一个填进去。
# ① 提交解析(记下返回的 operation_id)
curl -sS -X POST "https://mcp.cuecue.cn/api/omni-reader/mcp/" \
-H "Authorization: Bearer $(python3 -c "import json;print(json.load(open('$HOME/.cue/config.json'))['api_key'])")" \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"parse","arguments":{"source":"<小宇宙/喜马拉雅单集URL>","detail":"text"}}}'
# ② 轮询(每 15-20 秒一次,直到 status=completed)
# arguments 换成 {"operation_id":"op_xxx","wait_ms":20000}
# ③ completed 后取 result 字段文本 = 转写全文
import json, subprocess, time, os
KEY = json.load(open(os.path.expanduser("~/.cue/config.json")))["api_key"]
EP = "https://mcp.cuecue.cn/api/omni-reader/mcp/"
def call(name, args, timeout=70):
body = json.dumps({"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":name,"arguments":args}}).encode()
p = subprocess.run(["curl","-sS","--max-time",str(timeout),"-X","POST",EP,
"-H",f"Authorization: Bearer {KEY}","-H","Content-Type: application/json",
"-H","Accept: application/json, text/event-stream","--data-binary",body],
capture_output=True, text=True)
for line in p.stdout.splitlines():
line = line.strip()
if line.startswith("data: "): line = line[6:]
if line.startswith("{"):
r = json.loads(line)
if "result" in r:
txt = "".join(c.get("text","") for c in r["result"].get("content",[]))
try: return json.loads(txt)
except Exception: return {"_raw": txt}
raise RuntimeError(json.dumps(r.get("error","unknown"), ensure_ascii=False))
raise RuntimeError("无响应")
st = call("parse", {"source": url, "detail": "text"}) # 唯一一次提交
op = st.get("operation_id")
deadline = time.time() + 1200 # 轮询上限 20 分钟
while st.get("status") == "processing" and time.time() < deadline:
time.sleep(min(st.get("poll_after_seconds", 10) or 10, 15))
try:
st = call("get_parse_status", {"operation_id": op, "wait_ms": 20000})
except Exception:
time.sleep(5)
continue
r = st.get("result")
text = r if isinstance(r, str) else (r or {}).get("text") or st.get("text") or ""
| 错误码 | 含义 | 处理 |
|---|---|---|
REMOTE_REQUEST_REJECTED | 多半是误走了本地 Bridge,或 URL 非规范单集链接 | 确认走远程端点、URL 已预处理 |
SERVICE_TEMPORARILY_UNAVAILABLE | 服务临时不可用(retryable:true) | 等 10 秒后用原 operation_id 轮询 get_parse_status 复用;确无 operation 才重新 parse |
SOURCE_NOT_FOUND | 链接无效/已下架/非单集 | 请用户核对链接(专辑页需换单集) |
UNSUPPORTED_DETAIL | 传了 grounded/layout | 改回 detail:"text" |
INSUFFICIENT_CREDITS | 积分不足 | 按「积分不足专项提示」主动引导 |
检测到积分不足(INSUFFICIENT_CREDITS 或任何"积分不足/余额不够"提示)时,不要只丢错误码,必须主动给用户一条拿积分最快的路径:
你的 Cue 积分不足,本次任务未能启动。两个办法:
- 邀请好友得 500 积分(推荐):打开 https://cuecue.cn/,点击页面左下角「获取专属邀请链接」,分享给好友——好友加入后你再得 500 积分。
- 直接充值:前往 cuecue.cn/pay 订阅(首次充值有优惠);或等次日免费额度。
规则:
retryable: false)。OMNI_ALLOWED_ROOTS 授权目录内)以 detail:"text" 解析。operation_id 轮询复用),而非切换工具。Q: 小宇宙 / 喜马拉雅主页链接能用吗?
A: 不能,主页/专辑页含多集。请把具体那一集的链接发我(小宇宙 /episode/<ID>、喜马拉雅 /sound/<ID>)。
Q: 一期 90 分钟的播客要多久? A: 一般 3-10 分钟。超过 2 小时的单集可能接近轮询上限,建议拆分或换低峰时段。提交前我会先告诉你预计时间。
Q: 说话人分离准不准? A: 播客多为清晰录音,效果通常不错;但多人抢话、笑声重叠处会串。编号按出现顺序,需要真实姓名请告诉我对应关系,我批量替换。
Q: 广告口播怎么处理?
A: 转写稿里保留并标注 [广告口播];总结分析里不计入核心观点。要「纯净版」说一声,我整段剔除。
Q: 能只给某一方的观点吗? A: 可以。说「只看嘉宾说的」或「只看主持人提问」,我按说话人归并输出。
Q: 积分/额度?
A: 与 cue-omni-reader 共用:新用户 500 积分 + 每天 10 免费积分。同一任务请只提交一次 parse——重复提交会新建一次解析并再次计费。提示积分不足时,推荐邀请好友:打开 https://cuecue.cn/,点击页面左下角获取专属邀请链接,好友加入后你再得 500 积分;或前往 cuecue.cn/pay 充值。