mcpField
P
podcast

podcast

github.com/marswaveai创意与媒体811.2k 次安装5 周前更新
代码仓库

关于 podcast

podcast 是一项技能,可根据主题、URL 或提供的文本,由一至两位 AI 主播生成音频节目。支持简短概述、深度分析和辩论对话,并提供节目音频与字幕。

主要功能

  1. 01输入主题、URL 或文本
  2. 02生成单人或双人节目
  3. 03支持简短、深度和辩论模式
  4. 04根据输入推断语言
  5. 05输出音频和字幕

适用场景

  1. 01将文章改编成讨论节目
  2. 02制作主题概述播客
  3. 03生成辩论形式的节目

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/marswaveai/skills --skill podcast

安装后在 Claude Code 中输入/podcast确认已加载。

附带文件references/mode-guide.md

详细介绍

适用场景

  • 用户想围绕任意主题制作一期播客
  • 用户提供 URL 或文本,并希望将其改编成播客讨论
  • 用户要求采用“辩论”“对话”或“讨论”形式
  • 用户提到“播客”“播客节目”或“录一期节目”

不适用场景

  • 用户想要文本转语音朗读(使用 /speech)
  • 用户想要制作带有视觉内容的讲解视频(使用 /explainer)
  • 用户想要生成图片(使用 /image-gen)
  • 用户只想从 URL 提取内容,不需要生成音频(使用 /content-parser)

用途

生成由 1-2 位 AI 发言者讨论某个主题的播客节目。支持快速概述、深度分析和辩论形式。输入可以是主题描述、URL,或文本。输出是包含文字稿的完整音频节目。

严格约束

  • 始终按照 shared/cli-authentication.md 检查 CLI 身份验证
  • 按照 shared/cli-patterns.md 执行命令并处理错误
  • 不要在 API 调用中硬编码发言者 ID——仅在需要回退时使用 shared/speaker-selection.md 中的内置默认值;用户想更换语音时,从 speakers API 获取
  • 不要捏造 CLI 命令或参数
  • 任何交互前,始终按照 shared/config-pattern.md 读取配置
  • 始终按照 shared/speaker-selection.md 选择发言者(文本表格 + 自由文本输入)
  • 不要将文件保存到 ~/Downloads/ 或 .listenhub/——将生成内容保存到当前工作目录,并使用易识别的主题名称(参见 shared/config-pattern.md § Artifact Naming)
每个多选步骤都必须使用 AskUserQuestion 工具——不要以纯文本形式列出选项。一次只问一个问题。等待用户回答后再进行下一步。收集完所有参数后,总结选择并请用户确认。用户明确确认前,不要调用任何生成 API。

步骤 -1:CLI 身份验证检查

按照 shared/cli-authentication.md § Auth Check 执行。如果未安装 CLI 或用户尚未登录,则自动安装并自动登录——不要让用户手动运行命令。

然后按照 shared/cli-authentication.md § Auth Mode Detection 确定 AUTH_MODE 并设置:

if [ "$AUTH_MODE" = "openapi" ]; then
  CMD_PREFIX="listenhub openapi podcast"
else
  CMD_PREFIX="listenhub podcast"
fi

后续所有 CLI 调用都使用 $CMD_PREFIX,而不是硬编码的 listenhub podcast。

步骤 0:配置设置

按照 shared/config-pattern.md 中的步骤 0(零问题启动)执行。

如果文件不存在——静默创建默认配置并继续:

mkdir -p ".listenhub/podcast"
echo '{"outputMode":"inline","language":null,"defaultMode":"quick","defaultSpeakers":{}}' > ".listenhub/podcast/config.json"
CONFIG_PATH=".listenhub/podcast/config.json"
CONFIG=$(cat "$CONFIG_PATH")

不要询问任何设置问题。 直接进入交互流程。

如果文件存在——静默读取配置并继续:

CONFIG_PATH=".listenhub/podcast/config.json"
[ ! -f "$CONFIG_PATH" ] && CONFIG_PATH="$HOME/.listenhub/podcast/config.json"
CONFIG=$(cat "$CONFIG_PATH")
设置流程(仅在用户主动要求重新配置时)

仅在用户明确要求重新配置时执行。显示当前设置:

当前配置 (podcast):
  输出方式:{inline / download / both}
  语言偏好:{zh / en / 未设置}
  默认模式:{quick / deep / debate / 未设置}
  默认主播:{speakerName(s) / 使用内置默认}

然后按顺序提出以下问题并保存:

  1. outputMode:按照 shared/output-mode.md § Setup Flow Question 执行。

  2. 语言(可选):“默认语言?”

    • “中文 (zh)”
    • “English (en)”
    • “每次手动选择” → 保留 null
  3. 模式(可选):“默认播客模式?”

    • “Quick — 简短概述”
    • “Deep — 深度分析”
    • “Debate — 辩论对话”
    • “每次手动选择” → 保留 null

收集完答案后,立即保存:

NEW_CONFIG=$(echo "$CONFIG" | jq --arg m "$OUTPUT_MODE" '. + {"outputMode": $m}')
# Save language if user chose one (not "每次手动选择")
if [ "$LANGUAGE" != "null" ]; then
  NEW_CONFIG=$(echo "$NEW_CONFIG" | jq --arg lang "$LANGUAGE" '. + {"language": $lang}')
fi
# Save mode if user chose one
if [ "$MODE" != "null" ]; then
  NEW_CONFIG=$(echo "$NEW_CONFIG" | jq --arg mode "$MODE" '. + {"defaultMode": $mode}')
fi
echo "$NEW_CONFIG" > "$CONFIG_PATH"
CONFIG=$(cat "$CONFIG_PATH")

交互流程

步骤 1:主题 + 参考资料

使用 AskUserQuestion 一次提出两个子问题,或使用单个自由文本提示,同时询问主题和可选参考资料:

你想把什么主题改编成播客?如果有参考资料(URL 或文本),也请一并提供。

接受:主题描述、URL、粘贴的文本,或以上内容的任意组合。

有效输入示例:

第 2 步:模式

默认:“quick”——跳过此问题,除非:

  • config.defaultMode 被设置为其他值 → 静默使用该值
  • 用户在第 1 步明确提到了某种模式(例如“深入探讨”“辩论”“深入分析”)→ 根据意图推断模式

只有当用户的意图不明确且未配置默认值时,才询问此问题。大多数情况下,直接使用“quick”。

第 3 步:语言

默认:匹配用户的交互语言。 根据用户在第 1 步使用的语言进行判断:

  • 如果用户用中文书写 → zh
  • 如果用户用英文书写 → en
  • 如果设置了 config.language → 使用该值

绝不询问此问题。 始终静默推断。将语言显示在确认摘要中,供用户按需更改。

第 4 步:说话人数

默认:2 位说话人(对话)——这是最常见且最吸引人的形式。

跳过此问题。辩论模式需要 2 位说话人。对于 quick/deep,也默认使用 2 位说话人。

只有当用户明确要求独白或单人形式时,才使用 1 位说话人。

第 5 步:说话人选择

遵循 shared/speaker-selection.md:

  • 如果设置了 config.defaultSpeakers.{language} → 静默使用已保存的说话人
  • 如果未设置 → 使用 shared/speaker-selection.md 中的内置默认值(不询问)
  • 在确认摘要中显示说话人,用户可以按需更改
  • 只有当用户明确要求更换声音时,才显示完整的说话人列表

对于 2 位说话人模式(对话/辩论):使用该语言的主要和次要默认说话人。

第 5.5 步:生成速度

默认:1.0x(原始速度)。绝不询问此问题。

只有当用户明确提出速度要求时才设置速度——“慢一点”、“快一点”、“1.25 倍速”、 “read it faster”、“slow it down”。否则完全省略 --speed,以保持请求的 历史行为。

  • 范围:0.5 到 2.0 之间的任意值,最多保留两位小数——这是一个连续范围, 而不是固定的几个档位。
  • 常见值:0.5、0.75、1(默认)、1.25、1.5、2。0.85 或 1.35 等 中间值同样有效。
  • 含义:生成音频的语速,而非播放器的播放速率。同一集中的所有说话人共用相同的任务级速度。
  • 对模糊表述采取保守映射:“慢一点” → 0.85,“快一点” → 1.25,“慢很多” → 0.5, “快很多” → 1.75。用户指定数值时,原样传递该数值。

只有当速度不为 1 时,才在确认摘要中显示速度。

第 6 步:确认并生成

汇总所有选项:

Ready to generate podcast:

  Topic: {topic}
  Mode: {mode}
  Language: {language}
  Speakers: {speaker name(s)}
  Speed: {speed}x        # omit this line when speed is 1
  References: {yes/no + brief description}

  Proceed?

调用任何 CLI 命令前,等待用户明确确认。用户可以在此处确认前调整任何参数。

工作流

生成
  1. 提交(后台):运行 CLI 命令,并设置 run_in_background: true 和 timeout: 360000:

    $CMD_PREFIX create \
      --query "{topic}" \
      --source-url "{url}" \
      --source-text "{text}" \
      --mode {quick|deep|debate} \
      --lang {en|zh|ja} \
      --speaker "{name}" \
      --speaker "{name2}" \
      --speed {0.5-2.0} \
      --json
    

    参数说明:

    • --query — 要讨论的主题或问题
    • --source-url — 每个 URL 引用重复指定一次
    • --source-text — 每个文本块引用重复指定一次
    • --mode — 可选 quick、deep 或 debate
    • --lang — 语言代码
    • --speaker — 可重复指定(最多 2 个);使用说话人的显示名称
    • --speaker-id — --speaker 的替代选项;使用说话人 ID,而非名称
    • --speed — 生成速度倍数,范围为 0.5–2.0(最多两位小数,默认为 1);除非用户要求更改速度,否则省略此参数
    • 如果用户未提供引用,则省略 --source-url / --source-text

    CLI 会在内部轮询,并在生成完成后返回最终结果。

  2. 告知用户任务已提交,完成后会收到通知。

  3. 收到完成通知后,呈现结果:

    解析 CLI JSON 输出,提取以下字段:audioUrl、subtitlesUrl、audioDuration、credits。

    从配置中读取 OUTPUT_MODE。按照 shared/output-mode.md 中的说明操作。

    inline 或 both:将 audioUrl 显示为可点击链接。

    呈现:

    播客已生成!
    
    在线收听:{audioUrl}
    字幕:{subtitlesUrl}(如有)
    时长:{audioDuration / 1000}s
    消耗积分:{credits}
    

    download 或 both:同时下载文件。按照 shared/config-pattern.md § Artifact Naming 生成主题 slug。

    SLUG="{topic-slug}"  # e.g. "ai-developments"
    NAME="${SLUG}-podcast.mp3"
    # Dedup: if file exists, append -2, -3, etc.
    BASE="${NAME%.*}"; EXT="${NAME##*.}"; i=2
    while [ -e "$NAME" ]; do NAME="${BASE}-${i}.${EXT}"; i=$((i+1)); done
    curl -sS -o "$NAME" "{audioUrl}"
    

    呈现:

    已保存到当前目录:
      {NAME}
    
  4. 提供查看转录文本或按需获取下载 URL 的选项

成功生成后

根据本次会话中的选择更新配置:

NEW_CONFIG=$(echo "$CONFIG" | jq \
  --arg lang "{language}" \
  --arg mode "{mode}" \
  --argjson speakers '{"{language}": ["{speakerId}"]}' \
  '. + {"language": $lang, "defaultMode": $mode, "defaultSpeakers": (.defaultSpeakers + $speakers)}')
echo "$NEW_CONFIG" > "$CONFIG_PATH"

API 参考

  • 说话人列表:shared/cli-speakers.md
  • 说话人选择指南:shared/speaker-selection.md
  • CLI 模式:shared/cli-patterns.md
  • CLI 身份验证:shared/cli-authentication.md
  • 配置模式:shared/config-pattern.md

可组合性

  • 调用:speakers API(用于选择说话人)
  • 由以下内容调用:content-planner(阶段 3)

示例

用户:“制作一期关于最新 AI 发展的播客”

Agent 工作流:

  1. 检测:播客请求,主题 = “最新 AI 发展”,无引用
  2. 推断:模式 = quick(默认),语言 = en(用户使用英语),2 位说话人(默认)
  3. 显示确认摘要 → 用户确认
$CMD_PREFIX create \
  --query "The latest AI developments" \
  --mode deep \
  --lang en \
  --speaker "Mars" \
  --speaker "Mia" \
  --json

等待 CLI 返回结果,然后呈现标题和收听链接。

评论

支持 Markdown